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

Когда я регистрируюсь на веб-сайтах, я использую их домен в своей электронной почте, например (скрытый), я хотел бы поместить каждый домен в отдельную папку IMAP, используя sieve, и я создал следующий сценарий:

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", я попытался найти функцию замены строки, но сито, похоже, не имеет один. Прямая конкатенация, то есть serverfaultcom, может запутать.

Мне понадобятся все части домена, чтобы test.serverfault.com и serverfault.co.uk регистрировались отдельно.

Есть еще одна уловка, которая могла бы сделать это, или что-то подобное?

Почтовый сервер размещен на debian-jessie с использованием инструментов администрирования Symbiosis от Bytemark.

1
задан 24 May 2017 в 11:21
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}";
  }
}

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

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

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

0
ответ дан 4 December 2019 в 04:53

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

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. *), Где расположены все каталоги домена.

Я также изменил регулярное выражение, чтобы оно соответствовало суффиксу домен [+ |.] . Это позволяет мне использовать как сопоставление поддоменов (скрытое)а также добавление адреса (скрыто). Я сделал это, когда искал возможность не раскрывать свое имя для некоторых адресов электронной почты.

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

0
ответ дан 4 December 2019 в 04:53

Теги

Похожие вопросы