У меня есть медленный удаленный почтовый сервер-ретранслятор, и используемое мной веб-приложение блокируется при отправке электронной почты на этот удаленный почтовый сервер, пока электронное письмо не будет отправлено. После отправки электронной почты страница возвращается, и приложение снова работает быстро.
Поэтому я пытаюсь настроить другую почтовую очередь локально на сервере приложений (Linux), чтобы приложение использовало ее вместо удаленного почтового сервера. Мое объяснение состоит в том, что электронные письма будут помещаться в локальную очередь до тех пор, пока они не будут обработаны удаленным почтовым сервером, но, по крайней мере, приложение не блокируется.
Я установил postfix
и настройте параметр relayhost на удаленный почтовый сервер, но производительность не улучшилась. Похоже, что postfix просто пересылает мои инструкции SMTP в реальном времени и не ставит их в очередь?
Что я могу сделать?
Проблема не в Postfix. До того, как вы установили Postfix, ваше приложение напрямую отправляло вашу почту на удаленный сервер отправки SMTP через Интернет. Шаг, который вы пропустили, перенастройка вашего приложения. Это все еще идет на удаленный сервер. Вам нужно указать своему приложению, возможно, косвенно, отправлять почту локально.
Например, если это приложение PHP, то поведение mail()
функция контролируется sendmail_path
вариант конфигурации на Unix и Linux. Вероятно, в настоящее время он указывает на программу-прокладку, которая просто запускает соединение SMTP Submission и перекачивает через него свой стандартный ввод. Вам нужно указать это на программу отправки Postfix, sendmail
вместо этого.
Вероятно, это не живет в /usr/bin/sendmail
потому что ваша программа прокладки там, и, вероятно, ее можно найти на /usr/bin/sendmail.postfix
или что-то подобное. Действительно, если у вас есть система «альтернатив» /usr/bin/sendmail
будет символической ссылкой на /etc/alternatives/mta-sendmail
, сама по себе символическая ссылка, и вам, возможно, придется перенаправить последнюю.
Какими бы то ни было средствами, включая детали вашего дистрибутива, приложения и конфигурации, которые мы не можем определить телепатически, вам необходимо заставить ваше приложение запускать правильную программу. Простая установка Postfix этого не сделала.
Обратите внимание, что Postfix находится в том же лагере, что и Zmailer, MMDF и qmail. То, что BillThor пишет в другом ответе здесь, является полным отвлечением, основанным на Sendmail Think. Sendmail и exim - громоздкие монолитные программы, которые должны иметь различия между режимами «быстрый и без очереди» и «медленный и с постановкой в очередь» из-за способа их построения. Либо программа отправки трансформируется в транспортного агента и не завершает работу до тех пор, пока она не канонизирует, не перенаправит и не передаст (или не попытается) сообщение, что в вашем случае займет много времени; или программа отправки всегда выгружает почту в очередь, где она ждет, пока процесс обработчика очереди не проснется, задерживая его на сколько бы ни был интервал опроса обработчика очереди (обычно порядка минут или часов).
Postfix и qmail следуют по стопам MMDF, с несколькими небольшими отдельными программами, каждая из которых выполняет одну работу в соответствии с философией Unix. Почта всегда помещен в очередь. Но программа внедрения очереди (postdrop
в случае Postfix) запускает какой-то семафор (Это именованный канал в qmail.) для пробуждения демона обработки очереди (демона предварительной обработки, pickup
, в случае Postfix) немедленно. Заимствовать и немного модифицировать цитата Дэна Бернштейна:
Другие MTA предлагают спектр режимов доставки, от быстрого + небезопасного до медленного + с постановкой в очередь. Демоны очереди в qmail и Postfix мгновенно запускаются при появлении новых элементов в очереди, поэтому в системе есть только один режим доставки: быстрая + поставка в очередь.
Это именно то, что вам нужно. Вы хотите sendmail
программа для быстрого завершения, позволяя вашему приложению (которое ожидает завершения) продолжить, а обработка очереди запускаться немедленно, но параллельно. Postfix, qmail, nullmailer, и тому подобное все даст вам это. Вы просто нужно исправить ваше приложение для вызова правильного агента отправки.
Вы хотите настроить postfix для отсрочки доставки почты:
defer_transports = smtp
disable_dns_lookups = yes
в вашем main.cf.
Затем вы можете очистить очередь с помощью sendmail -q, когда захотите доставить.
Посмотри на Конфигурация Postfix Backup MX
Надеюсь это поможет.
Почтовые серверы обычно предпочитают доставлять сообщения немедленно, а не ставить их в очередь для последующей доставки. По моему опыту, многие пользователи электронной почты ожидают этого режима мгновенной доставки.
Я искал инструкцию по запуску Postfix в режиме только очереди, но не нашел. Exim, который упакован для многих дистрибутивов, может быть сконфигурирован для работы в режиме только очереди. Новые сообщения будут помещены в очередь и доставлены позже процессом обработчика очереди. Вероятно, это то, что вы хотите. Exim обычно настроен на выполнение минимальных проверок сообщений, полученных из локальных источников.
В качестве альтернативы вы можете посмотреть на создание потока или процесса для отправки электронного письма.