вторник, 9 сентября 2025 г.

OpenSMTPD + Dovecot + Sieve

Потребовалось для небольшоя почтовой задачки создать возможность раскладки входящей почты по определенным папкам почтового ящика в соответствии с некими правилами.

Установка и настройка OpenSMTPD и Dovecotдля базового функционала не рассматривается.

OpenSMTPD - получает почту, раскладывает ее по ящикам, отправляет почту ;
Dovecot - используя IMAP управляет письмами в ящиках;

В данной связке особых сложностей нет, каждый выполняет свои задачи. Но никто из них явно не обладает функционалом раскладки писем на основании правил.

Для Dovecot можно использовать скриптовый язык Sieve, реализующий требуемый функционал.
Для того, чтобы Dovecot мог использовать Sieve необходимо дополнительно установить pigeonhole.
Если установка производится из сырцов, то при сборке необходимо указать путь до каталога, где находится файл dovecot-config из комплекта Dovecot, например --with-dovecot=/path
При установке также устанавливаются доки, в которых много чего подробно написано, но в общую картину складывается не очень и на вскидку ни первого, ни со второго раза не заработало.

И теперь изложение в каком варианте настроек функционал заработал:
1.Создать в каталоге нужно пользователя (пусть будет - cat) каталог для Sieve:
user=cat;d=/home/${user}/sieve;[ -d $d ] || mkdir -p $d && chown $user $d
 

2.Создаем файл скрипта /home/cat/sieve/rules.sieve примерно следующего содержания:
require ["fileinto"];

if header :contains ["From"] ["home-3011"]
 {
    fileinto "Alerts";
 }
elsif header :contains ["X-Spam-Flag"] ["YES"]
 {
    fileinto "Junk";
 }
 else
  {
    keep;
  }

Согласно данным правилам входящие письма содержащие в поле "From" фразу "home-3011" будут перемещены в папку "Alerts" почтового ящика пользователя "cat". Входящие письма содержащие в поле "X-Spam-Flag" фразу "YES" будут перемещены в папку "Junk", остальные в папаку "INBOX".

3.Параметры Sieve в файле /etc/dovecot/conf.d/90-sieve.conf:
plugin {
...

sieve = file:~/sieve;active=~/sieve/rules.sieve

#
На время запуска и отладки Sieve включить подробный вывод инфы в файлы
sieve_trace_dir = /tmp

sieve_trace_level = matching

...

}

Файл 90-sieve.conf идет в комплекте с pigeonhole, если установка была из сырцов, то лежит он в "pigeonhole-dir-source"/doc/example-config/conf.d

4.Для раскладки писем используется "dovecot-lda" (lda - local delivery agent) из комплекта Dovecot. "dovecot-lda" использует скрипты Sieve для анализа писем.
Прописать в файле /etc/dovecot/conf.d/15-lda.conf:
protocol lda {
  mail_plugins = $mail_plugins sieve
  log_path =
  info_log_path =
  syslog_facility = mail
}

Логи отдаются syslog, правила sieve берутся из файла ~/sieve/rules.sieve, который был создан выше. 

5.OpenSMTPD отдает входящие письма "dovecot-lda" который и раскладывает их по папкам в соответствии со скриптом ~/sieve/rules.sieve:
/etc/opensmtpd/smtpd.conf:
table aliases file:/etc/aliases
action "local_mail" mda "/usr/local/dovecot/libexec/dovecot/dovecot-lda -d %{user.username}" alias <aliases>


Путь до "dovecot-lda" нужно указать в соответствии с текущей ОС.
 
6.Проверить работоспособность послав тестовое письмо.