Я хочу знать, есть ли способ заменить символ другим в переменной. Например, замена каждой точки символом подчеркивания в строковой переменной.
Как заменить символ на другой в переменной
Ответы (2)
Я не пробовал, но на основе спецификации переменных я бы попробовал чтобы подойти к этому, нужно попытаться сопоставить текст до и после точки, а затем создать новые переменные на основе совпадений. Что-то типа:
set "value" "abc.def";
if string :matches "${value}" "*.*" {
set "newvalue" "${1}_${2}
}
Это, конечно, будет соответствовать только одному периоду, потому что Sieve не содержит циклических структур. Хотя существует параметр соответствия регулярному выражению, я не знаю любых расширений Sieve для замены регулярных выражений.
Другой подход к сложной фильтрации почты, который вы можете реализовать с помощью Dovecot (если вам нужны циклы и у вас есть полный доступ к почтовому серверу), — это их расширения, специфичные для Dovecot, такие как vnd.dovecot.pipe
, которые позволяют почтовому администратору определять полные программы (написанные на любом желаемом языке) для обработки почты в пути.
Следуя комментарию @BluE, если ваш вариант использования заключается в хранении электронных писем в папках на адрес получателя или что-то в этом роде, возможно, вам на самом деле нужна не общая функция замены символов, а какой-то способ создания почтовых ящиков с точками в их именах. В случае с dovecot похоже есть решение: [Dovecot] . (точка) в именах папок maildir
https://wiki2.dovecot.org/Plugins/Listescape
Убедитесь, что один из файлов в /etc/dovecot/conf.d
содержит эту строку:
mail_plugins = listescape
Затем вы можете фильтровать списки рассылки в отдельные ящики на основе их идентификаторов.
Этот фрагмент скрипта Sieve выбирает идентификатор из заголовка x-list-id
:
if exists "x-list-id" {
if header :regex "x-list-id" "<([\.@a-z_0-9-]+)" {
set :lower "listname" "${1}";
fileinto :create "mailing_list\\${listname}";
} else {
keep;
}
stop;
}