Назад | Перейти на главную страницу

Заменить символы в переменной сита

Когда я регистрируюсь на веб-сайтах, я использую их домен в своей электронной почте, например serverfault.com@example.com. Я хотел бы записать каждый домен в отдельную папку 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 с использованием инструментов администрирования Symbiosis от Bytemark.

Я знаю, что это довольно старый пост, но я только что наткнулся на ту же проблему и пришел к аналогичному, но с моей точки зрения немного более эффективному решению. Может быть, это поможет кому-то другому в поисках чего-то похожего :)

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[+|.]. Это позволяет мне использовать как сопоставление поддоменов (domain.serverfault.com@user.domain.com), так и дополнительную адресацию (domain+serverfault@domain.com). Я сделал это, так как искал возможность не раскрывать свое имя для некоторых адресов электронной почты.

И последнее, но не менее важное: обратите внимание на ^ войдите в set domain линия. Это указывает почтовому серверу создать каталог с . в его имени вместо создания еще одного подуровня.

Я справился с этим правилом:

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

Регулярное выражение - это повторяющийся ([^.] *) \.? до последнего. Это захватывает не точки, пока не будет точка. Последний просто пропускает последнюю точку и соответствует от @ до конца адреса.

Затем для каждой захваченной строки, если она не пуста, я добавляю после нее пробел. Если он пуст, он не получит места, и эта часть останется пустой. Вам нужна «часть», так как вы не можете назначать переменные соответствия.

Затем я объединяю все строки с пробелами или пробелами, чтобы получить нужное имя папки.