- PVSM.RU - https://www.pvsm.ru -
После того, как Google закрыл Reader, я утратил веру в большую компанию, которая делает для меня инструмент, решающий важные мне задачи. Я решился строить свой собственный Луна-парк с читалками, агрегаторами, болжеком и т.п. Почта на своем домене — первое, что приходит в голову. Не вопрос прописать MX запись, поставить Postfix на локальную доставку, установить IMAP-сервер Dovecot и почтовый веб-клиент Roundcube, вопрос повторить функциональность «большой» системы, в первую очередь, сортировку. Я не буду дублировать существующие инструкции, опишу только неочевидные моменты.
Что меня не устраивает в Gmail? Это идеология меток (labels), которых можно прицепить к одному и тому же письму несколько, а в IMAP отобразить их в виде папок. В результате корневая папка всегда полна писем, а я такой человек (возможно, мой случай уникален), что всю «лишнюю» почту я удаляю, а всю «нужную» раскладываю по папкам. Я стираю все уведомления от веб-магазинов, форумов, сервисов и т.п., что не укладывается в идеологию Гугла «зачем удалять, если место бесконечно?». Гугл хочет видеть у меня как можно больше, а я не хочу видеть мусор. Далее, я пользовался iCloud/me.com, там все просто: правила сортировки входящей почты просто не работают и все.
Итак, задача: чтобы Dovecot сам раскладывал почту по папкам IMAP'а. Честно говоря, я провел минут 20 в поиске «а где же у Roundcube'а настройки фильтрации?», а потом начал читать инструкции. К сожалению, все, что можно найти в вебе, не содержит полного списка граблей, на которые можно наступить, постараюсь по горячим следам описать их тут.
Сперва, надо выучить слово sieve [1], это целый язык описания правил фильтрации, созданный Cyrusoft'ом во время работы над почтовым сервером Cyrus (не к ночи помянут). Он позволяет писать такие вот самоочевидные правила:
require ["fileinto"];
# rule:[LinkedIn]
if header :contains "From" "linkedin.com"
{
fileinto "INBOX/LinkedIn";
stop;
}
# rule:[Drupal Alerts]
if header :contains "Subject" "yet another home page"
{
fileinto "INBOX/Drupal Alerts";
stop;
}
if header :contains "From" [ "user@example.com" ] {
addflag "\flagged";
fileinto "Trash";
stop;
}
# rule:[Paypal]
if allof (header :contains "From" "paypal")
{
fileinto "INBOX/Ebay, Paypal";
stop;
}
Конечно, не очень хочется лезть в консоль, чтобы прописать новое правило фильтрации, к счастью, есть протокол managesieve, который позволяет почтовому клиенту рулить правилами на сервере. Удачно, что и Dovecot, и Roundcubе поддерживают обе функциональности. А дальше, начинаются грабли.
Во-первых, самое простое и естественное, что делается для включения seive, это установка mail_plugins = sieve где-то глобально для всего Dovecot'а. Это неправильно! Будет так:
Error: dlopen(/usr/lib64/dovecot/lib90_sieve_plugin.so) failed: /usr/lib64/dovecot/libdovecot-sieve.so.0: undefined symbol: mail_deliver_get_log_var_expand_table
Переменную следует выставить в /etc/dovecot/conf.d/15-lda.conf, для lda, локальной доставки. Включение managesieve и в Dovecot'е и в Roundcube проблем не вызывает (плагины есть в стандартной поставке), надо только не забыть прописать порт. Можно начинать писать правила, только работать они не будут, так как хотя почта раскладыватеся по папкой из клиента, «локальный доставщик» по-прежнему Postfix и INBOX не в /home/username, а в /var/mail/username. Надо прописать в main.cf mailbox_command = /usr/lib/dovecot/deliver -d «$USER». Теперь кажется, что все нормально: почти все письма раскладываются по почти всем правилам. Я потратил день на то, чтобы выяснить почему почта не попадает в папку и вывел коллег-из себя своими экспериментами. Я думал, что неправильно описываю свойства заголовка, так как там данные конверта и доставки отличаются (потому что общение происходит на сервере рассылки в рассылке, а выглядеть все должно как от собеседника собеседнику). Потом я увидел ошибку:
Mar 16 17:53:01 DJBZ002 dovecot: lda(shaman007): Error: write() failed with mbox file /home/shaman007/mail/INBOX/LOR: File too large (process was started with ulimit -f limit)
Mar 16 17:53:01 DJBZ002 dovecot: lda(shaman007): Error: sieve: msgid=<d068a42487535146ce3e7ec8b6557b27@andreybondarenko.com>: failed to store into mailbox 'INBOX/LOR': Internal error occurred. Refer to server log for more information. [2013-03-16 17:52:57]
Mar 16 17:53:01 DJBZ002 dovecot: lda(shaman007): sieve: msgid=<d068a42487535146ce3e7ec8b6557b27@andreybondarenko.com>: stored mail into mailbox 'INBOX'
Mar 16 17:53:01 DJBZ002 dovecot: lda(shaman007): Error: sieve: execution of script /home/shaman007/.dovecot.sieve failed, but implicit keep was successful (user logfile /home/shaman007/.dovecot.sieve.log may reveal additional details)
Mar 16 17:53:01 DJBZ002 postfix/local[13359]: 4575811F76E: to=<shaman007@andreybondarenko.com>, orig_to=<me@andreybondarenko.com>, relay=local, delay=3.9, delays=0.21/0.02/0/3.7, dsn=2.0.0, status=sent (delivered to command: /usr/libexec/dovecot/dovecot-lda -f "$SENDER" -a "$RECIPIENT")
Mar 16 17:53:01 DJBZ002 postfix/qmgr[29435]: 4575811F76E: removed
File too large! Целых 100 мегабайт! Оказалось, что хотя инициирует ошибку Dovecot, дело в параметре mailbox_size_limit Postfix'а. По умолчанию там 5 что-ли мегабайт, надо выставить в 0. Кажется, это все грабли.
Автор: shaman007
Источник [2]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/linux/29593
Ссылки в тексте:
[1] sieve: http://ru.wikipedia.org/wiki/Sieve
[2] Источник: http://habrahabr.ru/post/173041/
Нажмите здесь для печати.