如何利用Sieve脚本实现基于正则匹配的邮件自动归类到对应邮箱?
如何利用Sieve脚本实现基于正则匹配的邮件自动归类到对应邮箱?
我完全懂你现在的困扰——想让邮件根据主题里的三位数字自动归档到对应名称的邮箱,结果发现fileinto和mailboxexists都不支持:regex参数,报错提示未知的标签参数,确实挺让人挠头的!
其实Sieve本身确实没有直接支持用正则匹配目标邮箱的命令,不过我们可以换个思路,通过枚举邮箱列表+匹配变量的方式来实现需求,下面是具体的解决方案:
核心思路
- 先从邮件主题里捕获目标三位数字,存到变量里
- 获取所有符合条件的邮箱列表(比如INBOX下的所有子邮箱)
- 遍历每个邮箱,检查名称是否包含我们捕获的数字
- 找到匹配的邮箱就归档进去,没找到就留在收件箱
完整Sieve脚本示例
require ["fileinto", "regex", "mailbox", "variables", "loop", "string"]; # 从主题中捕获1开头的三位数字,并存到变量$id中 if header :regex "Subject" "([1-9][0-9]{2})" { set "id" "${1}"; # 获取INBOX下的所有子邮箱(如果你的邮箱都是Foobar开头,可以改成"INBOX.Foobar*"缩小范围) list_mailboxes "INBOX.*" "mailboxes"; # 遍历每个获取到的邮箱 foreach "mailbox" :list "mailboxes" { # 检查当前邮箱名是否包含我们捕获的数字ID if string :contains "${mailbox}" "${id}" { # 归档到匹配的邮箱 fileinto "${mailbox}"; # 找到匹配项后立即停止脚本,避免重复操作 stop; } } # 若遍历完所有邮箱都没找到匹配项,邮件会默认留在收件箱,无需额外操作 }
关键细节说明
- 扩展支持:要确保你的邮件服务器支持
loop、string和mailbox扩展,比如Dovecot默认是支持这些扩展的,其他服务器可能需要手动开启相关配置 - 缩小邮箱范围:如果你的目标邮箱都是以特定前缀命名(比如你提到的
Foobar 123),可以把list_mailboxes的第一个参数改成"INBOX.Foobar*",这样只会获取符合该前缀的邮箱,减少遍历次数,提高效率 - 替代
mailboxexists的方案:因为mailboxexists不支持正则,我们通过遍历邮箱列表+string :contains的方式来检查是否存在匹配的邮箱,完美解决了无法批量正则检查邮箱的问题
备注:内容来源于stack exchange,提问作者Breakfast Serial
相关产品推荐
相关产品推荐

