替换筛选变量中的字符

替换筛选变量中的字符

例如,当我在网站上注册时,我会在我的电子邮件中使用他们的域名[电子邮件保护]。我想使用 sieve 将每个域归档到单独的 IMAP 文件夹中,并且我创建了以下脚本:

if envelope :regex "to" ["^(.*\\.uk)@", "^(.*\\.com)@", "^(.*\\.org)@"] {
  set :lower "fromdomain" "${1}";
  if string :is "${fromdomain}" "" {
    keep;
  } else {
    fileinto "domains.${fromdomain}";
  }
}

但是,我的服务器配置为使用“。”作为文件夹分隔符,因此该电子邮件将进入:

domains
  serverfault
    com      <<<

代替:

domains
  serverfault.com      <<<

由于我对“serverfault com”很满意,我尝试寻找字符串替换函数,但 sieve 似乎没有。直接连接即 serverfaultcom 会让人感到困惑。

我需要域名的所有部分,以便 test.serverfault.com 和 serverfault.co.uk 分别归档。

还有其他技巧可以做到这一点,或者类似的东西吗?

邮件服务器托管在 debian-jessie 上,使用 Bytemark 的 Symbiosis 管理工具。

答案1

我知道这是一篇很老的帖子,但我刚刚偶然发现了同样的问题,并找到了一个类似的解决方案,但从我的角度来看,这个解决方案更有效。也许这可以帮助其他正在寻找类似问题的人 :)

if header :regex "X-Delivered-to" "domain[\\+|\\.]([^.]*)\\.?([^.]*)@.*$" {
  if string :is "${1}" "" {} else { set :lower "part1" "${1}"; }
  if string :is "${2}" "" {} else { set :lower "part2" "${2}"; }

  set "domain" "${part1}^${part2}";

  if string :is "${domain}" "" {} else {
    fileinto :create "INBOX.INBOX.Journal.${domain}";
    stop;
  }
}

我决定只建立一个子目录(INBOX.Journal.*),所有域目录都位于这个子目录中,而不是允许存在无限级别的子目录。

我还更改了正则表达式以匹配后缀domain[+|.]。这样我就可以使用子域映射([电子邮件保护])以及加法寻址([电子邮件保护])我这样做是因为我想找到一种不向某些电子邮件地址透露我姓名的可能性。

最后但同样重要的是,请注意行^中的符号set domain。这指示邮件服务器创建一个.名称中带有 的目录,而不是创建另一个子级。

答案2

我用这个规则来做到这一点:

if envelope :regex "to" "([^.]*)\\.?([^.]*)\\.?([^.]*)\\.?([^.]*)\\.?([^.]*)\\.?([^.]*)@.*$" {
  if string :is "${1}" "" {} else { set :lower "part1" "${1} "; }
  if string :is "${2}" "" {} else { set :lower "part2" "${2} "; }
  if string :is "${3}" "" {} else { set :lower "part3" "${3} "; }
  if string :is "${4}" "" {} else { set :lower "part4" "${4} "; }
  if string :is "${5}" "" {} else { set :lower "part5" "${5} "; }
  if string :is "${6}" "" {} else { set :lower "part6" "${6} "; }

  set "targetfolder" "${part1}${part2}${part3}${part4}${part5}${part6}";

  if string :is "${targetfolder}" "" {} else {
    fileinto "domains.${targetfolder}";
  }
}

正则表达式是重复的 ([^.]*)\.? 直到最后一个。这会捕获非点,直到有一个点。最后一个只是省略最后一个点,并从 @ 到地址末尾进行匹配。

然后,对于每个捕获的字符串,如果它不为空,我会在其后添加一个空格。如果它为空,则不会获得空格,并且该部分保持为空。您需要“部分”,因为您无法分配匹配变量。

然后我将所有字符串与空格或空字符连接起来以获得我想要的文件夹名称。

相关内容