资讯详情

资讯详情

Roundcube Managesieve 插件实战:Sieve 过滤规则与 Vacation 自动回复完整指南

即时通讯后端前端【免费下载链接】roundcubemailThe Roundcube Webmail suite项目地址https://gitcode.com/gh_mirrors/ro/roundcubemail点击查看免费下载本指南以 Roundcube 内置的 managesieve 插件的用户手册settings-filters.rst为主线讲解如何通过 Web 界面定义与组织 Sieve 邮件过滤规则、管理过滤器集合以及配置 Vacation 自动回复settings-vacation.rst并结合插件源码managesieve.php、rcube_sieve_engine.php与配置模板config.inc.php.dist深入解析其底层实现与关键配置项帮助读者既会用也懂理。一、过滤功能概览服务器端自动处理入站邮件在 Roundcube 中managesieve插件为邮件用户提供了一套可视化、可点击的 Sieve 过滤器管理界面让用户无需了解 Sieve 脚本语言即可让服务器对入站邮件自动进行处理与归类。其核心工作方式是过滤器底层以 Sieve 脚本的形式存储在邮件服务器上过滤语言遵循 RFC 5228Sieve: An Email Filtering Language。界面UI负责将用户在表单中定义的规则与动作翻译为合法的 Sieve 脚本再通过 managesieve 协议默认端口 4190写入服务器。这意味着过滤在服务器端执行与客户端是否在线无关同一个界面既可以定义规则也可以直接查看、编辑、导入、导出 Sieve 脚本RAW 编辑器用户可以做到把规则告诉服务器而不必掌握任何脚本语法。从插件源码看managesieve.php 将自身注册到 Roundcube 的settings、mail与cli三个任务中在settings任务中向设置界面注入 Filters / Vacation / Forward 三个入口settings_actions()方法在mail任务中注入 Create filter 快捷菜单允许从当前打开的邮件一键提取头部信息创建新过滤规则mail_task_handler()与parse_headers()方法在cli任务中提供 managesieve 连接的健康检查health_check()方法。而真正负责与 Sieve 服务器通信的引擎则位于 lib/Roundcube/rcube_sieve_engine.php其中start()方法完成连接、列出脚本、加载当前或指定的激活脚本等初始化工作。二、过滤器集合Filter Sets分组、激活与迁移过滤器定义可以被分组为集合Sets在界面上每个集合对应服务器上的一个 Sieve 脚本文件。2.1 集合的激活与数量限制集合可以被激活active或停用deactivated。取决于服务器配置同一时间可以存在零个、一个或多个处于激活状态的集合因此集合名称必须唯一因为它们在服务器上对应唯一的脚本文件名多个集合可同时激活实现分脚本管理不同场景的效果停用集合不会删除脚本只是不再生效。从引擎源码rcube_sieve_engine.php 的activate_script()/deactivate_script()可以看出激活本质上是在 managesieve 服务器上执行脚本激活操作并将当前激活集合列表记录在会话与 UI 环境中。2.2 集合的创建、复制、导入与导出新建集合有三种来源创建为空集合从零开始定义规则复制已有集合以某个现有集合为模板克隆一份在源码中通过$this-sieve-copy($name, ...)实现见 rcube_sieve_engine.php从文本文件导入上传包含 Sieve 脚本的文本文件。源码在导入时会先通过load_script($file)进行语法预检查再保存为新脚本避免把非法脚本直接写入服务器。集合还支持下载setget动作download_set可用时下载内容即该集合对应的 Sieve 脚本文本可用于备份或迁移到其他服务器。关于集合名称源码有明确的合法性校验逻辑rcube_sieve_engine.php名称不能为空且长度不超过 128 字符不能与managesieve_filename_exceptions配置的保留名称冲突开启managesieve_kolab_master时MASTER、USER、MANAGEMENT为保留名名称不能与现有集合重复重复会提示setexist。管理员还可以通过managesieve_disabled_actions配置禁用 UI 上的部分集合操作如list_sets、enable_disable_set、delete_set、new_set、download_set等详见下文配置详解。三、过滤器定义启用状态、执行顺序与规则/动作3.1 启用 / 停用每一个过滤器都可以单独处于 active启用或 inactive停用状态。停用某个过滤器不会删除它只是暂时跳过其处理适合在不需要某些动作时例如临时停用转发规则快速关掉而不丢失定义。引擎中的act动作实现了这一能力读取规则当前的disabled标志并取反然后通过update_rule()更新脚本并保存rcube_sieve_engine.php。3.2 执行顺序与拖拽排序Sieve 脚本中的规则按从上到下的顺序依次执行。列表中最靠前的规则先被评估因此规则的排列顺序直接决定过滤行为。界面上支持**拖拽drag-and-drop**来重新排列规则顺序对应的底层实现是move动作从数组中移除指定索引的规则再插入到目标位置最后整体保存脚本rcube_sieve_engine.php。典型的使用场景把发件人属于特定群组 → 移入群组文件夹这类精确规则放在前面把新闻简报 → 移入 Newsletter 文件夹这类宽泛规则放在后面最后用所有邮件 → 保留在收件箱兜底。3.3 规则Tests与动作Actions每个过滤器定义至少包含一条规则test和一条动作action。规则部分取决于服务器支持的 Sieve 扩展managesieve_disabled_extensions可禁用指定扩展常见的规则类型包括邮件头header按Subject、From、To、Cc等头部匹配支持contains、is、matches、regex、exists等比较方式正文body匹配邮件正文内容日期currentdate / date按当前日期或邮件头中的日期匹配需要服务器支持date扩展大小size按邮件大小匹配如大于 1MSpam 检测spamtest / spamtestplus按垃圾邮件评分匹配需要服务器支持对应扩展重复检测duplicate按消息 ID 等去重避免重复处理。从 rcube_sieve_engine.php 的表单解析逻辑可以看到界面上将这些测试统一翻译为test、type、arg1、arg2等内部结构最终由 rcube_sieve_script.php 序列化为 Sieve 语法。多条规则之间可组合界面提供 allof全部满足 / anyof任一满足 连接符对应的表单字段为_join源码中$this-form[join] $join allof;。动作部分同样取决于服务器能力大多数服务器支持动作说明底层 Sieve 关键字移动到指定文件夹将邮件移入某个邮件夹fileinto复制到指定文件夹复制一份到某邮件夹需copy扩展fileinto :copy重定向到另一个账户把邮件转发给其他邮箱redirect复制到另一个账户转发的同时保留原件需copy扩展redirect :copy丢弃并附带错误信息静默丢弃可携带说明需ereject/reject扩展discard/ereject/reject自动回复Vacation发送自动回复vacation删除忽略邮件相当于丢弃discard设置标记例如标记为已读需imap4flags扩展addflag停止评估立即停止后续规则处理stop保留在收件箱邮件保留在收件箱什么都不做keep3.4 关于停止评估与保留在收件箱的注意事项手册特别提醒有些动作会终止过滤流程有些不会。例如fileinto移入文件夹之后邮件默认会被隐式 keep逻辑处理除非随后显式执行stop而discard丢弃通常意味着处理结束。因此界面提供Stop evaluating rules停止评估规则与Keep message in Inbox保留在收件箱两个动作用于精确控制过滤链的走向在需要命中即终局的规则后追加stop避免后续规则再对同一封邮件执行动作在需要仅做标记/转发但保留原件的场景使用keep让邮件留在收件箱。从引擎动作表单的默认值也可以看到这一设计从邮件上下文创建过滤器时表单会预填fileintostop作为默认动作组合rcube_sieve_engine.php即移入文件夹后停止处理这一最常用语义。四、Vacation 自动回复独立管理界面与核心参数Vacation自动回复是过滤功能的一部分用于在用户长时间离开时向写信人发送我不在、暂无法及时回复的通知。其底层同样是一条 Sieve 脚本中的vacation规则但 managesieve 插件为其提供了独立的、更简单的管理界面plugin.managesieve-vacation。开启独立的 Vacation 设置页需要配置managesieve_vacation见 config.inc.php.dist0不显示独立的 Vacation 区块默认1添加 Vacation 区块2添加 Vacation 区块同时隐藏 Filters 区块只提供 Vacation 功能。同样地managesieve_forward控制独立的转发设置页。界面的注册逻辑见 managesieve.php 的settings_actions()只有vacation_mode 0时才注册 Vacation 入口只有forward_mode 0时才注册 Forward 入口。Vacation 的底层引擎是 rcube_sieve_vacation.php它继承自rcube_sieve_engine负责在多个脚本中定位第一条vacation 规则、渲染独立表单vacation_form()、处理表单提交vacation_post()并提供面向 API 调用的get_vacation()/set_vacation()。4.1 启用自动回复的最基本要求要启用自动回复只需两件事填写回复正文Body将**状态Status**切换为On。源码在保存时强制校验如果正文为空会报错managesieve.emptyvacationbodyrcube_sieve_vacation.php状态为off时规则被写入disabled标志$rule[disabled] $status off;即规则仍存在于脚本中但处于停用状态。4.2 回复消息设置字段说明默认行为Subject主题回复邮件的主题可选。默认回复主题为Auto: 原始主题Body正文回复正文即缺勤原因等要发送给来信者的文字必填Vacation start / end自动回复规则的生效起止时间可选Status规则启用开关需要设置为 On 才生效对于固定使用同一份回复正文的用户手册建议不需要时把规则关闭Off需要时再打开On而不必反复改写正文。关于起止时间Vacation start/end的底层实现若服务器支持date扩展起止时间会被翻译为currentdate测试value-ge/value-le可选iso8601与zone参数由get_currentdate_test()生成若服务器不支持date但支持regex扩展则退化为基于Received头部的正则表达式日期区间测试build_regexp_tests()/parse_regexp_tests()。测试用例 ManagesieveVacationTest.php 对这两个退化路径做了验证例如区间2014-02-20至2014-03-05会被拆成两条正则测试(20|21|...|28) Feb 2014与([ 0]1|...) Mar 2014且反向区间结束早于开始会返回managesieve.invaliddateformat错误。4.3 高级设置Reply sender address回复发件人地址指定 vacation 回复邮件使用的发件人地址对应 Sieve 的:from参数。源码中按 RFC 5230 要求校验其必须是合法的 mailbox-list并且只允许一个地址注释说明至少在 Cyrus IMAP 上如此多地址会被拒绝。My email addresses我的邮件地址通常情况下只有当入站邮件的收件地址是服务器已知的你的地址之一时才会触发自动回复。在这里可以添加更多地址对应 Sieve:addresses参数。源码会逐条trim()并用rcube_utils::check_email()校验格式。管理员可以通过managesieve_vacation_addresses_init true让插件在首次创建表单时自动填入当前用户的所有邮箱别名见 config.inc.php.dist。Reply interval回复间隔定义对同一发件人重复回复的频率。当短时间内收到同一发件人的大量邮件时通常不需要逐一回复。默认情况下同一发件人每天只收到一次回复对应 Sieve:days参数。管理员可通过managesieve_vacation_interval预设默认间隔以天为单位如7若服务器支持vacation-seconds扩展还可以字符串形式指定秒数如3600s此时界面也会多出天 / 秒的单位选择器见 rcube_sieve_vacation.php。Incoming message action入站邮件动作定义对触发回复的那封入站邮件本身执行什么动作保留keep邮件留在收件箱默认丢弃discard不保留该邮件重定向 / 复制到另一账户redirect / copy转发给其他人处理例如转给同事代收。源码中该动作被解析为 vacation 规则之后的第二动作discard写入discardredirect/copy写入带:copy标志与目标地址的redirectrcube_sieve_vacation.php。若配置了managesieve_domains限定转发目标域名列表界面会强制用户从下拉框中选择目标域名避免把邮件转发到任意外部域。4.4 保存、定位与 API保存 Vacation 时插件会在当前脚本中定位第一条 vacation 规则并就地更新若脚本中尚不存在则新建一条名为 Vacation 的规则并合并进脚本merge_rule()。如果当前脚本有多个规则界面还允许通过 After 下拉框选择该规则插入到哪条规则之后vacation_after字段。此外get_vacation()与set_vacation()提供了编程接口返回/接收结构化数据enabled、message、subject、interval、start、end、addresses、from、action、target等供其他插件或集成代码读写 Vacation 规则。五、插件的关键配置项详解以下配置均位于 plugins/managesieve/config.inc.php.dist将文件复制为config.inc.php并按需修改即可。以下是直接影响过滤与 Vacation 功能的核心参数5.1 服务器连接// Managesieve 服务器主机与可选端口默认 localhost // 支持替换变量%h用户 IMAP 主机、%nHTTP 主机名、%d域名HTTP 主机名去掉首段 // 端口省略时自动通过 getservbyname() 查询回退到 4190 // tls:// 前缀启用显式 STARTTLSssl:// 启用隐式 SSL // 也可配置为按主机映射的数组如 [example.com sieve.example.net] $config[managesieve_host] localhost; // 认证方式CRAM-MD5、DIGEST-MD5、PLAIN、LOGIN、EXTERNAL 或 none // 可选默认自动选择服务器支持的最佳方式 $config[managesieve_auth_type] null; // 授权代理以其他身份认证、代表登录用户操作仅 PLAIN / DIGEST-MD5 有效 $config[managesieve_auth_cid] null; $config[managesieve_auth_pw] null; // 连接 socket 上下文选项如 SSL 证书校验可按主机名分别配置 $config[managesieve_conn_options] null; // 默认脚本内容文件例如全局垃圾邮件过滤脚本 $config[managesieve_default] /etc/dovecot/sieve/global; // 当用户没有自己的脚本时使用的脚本名 $config[managesieve_script_name] roundcube; // 调试开启后把与 Sieve 服务器的会话记录到 log_dir/sieve $config[managesieve_debug] false;5.2 功能开关// 是否显示独立的 Vacation 管理页 // 0 - 不显示默认1 - 添加 Vacation 区块2 - 添加但隐藏 Filters 区块 $config[managesieve_vacation] 0; // 是否显示独立的转发Forward管理页取值同上 $config[managesieve_forward] 0; // Vacation 默认回复间隔天 // 服务器支持 vacation-seconds 时可用字符串指定秒数如 3600s $config[managesieve_vacation_interval] 0; // 首次创建 Vacation 表单时自动填充全部用户地址别名 $config[managesieve_vacation_addresses_init] false; // 首次创建 Vacation 表单时自动用主身份邮箱填充 :from $config[managesieve_vacation_from_init] false; // 是否启用脚本 RAW 编辑器直接编辑 Sieve 文本 $config[managesieve_raw_editor] true; // 可禁用的 UI 动作list_sets、enable_disable_set、delete_set、new_set、 // download_set、new_filter、delete_filter、redirect 等 // 例如禁用 list_sets 会移除过滤器集合部件固定使用 managesieve_script_name 指定的脚本 $config[managesieve_disabled_actions] [];5.3 行为与兼容性// 禁用的 Sieve 扩展body、copy、date、editheader、envelope、ereject、 // fileinto、ihave、imap4flags、regex、reject、relational、spamtest、 // vacation、variables 等注意并非所有扩展都已实现 $config[managesieve_disabled_extensions] []; // 邮箱名编码Sieve RFC 要求 UTF-8但部分实现只支持 UTF7-IMAP $config[managesieve_mbox_encoding] UTF-8; // 启用 Kolab KEP:14 特性多活动脚本等 $config[managesieve_kolab_master] false; // 脚本文件扩展名Dovecot 用 .sieveCyrus 用 .siv $config[managesieve_filename_extension] .sieve; // 保留脚本名不含扩展名列表中不展示给用户 $config[managesieve_filename_exceptions] []; // 重定向动作的目标域名白名单非空时用户必须从列表中选择域名 $config[managesieve_domains] []; // 头部选择器默认条目 $config[managesieve_default_headers] [Subject, From, To]; // 仅对指定主机启用 managesieve未设置时允许所有主机 // $config[managesieve_allowed_hosts] [host1.mydomain.com]; $config[managesieve_allowed_hosts] null;其中managesieve_allowed_hosts在插件初始化阶段managesieve.php被检查若当前会话的存储主机不在白名单内插件直接不加载。六、底层原理从表单到 Sieve 脚本的完整链路综合前文一次新建过滤规则并保存的完整调用链如下用户在 managesieve.html 渲染的过滤列表中点击新建表单在内容框架filter-box中加载表单提交到plugin.managesieve-save动作由 managesieve.php 的managesieve_save()分发到引擎的save()引擎start()建立 managesieve 连接rcube_sieve_engine.php读取managesieve_host等配置实例化 rcube_sieve.php 完成协议层通信save()解析_header、_rule_op、_action_type等表单数组逐项校验空值、非法字符、日期格式、邮箱格式等组装为内部规则/动作结构通过 rcube_sieve_script.php 将内部结构渲染为 Sieve 脚本文本调用save_script()写回服务器界面刷新规则列表显示已保存确认消息。Vacation 的链路与之类似但走plugin.managesieve-vacation动作与 rcube_sieve_vacation.php 引擎先load_script()在活动脚本中查找既有 vacation 规则找不到则继续在 include 的脚本与其余脚本中查找再由vacation_form()渲染 vacation.html 中的表单最后由vacation_post()校验并保存。值得注意的工程细节从邮件界面一键建过滤规则时插件会解析当前邮件的Subject、From、To与List-Id头parse_headers()managesieve.php预填规则表单大幅降低建规则的成本保存过滤器前引擎会检查 PHPmax_input_vars/ Suhosin 请求大小限制避免大表单提交时静默丢失数据rcube_sieve_engine.phpRAW 编辑器保存的脚本同样会经过服务端校验错误信息sieve_errors会回显给用户。七、常见操作速查与注意事项想要命中即止在规则动作中加上Stop evaluating rules想要转发后保留原件使用复制/redirect :copy动作而非普通重定向临时停用某条规则点击该过滤器切换启用/停用状态无需删除调整优先级直接拖拽列表中的规则最上方最先执行备份过滤配置在集合操作菜单中使用下载Download得到该集合的 Sieve 脚本文本迁移到新服务器下载脚本后在新环境通过从文件导入创建集合Vacation 启用失败检查是否填写了正文、状态是否为 On、managesieve_vacation是否大于 0Vacation 未按预期触发确认收件地址是否在My email addresses中且未超出:addresses范围同一发件人默认每天只收到一次回复测试时留意managesieve_vacation_interval的影响界面报连接错误检查managesieve_host、端口默认 4190、认证方式与managesieve_allowed_hosts白名单可通过开启managesieve_debug查看log_dir/sieve中的协议日志。八、进一步阅读插件主文件与生命周期plugins/managesieve/managesieve.php引擎与表单解析plugins/managesieve/lib/Roundcube/rcube_sieve_engine.phpVacation 引擎plugins/managesieve/lib/Roundcube/rcube_sieve_vacation.php完整配置模板plugins/managesieve/config.inc.php.dist界面模板plugins/managesieve/skins/elastic/templates/managesieve.html、plugins/managesieve/skins/elastic/templates/vacation.html测试用例plugins/managesieve/tests/ManagesieveVacationTest.php 等配套用户手册plugins/managesieve/helpdocs/en_US/settings-vacation.rst赞分享即时通讯后端前端【免费下载链接】roundcubemailThe Roundcube Webmail suite项目地址https://gitcode.com/gh_mirrors/ro/roundcubemail点击查看免费下载相关推荐Roundcube managesieve 插件 Vacation自动回复/外出答复配置完全指南Roundcube managesieve 插件 Vacation自动回复/外出答复配置完全指南 本篇技术指南围绕 Roundcube Webmail 中即时通讯后端前端docker-mailserver 中的 Sieve 邮件过滤用户自定义规则、子地址路由与 ManageSieve 全指南docker mailserver 中的 Sieve 邮件过滤用户自定义规则、子地址路由与 ManageSieve 全指南 导读 SieveRFC 5228后端通信云原生Ubuntu 24.04 ROCm 安装从 apt 源报错到多卡压测全通过Ubuntu 24.04 ROCm 安装从 apt 源报错到多卡压测全通过 sudo apt update 一执行就撞上的这条报错是 Ubuntu 24.0开发工具高性能计算文档上一篇notesmd-cli高级技巧用命令行自动化你的Obsidian每日笔记下一篇WebdriverIO跨浏览器测试矩阵自动化测试覆盖与兼容性报告生成创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →