4

我想知道是否有办法用变量中的另一个字符替换一个字符。例如,用下划线替换字符串变量中的每个点。

4

2 回答 2

2

我还没有尝试过,但是根据Variables specification,我尝试解决此问题的方法是尝试匹配点前后的文本,然后根据匹配项创建新变量。就像是:

set "value" "abc.def";
if string :matches "${value}" "*.*" {
    set "newvalue" "${1}_${2}
}

当然,这只会匹配一个周期,因为 Sieve 不包含任何循环结构。虽然有一个正则表达式匹配选项,但我不知道有任何正则表达式替换 Sieve 扩展。

您可以使用 Dovecot 进行复杂邮件过滤的另一种方法(如果您确实需要循环并拥有对邮件服务器的完全访问权限)是它们的Dovecot 特定扩展,例如vnd.dovecot.pipe允许邮件管理员定义完整的程序(以任何人希望的语言编写)处理邮件。

于 2017-08-23T12:43:14.583 回答
0

在@BluE 的评论之后,如果您的用例是将电子邮件存储在每个收件人地址的文件夹中或类似的东西中,也许您实际上并不想要通用字符替换功能,而是某种创建名称中带有点的邮箱的方法。在 dovecot 的情况下,似乎有一个解决方案:[Dovecot] 。(点)在 maildir 文件夹名称中

https://wiki2.dovecot.org/Plugins/Listescape

确保其中一个文件/etc/dovecot/conf.d包含此行:

mail_plugins = listescape

然后,您可以根据邮件列表的 ID 将邮件列表过滤到单独的框中。

此 Sieve 脚本片段从x-list-id标头中选择 ID:

if exists "x-list-id" {
    if header :regex "x-list-id" "<([\.@a-z_0-9-]+)" {
        set :lower "listname" "${1}";
        fileinto :create "mailing_list\\${listname}";
    } else {
        keep;
    }
    stop;
}
于 2021-06-07T13:31:29.810 回答