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