在发送电子邮件到远程邮件服务器时,我有一个较慢的远程邮件中继服务器和正在使用的Web应用程序locking,直到发送电子邮件。 电子邮件发送后,页面返回,应用程序又快又好玩。
因此,我试图在应用程序服务器(Linux)上本地设置不同的邮件队列,以便应用程序使用它而不是远程邮件服务器。 我的理由是电子邮件会在本地排队,直到被远程邮件服务器处理,但是至less应用程序不会locking。
我已经安装了postfix并设置到远程邮件服务器的relayhost设置,但性能没有改善。 看来发生的事情是,后缀只是实时转发我的SMTP指令,并没有真正排队呢?
我能做什么?
问题不在于Postfix。 安装Postfix之前,您的应用程序直接将您的邮件提交到远程SMTP提交服务器,通过Internet进行。 您错过的步骤是重新configuration您的应用程序 。 它仍然走到遥远的服务器。 您需要告诉您的应用程序,也许间接地,本地提交邮件。
例如,如果它是一个PHP应用程序,那么mail()函数的行为由Unices和Linux上的sendmail_pathconfiguration选项控制。 这可能是指向一个填充程序,它只是打开一个SMTP提交连接,并将其标准input传送到它。 您需要将此指向Postfix提交程序sendmail 。
这可能不在/usr/bin/sendmail因为你的shim程序存在于/usr/bin/sendmail.postfix或类似的地方。 事实上,如果你有“alternatives”系统, /usr/bin/sendmail将是/etc/alternatives/mta-sendmail一个符号链接,它本身就是一个符号链接,你可能不得不重新定位后者。
无论如何,这涉及到你的发行版,应用程序和configuration的细节,我们不能用心灵感应的神圣,你需要让你的应用程序调用正确的程序。 简单地安装Postfix并没有那么做。
请注意,Postfix和Zmailer,MMDF和qmail在同一阵营。 BillThor在另一个答案中写的是一个基于Sendmail Think的完整红鲱鱼。 Sendmail和exim是一个非常stream行的单片程序,由于它们的架构方式,必须区分“快速和非排队”和“慢排队”模式。 提交程序变成一个传输代理,并且不会退出,直到它已经规范化,路由,并且传输(或企图)消息,这将是很长一段时间在你的情况下; 或者提交程序总是把邮件转储到一个队列中,等待队列运行者进程唤醒,然后延迟队列运行者的轮询间隔(通常是几分钟或几小时)。
Postfix和qmail遵循MMDF的脚步,按照Unix的理念,多个小的单独的程序分别执行一个任务。 邮件始终存放在队列中。 但是队列注入程序( postdrop在Postfix的情况下)会触发某种信号量( 它是qmail中的一个命名pipe道 ),以立即唤醒队列处理守护程序(Postfix的情况下为预处理守护程序, pickup程序)。 借用并略微修改Dan Bernstein的一段话 :
其他MTA提供一系列交付模式,从快速+不安全到慢+排队。 qmail和Postfix中的队列守护进程会立即被队列中的新项触发,所以系统只有一个传递模式:fast + queued。
这正是你想要的。 您希望sendmail程序能够快速终止,使您的应用程序(正在等待终止)继续执行,并且可以立即启动队列处理,但并行执行。 Postfix,qmail, nullmailer等都会给你这个。 你只需要修复你的应用程序来调用正确的提交代理。
你想设置后缀来推迟邮件传递:
defer_transports = smtp disable_dns_lookups = yes
在你的main.cf中。
然后,您可以使用sendmail -q刷新队列,当您想要交付。
看看Postfix Backup MX的configuration
希望这可以帮助。
邮件服务器通常喜欢立即传递消息,而不是排队等待以后交付。 许多电子邮件用户期望这种即时交付模式是我的经验。
我查找了在仅限队列模式下运行Postfix的指令,但没有find任何指令。 为许多分布式打包的Exim可以configuration为仅以队列模式运行。 新消息将排队并稍后由队列运行器进程传递。 这可能是你想要的。 Exim通常被configuration为对从本地来源收到的消息进行最小限度的检查。
或者,您可以查看产生线程或进程来发送电子邮件。