Мини-HOWTO: Очередь почты в Linux

Leif Erlingsson

leif@lege.com

jptietze@mail.hh.provi.de

Перевод: Александр Ермолаев, SWSoft Pte Ltd.

Версия 2.02, 3 сентября 1997 года, sendmail 8.8.7

Отложенная Удаленная Почта + Доставка Локальной Почты (Queue Remote Mail + Deliver Local Mail) Для того, чтобы Sendmail локально доставлял почту, необходимо изменение конфигурации. Почта будет находится в очереди, пока я не скажу "вперед".


Содержание
1. Введение
2. Решения, основанные не на доставке по требованию (non dial-on-demand)
2.1. Запуск sendmail
2.2. Конфигурирование sendmail
2.2.1. Непосредственное конфигурирование sendmail.cf для простых конфигураций
2.2.2. Конфигурирование sendmail.cf с использованием m4-файлов
2.3. Поддержка меню
3. Решения, основанные на доставке по требованию (dial-on-demand)
3.1. Конфигурирование sendmail.cf
3.1.1. Непосредственное конфигурирование sendmail.cf для простых конфигураций
3.1.2. Конфигурирование sendmail.cf, при помощи m4-файлов
3.2. Добавление задержки при доставке
3.2.1. Непосредственное конфигурирование sendmail.cf
3.2.2. Конфигурирование sendmail.cf, при помощи m4-файлов
4. Доставка e-mail
4.1. Как доставить почту в определенное время.
5. Авторские права

1. Введение

Этот текст был написан двумя авторами. Решения, основанные не на доставке по требованию (более старая часть), написаны Leif Erlingsson <leif@lege.com>, более же новая часть, описывающая решения с доставкой по требованию, написана Jan P Tietze <jptietze@mail.hh.provi.de>.


2. Решения, основанные не на доставке по требованию (non dial-on-demand)

Написано Leif Erlingsson <leif@lege.com>.

Первоначальная версия этой части содержала много ненужного материала. Сейчас осталось только то, что требуется. Точно...


2.1. Запуск sendmail

В дистрибутиве Slackware: /etc/rc.d/rc.M:

echo "Starting sendmail daemon (/usr/sbin/sendmail -bd -os) [только режим с очередью]..."
/usr/sbin/sendmail -bd -os	#"Стандартные" параметры "-bd -q 15m", не используются!

В дистрибутиве RedHat: /etc/rc.d/init.d/sendmail.init:

echo -n "Starting sendmail: [только режим с очередью]"
daemon sendmail -bd -os		# Не запускайте: sendmail -bd -q1h

Параметр -os не слишком существенен, вот что он делает:

SuperSafe [s] Быть супер-надежным при запуске, другими словами,
	всегда требовать файл очереди, даже если
	Вы попытаетесь осуществить немедленную доставку.
	Sendmail всегда будет использовать файл очереди
	перед возвращением контроля клиенту в любых обстоятельствах
	Это должно всегда работать.

С другой стороны, в файле конфигурации sendmail.cf это является значением по умолчанию.


2.2. Конфигурирование sendmail

Серьезные пользователи sendmail для этой задачи используют файлы m4. Я рекомендую это решение, если в ваши планы входит последующее расширение (изменение) функциональности sendmail, а также все нетривиальные изменения sendmail.cf.

Если Вы никогда не собираетесь менять настройку sendmail для изменения заголовков писем, при том, что IP - адрес выделяется для Вас динамически или что-то в этом духе, то использование файлов m4 может быть для Вас необязательным.


2.2.1. Непосредственное конфигурирование sendmail.cf для простых конфигураций

Этот способ - экстремальный, по сравнению с использованием M4. Следующее решение работает только для sendmail-8.8.x.

Редактируем /etc/sendmail.cf:

# избегать соединения с "расходующей ресурсы" почтовой программой при начальной передаче?
O HoldExpensive=True

... ниже ...

#####  @(#)smtp.m4	8.33 (Berkeley) 7/9/96	#####

Msmtp,		P=[IPC], F=mDFMuXe, S=11/31, R=21, E=\r\n, L=990,
		T=DNS/RFC822/SMTP,
		A=IPC $h
Mesmtp,		P=[IPC], F=mDFMuXae, S=11/31, R=21, E=\r\n, L=990,
		T=DNS/RFC822/SMTP,
		A=IPC $h
Msmtp8,		P=[IPC], F=mDFMuX8e, S=11/31, R=21, E=\r\n, L=990,
		T=DNS/RFC822/SMTP,
		A=IPC $h
Mrelay,		P=[IPC], F=mDFMuXa8e, S=11/31, R=61, E=\r\n, L=2040,
		T=DNS/RFC822/SMTP,
		A=IPC $h

"e" - очень важный параметр. Не волнуйтесь, если вышеприведенные флаги отличаются от ваших. Сохраните свои параметры и просто добавьте к ним "e" так же, как это сделано в нашем примере. "e" - означает, что эта программа доставки почта является "расходующей ресурсы".


2.2.2. Конфигурирование sendmail.cf с использованием m4-файлов

Далее я, для простоты, буду предполагать, что версия вашего sendmail - 8.8.7. Если у вас другая версия, то замените 8.8.7 своим номером версии, но только если она не ниже! Для более старых версий наши инструкции срабатывать не будут. Установите самый новый sendmail!

Загрузите исходные тексты sendmail. Поищите в ``http://WWW.Sendmail.ORG'' или, возможно, в ``ftp.sendmail.org''.

Я также рекомендую вам установит мой патч для разрешения изменений псевдонимов и некоторых других полезных функций для того, чтобы у вас был полный контроль над почтовой средой.

Пошлите письмо по адресу ``Sendmail Patch <sendmail@lege.com>'' с темой ``sendmail-8.8.7'', если 8.8.7 - это ваша версия.

Эти патчи также можно найти на "http://www.lege.com"; там же есть и исходные sgml-версии этого mini-HOWTO!

Вы не должны устанавливать мои патчи для работы с "Queue Remote Mail + Deliver Local Mail". Мои патчи решают другие проблемы. Я просто подумал, что это хорошее место для их упоминания, так как множество пользователей Linux сочтет их очень удобными. (Они даже заставят работать должным образом виртуальные домены (virtual domains),. Виртуальные домены не должны быть "локальными". Они дадут Вам "xaliases", или другими словами, "обратное совмещение имен" ("reverse aliasing".))

Распакуйте исходные тексты sendmail. Вы получите /usr/src/sendmail-8.8.7/ или что-то подобное. Зайдите в каталог /usr/src/sendmail-8.8.7/cf

Сейчас используйте мой патч, если Вы этого хотите, иначе пропустите данный шаг: Если Вы не хотите использовать procmail в качестве локального агента доставки, сохраните /usr/src/sendmail-8.8.7/cf/ostype/linux.m4 перед следующим шагом... Запишите мой патч в "/tmp/sendmail-8.8.7-cf-cpio-idcmu.gz" и затем...

cd /usr/src/sendmail-8.8.7/cf
gzip -dc < /tmp/sendmail-8.8.7-cf-cpio-idcmu.gz | cpio -idcmu
Если Вы не хотите использовать procmail, перепишите обратно сохраненную копию /usr/src/sendmail-8.8.7/cf/ostype/linux.m4 .

Независимо от того, использовали ли Вы мои патчи или нет, Вам требуется убедиться в том, что к файлу /usr/src/sendmail-8.8.7/cf/cf/yourhostname.smtp.mc добавились следующие строки (или очень похожие на них) (но если Вы использовали мой патч, то можно исследовать файлы, содержащие в имени слово "elijah", в каталоге /usr/src/sendmail-8.8.7/cf):

dnl # Задерживать доставку через "расходнующую ресурсы" почтовую программу, если
dnl # очередь использует "O HoldExpensive=True", и пометить все
dnl # известные почтовые программы, как "расходующие".
dnl # (Смотрите книгу по "sendmail" Часть 30: Опции,
dnl # "Oc - не соединяться с расходующими ресурсы почтовыми программы", или
dnl # 2-е Издание  Часть 34.8.29,
dnl # "HoldExpensive (c), Очередь для расходующих ресурсы почтовых программ".)
dnl #				/ Leif Erlingsson <leif@lege.com>
define(`confCON_EXPENSIVE', `True')
define(SMTP_MAILER_FLAGS, e)
MAILER(local)dnl
MAILER(smtp)dnl


2.3. Поддержка меню

1.x версия этого текста содержала пункт 'Поддержка меню' для /var/X11R6/lib/fvwm/system.fvwmrc. В настоящем документе это опущено, однако эту информацию можно получить, написав по адресу:

``Menu support suggestions <fvwmrc@lege.com>'', Тема: ``Menu support suggestions''


3. Решения, основанные на доставке по требованию (dial-on-demand)

Написано Jan P Tietze <jptietze@mail.hh.provi.de>.

У многих пользователей Linux есть доступ в Интернет через телефонные линии, и многие решили реализовать на своей системе "доставку почты по требованию". То есть всякий раз, когда некоторый IP - пакет должен выйти за пределы локальной сети или машины, автоматически происходит соединение с провайдером услуг Интернет (ISP). Cвязь завершается после некоторого периода бездействия (пакеты для доставки в Интернет отсутствуют).

Хотя это очень удобно и эффективно, с точки зрения стоимости решения, имеется один частный случай, когда это не совсем так (мы помним, что время установления соединения через "обычную" модемную линию относительно велико). И этот случай связан с посылкой электронной почты. E-Mail обычно посылается через SMTP, локально настроенной на вашей системе, через SMTP-сервер, который постоянно находится в Интернет (SMTP-сервер вашего провайдера).

Когда Вы посылаете сообщение, линия будет поднята и связь установлена. Все будет хорошо, если делаете Вы это нечасто, однако если Вы посылаете множество сообщений (писем), то это станет утомительно и невыгодно. Более того, если ваш провайдер налагает ограничения на время или количество звонков, то это уменьшит возможность посылать письма в течении дня, и Вам придется делать это вручную в другое время.

Глава 1 данного документа позволит выйти из этой ситуации, хотя в системах, где имеется внешний поиск DNS имен, это все равно вызовет соединение с ISP. Хотя почта и будет поставлена в очередь. Это случается потому, что sendmail пытается "канонизировать" имена хостов.

Решение этой проблемы двояко: Сначала мы подправим sendmail.cf. Затем мы должны определить процесс, который действительно займется доставкой почты. Лично я предпочитаю использовать crond и создавать задания - это будет описано ниже.


3.1. Конфигурирование sendmail.cf

По причинам, описанным в [1.2], я рекомендую изменять m4 файлы, вместо непосредственного редактирования sendmail.cf. Это сэкономит много нервов и позволит избежать неприятных незапланированных осечек, а также сделает конфигурацию более гибкой.

Сначала реализуйте все шаги, описанные в первой части. Затем прочтите материал, специфичный "доставке по требованию".


3.1.1. Непосредственное конфигурирование sendmail.cf для простых конфигураций

!Непосредственное конфигурирование очень непрактично и негибко, но ведь вы этого хотите.

Найдите в вашем sendmail.cf строку, похожую на эту:

R$* < @ $* $~P > $*		$: $1 < @ $[ $2 $3 $] > $4

Поставьте в начале строки "#", чтобы все выглядело примерно так:

#R$* < @ $* $~P > $*		$: $1 < @ $[ $2 $3 $] > $4


3.1.2. Конфигурирование sendmail.cf, при помощи m4-файлов

Добавьте следующую строку в файл /usr/src/sendmail-8.8.7/cf/cf/имя_вашей_машины.smtp.mc:

FEATURE(nocanonify)dnl

Файл sendmail.cf будет построен автоматически с использованием специальных команд. Сохраните старую версию /etc/sendmail.cf перед тем, как устанавливать новую:

cp /etc/sendmail.cf /etc/sendmail.cf.bak
cd /usr/src/sendmail-8.8.7/cf/cf
m4 yourhostname.smtp.mc > /etc/sendmail.cf


3.2. Добавление задержки при доставке

Часто бывает полезным установить некоторую задержку при доставке почты на время набора номера и установления соединения. Это означает, что, если sendmail пытается установить соединение, но получает отказ, так как связь еще не установилась, то он будет ждать некоторое время, а затем пытаться вновь.


3.2.1. Непосредственное конфигурирование sendmail.cf

Где-то в вашем sendmail.cf должна быть строка, похожая на эту:

#O DialDelay=10s

(или очень похожая). Удалите символ "#". Если этого символа уже нет, то значит все в порядке (видимо Вы сделали это ранее).

Если же нет ничего похожего на эту строку, то сами вставьте ее (лучше всего сделать это в разделе "options"):

O DialDelay=10s

А сейчас измените значение "10s" на значение, которое Вы считаете подходящим.


3.2.2. Конфигурирование sendmail.cf, при помощи m4-файлов

Добавьте следующую строку в файл /usr/src/sendmail-8.8.7/cf/cf/имя_вашей_машины.smtp.mc:

define(`confDIAL_DELAY',`10s')

А теперь измените значение"10s" на значение, которое Вы считаете подходящим.

Файл sendmail.cf будет построен автоматически с использованием специальных команд. Сохраните старую версию /etc/sendmail.cf перед тем, как устанавливать новую:

cp /etc/sendmail.cf /etc/sendmail.cf.bak
cd /usr/src/sendmail-8.8.7/cf/cf
m4 yourhostname.smtp.mc > /etc/sendmail.cf


4. Доставка e-mail

E-Mail может быть доставлена непосредственно с использованием команды "sendmail -q". Для тех, кому интересно, что при этом происходит, используйте "sendmail -q -v", и вы получите больше информации об этом процессе.

Очень удобно автоматизировать этот процесс. Для этого используется cron.


4.1. Как доставить почту в определенное время.

Отредактируйте ваш crontab:

crontab -e

Добавьте в него строки следующего формата:

05 18-23,0-7	* * Mon,Tue,Wed,Thu,Fri	/usr/sbin/sendmail -q
05 *		* * Sat,Sun		/usr/sbin/sendmail -q

Пожалуйста, обратитесь руководству по crontab (man 5 crontab) для более подробной информации. Мне кажется, что формат довольно очевиден. Данный пример записи посылает почту (если, и еще раз если, она находится в очереди) в 5 минут некоторых часов из определенных дней недели, начиная в 18:05 и заканчивая в 7:05. В выходные, e-mail отправляется в 5 минут каждого часа, начиная в 0:05 субботы и заканчивая в 23:05 воскресенья.

Поскольку вызов осуществляется по требованию, желательно заодно иметь систему, которая забирает почту через POP3 протокол в определенное время дня. Вы можете добавить в crontab следующее:

0 21		* * * popclient -3 -u <ваше имя пользователя pop3>
-p <пароль> -o /var/spool/mail/<Пользователь user в вашей системе,
собирающий и переправляющий e-mail><mailhost.somedomain.com>

Конечно, все это обязательно должно быть в одной строке.

Затем сохраните файл и выйдите из редактора. Crontab запомнит все изменения.


5. Авторские права

Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.

Все переводы и производные работы, выполненные по документам Linux HOWTO должны сопровождаться этой заметкой об авторских правах. Это делается в целях предотвращения случаев наложения дополнительных ограничений на распространение документов HOWTO. Исключения могут составить случаи получения специального разрешения у координатора Linux HOWTO, с которым можно связаться по адресу приведенному ниже.

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: или к координатору русского перевода Linux HOWTO компании SWSoft Pte Ltd. по адресу