我有一个速度很慢的远程邮件中继服务器,而我使用的 Web 应用程序在向该远程邮件服务器发送电子邮件时会锁定,直到电子邮件发送完毕。发送电子邮件后,页面会恢复,应用程序会再次运行。
因此,我尝试在应用服务器 (Linux) 本地设置不同的邮件队列,以便应用程序使用该队列而不是远程邮件服务器。我的理由是,电子邮件将在本地排队,直到被远程邮件服务器处理,但至少应用程序不会锁定。
我已经安装postfix
并设置了远程邮件服务器的中继主机设置,但性能并没有改善。似乎发生了这样的情况:postfix 只是实时转发我的 SMTP 指令,并没有真正将它们排队?
我能做些什么?
答案1
问题不在于 Postfix。在安装 Postfix 之前,您的应用程序会直接将您的邮件提交到 Internet 上的远程 SMTP 提交服务器。您错过的步骤是重新配置您的应用程序。它仍将发送到远程服务器。您需要告诉您的应用程序(可能是间接地)在本地提交邮件。
例如,如果它是一个 PHP 应用程序,那么mail()
函数的行为由sendmail_path
配置选项在 Unices 和 Linux 上。它可能当前指向一个 shim 程序,该程序只会启动 SMTP 提交连接并将其标准输入泵入其中。您需要将其指向 Postfix 提交程序,sendmail
, 反而。
这可能不存在于 ,/usr/bin/sendmail
因为您的 shim 程序在那里,并且很可能在 或某个类似的地方找到/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、空邮件程序等都会给你这个。你只是需要修复你的申请调用正确的提交代理。
答案2
您想设置 Postfix 来延迟邮件投递:
defer_transports = smtp
disable_dns_lookups = yes
在你的 main.cf 中。
然后,当您希望发送邮件时,可以使用 sendmail -q 刷新队列。
希望这可以帮助。
答案3
邮件服务器通常倾向于立即发送邮件,而不是将其排队等待稍后发送。根据我的经验,许多电子邮件用户都希望这种即时发送模式。
我查找了有关在仅队列模式下运行 Postfix 的说明,但一无所获。许多发行版都附带 Exim,可以配置为在仅队列模式下运行。新消息将排队,稍后由队列运行器进程传送。这可能是您想要的。Exim 通常配置为对从本地源收到的消息进行最少的检查。
或者,您可以考虑生成一个线程或进程来发送电子邮件。