Когда я регистрируюсь на веб-сайтах, я использую их домен в своей электронной почте, например (скрытый), я хотел бы поместить каждый домен в отдельную папку 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.
Я справился с этим с помощью этого правила:
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}";
}
}
Регулярное выражение - это повторяющийся ([^.] *) \.? до последнего. Это захватывает не точки, пока не появится точка. Последнее просто пропускает последнюю точку и соответствует от @ до конца адреса.
Затем для каждой захваченной строки, если она не пуста, я добавляю после нее пробел. Если он пуст, он не получит места, и эта часть останется пустой. Вам нужна «часть», так как вы не можете назначать переменные соответствия.
Затем я объединяю все строки с пробелами или пробелами, чтобы получить желаемое имя папки.
Я знаю, что это довольно старый пост, но я только что наткнулся на ту же проблему и пришел к аналогичному, но с моей точки зрения, немного более эффективному решению. Может быть, это поможет кому-то другому, ищущему что-то подобное :)
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. *), Где расположены все каталоги домена.
Я также изменил регулярное выражение, чтобы оно соответствовало суффиксу домен [+ |.]
. Это позволяет мне использовать как сопоставление поддоменов (скрытое)а также добавление адреса (скрыто). Я сделал это, когда искал возможность не раскрывать свое имя для некоторых адресов электронной почты.
И последнее, но не менее важное: обратите внимание на знак ^
в ] установить строку домена
. Это указывает почтовому серверу создать каталог с .
в его имени вместо создания другого подуровня.