Поштова система в Linux

Сьогодні ми будуватимемо традиційну юніксову поштову систему на локальній машині. У Unix замість програм-комбайнів зазвичай використовують набори невеликих спеціалізованих програм, кожна з яких має невеликий набір функцій, але вміє виконувати їх добре. Так і у випадку з поштою. Нам знадобляться:

1) Засіб отримання пошти з pop3-сервера. Зазвичай цеfetchmail. Ця програма вміє лише завантажувати листи з сервера та віддавати їх локальній програмі для подальшої обробки.

2) Поштовий сервер. Ми будемо розглядатиpostfixверсії 2.x, але це може бути, наприклад, qmail, exim або (ну мало) sendmail. У випадку postfix 1.x можуть бути деякі відмінності в конфігурації. Т.к. ми не збираємося використовувати свою машину як поштовий сервер для інших машин (для чого в першу чергу і потрібні перелічені програми), postfix у нас буде займатися передачею пошти від fetchmail програмі доставки (див. нижче) та відправкою вихідних повідомлень в Інтернет через SMTP . Ця його функція називається MTA (Mail Transport Agent).

3) Засіб локальної доставки (Mail Delivery Agent, MDA). В принципі, його функцію може виконувати і MTA, але ми будемо використовуватиprocmail. Ця частина нашої системи займатиметься сортуванням отриманих від MTA листів по папках і, можливо, вибірковим видаленням листів або переписуванням їх заголовків.

4) Засіб для читання пошти (Mail User Agent, MUA). Я використовуюmutt, але підійде будь-який звичайний поштовий клієнт, що вміє надсилати листи локальному sendmail (емулювати який буде postfix) і отримувати листи з локального mailbox/maildir. Наприклад, підійде kmail, а M2 не підійде. MUA займатиметься лише читанням листів з локальних поштових скриньок, написанням нових та надсиланням їх MTA.

Як все маєпрацювати

- він відповідно до заголовків запускає procmail від імені соотв. користувача та передає йому листи;

- procmail у відповідності зі своїми складними налаштуваннями редагує листи (якщо треба), частину видаляє (якщо треба), а ті, що залишилися, розкладає по папках у домашньому каталозі користувача;

- Користувач пише в своєму MUA лист і "надсилає" його;

Якщо приблизно зрозуміло, як це працюватиме, можна братися до справи. Перелічені програми, гадаю, є майже в будь-якому сучасному дистрибутиві. Після встановлення необхідно налаштувати всі елементи системи. Почнемо із головної.

Тепер відкриємо /etc/postfix/main.cf та поміняємо кілька рядків з урахуванням ролі postfix на нашій машині.

mynetworks_style = host - про всяк випадок забороняємо з'єднання на smtp-порт від усіх машин крім локальної (в принципі, ми все одно відключили smtp-демона, але якщо він необхідний локально - цей параметр обов'язково треба виставити саме так).

relayhost = my-smtp-server.ru – тут треба вказати smtp-сервер, який буде використаний postfix для відправки листів. Найкраще підійде для цієї мети smtp-сервер Вашого провайдера.

mailbox_command = /usr/bin/procmail -a $DOMAIN -d $LOGNAME - команда локальної доставки.

postfix необхідно налаштувати на запуск при старті системи (наприклад, командою chkconfig postfix on).

І ще одна незамінна для діалапників річ. Під час кожного підключення до Інтернету виконуються всі файли з /etc/ppp/ip-up.d. Тому покладемо туди файл наступного змісту:

[! -x "$SENDMAIL" ] exec "$SENDMAIL" -q >/dev/null 2>&1

Команда sendmail -q надішле всю відкладену пошту (нагадую, що postfix може емулювати sendmail).

Цей файл взятий зALTLinux, в інших дистрибутивах може бути аналогічний по завданням (як мінімум подібний є в Mandrake, тільки там викликається postfix flush).

Оскільки файл конфігурації fetchmail (.fetchmailrc) містить паролі, доступ до нього повинен мати лише його власник (інакше fetchmail навіть не запуститься). Тому кожен користувач, від якого планується запускати fetchmail, повинен мати в домашньому каталозі копію налаштувань. Якщо на машині всього 1 такий користувач, все одно доведеться скопіювати його конфіг у /root або /etc (для запуску fetchmail в режимі демона або через ip-up.d). Отже, звичайний конфіг виглядає так:

# загальні налаштування для всіх серверів

defaults: proto POP3, auth password,

# кому віддавати пошту

mda "/usr/sbin/sendmail -i %T",

приймати всі повідомлення з сервера, в т.ч. прочитані

через кожні 100 прийнятих листів з'єднуватися заново, щоб у разі розриву зв'язку не приймати їх повторно

user 'user1' there with password 'pass1' is 'localuser' here

user 'user1' there with password 'pass2' is 'localuser' here,

user 'user2' there with password 'pass3' is 'localuser' here

Тут користувач з логіном localuser має 3 ящики: [email protected], [email protected] та [email protected]. Коми, двокрапки, відступи та слова there, here і with вставлені лише для легкочитання та ігноруються.

Можна використовувати fetchmail в режимі демона, для цього на початок файлу /etc/fetchmailrc (який повинен містити всі сервери, що використовуються) додамо рядки

Тут 600 – інтервал перевірки (у секундах). 2-й рядок вказує демону, що всі повідомлення треба надсилати до syslog. Ну і включаємо демона командою chkconfig fetchmail on. До речі, на основі вищенаведеного/etc/ppp/ip-up.d/sendmail можна зробити аналог для fetchmail:

[! -x "$FETCHMAIL" ] exec "$FETCHMAIL" > /dev/null 2>&1

Тут важко дати готовий конфіг, т.к. більша його частина має писатися індивідуально. Але все ж. Ось вступна частина:

# всі вказані надалі папки розташовуються в $MAILDIR

# сюди пишеться тема кожного обробленого листа та папка, куди він був поміщений

А ось кілька типових сортуючих правил:

Як бачимо, всі такі правила починаються рядком :0:, потім йде 1 або більше рядків, де після * йде регулярне вираження, з яким порівнюються всі заголовки листа (загалом procmail вміє фільтрувати за вмістом самого листа, і багато іншого, так що вивчайте man procmailrc та man procmailex). При збігу всіх рядків лист відправляється в ящик, який визначається останнім рядком. Якщо там стоїть /dev/null – лист видаляється.

Крім фільтрації, можна виконувати багато інших дій над листами. Ось дуже корисне правило, що видаляє листи, що повторюються (наприклад, якщо під час скачування листів по pop3 обірвався зв'язок, і вже завантажені листи почали завантажуватися знову):

:0 Whc: msgid.lock

formail -D 65536 msgid.cache

Тут msgid останніх листів кешуються у файлі msgid.cache, розміром не більше 64K, і якщо msgid отриманого листа міститься в цьому файлі – лист видаляється.

Скажу ще пару слів про налаштування mutt стосовно обговорюваної поштової системи. Я не розглядатиму налаштування mutt як програми читання та написання листів, тим більше що їх дуже багато. Зупинюся на темі:

mailboxes - треба вказати всі локальні скриньки (іншими словами, поштові папки - файли у форматі mailbox або папки у форматі maildir), якіmutt перевірятиме на наявність нових листів.

set spoolfile= - ящик, що відкривається під час запуску mutt.

# Person who should get root's mail.

До речі, після встановлення та запуску postfix root'у іноді будуть надходити листи від різних демонів та програм (як правило, з повідомленнями про помилки). Наприклад, при спробі виконання sudo користувачем, не згаданим у sudoers, відбудеться наступне:

user2 не є в файлі sudoers. Цей incident will be reported.

І root'у (точніше, вказаному в /etc/aliases користувачеві) прийде лист: