如何在变量中替换另一个字符

时间:2017-08-22 17:08:46

标签: dovecot sieve-language

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

2 个答案:

答案 0 :(得分:2)

我还没有尝试过,但基于Variables specification,我试图接近这个的方法是尝试匹配点前后的文本,然后根据匹配创建新变量。类似的东西:

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

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

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

答案 1 :(得分:0)

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

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;
}