我使用PHP的sSMTP电子邮件发送,它工作正常。
问题是,sSMTP同步执行交付,这增加了我的PHP脚本的延迟,让用户等待一段时间太长。
有没有办法使其工作非阻塞?
(我虽然在shell上破解,在后台启动sSMTP进程或者其他东西,并且早一点返回到PHP,但是我不能使它工作。)
是使用其中一个支持排队的全局 MTA而不是ssmtp。 虽然你可以写一个包装SSMTP,它需要fork和setsid来隔离调用php进程。
这适用于sendmailpipe道。 下面是一个pipe道数据的例子
To: [email protected] Subject: Your Subject Here X-PHP-Originating-Script: 0:MailSender.class.php MIME-Version: 1.0 Content-type: text/html; charset=iso-8859-1 From: First Last <[email protected]> BODY OF EMAIL GOES HERE
将此脚本保存为/usr/sbin/sendmail
#!/bin/bash # sendmail wrapper for ssmtp to send email asynchronously TMP=`mktemp` stdin=$(cat) echo "$stdin" > $TMP body=`cat $TMP` # Create the email and store in file echo "ssmtp -t <<EOF " > $TMP echo "$body" >> $TMP echo "EOF" >> $TMP echo "rm -f $TMP" >> $TMP # Send the email sh $TMP &
你可以使用减速机或其他类似的技术,使asynchronous阻塞的东西。 请参阅http://www.phpclasses.org/blog/post/108-Distributing-PHP-processing-with-Gearman.html
好的,我明白了! 使用script命令,我们可以编写一个包装器:
#!/bin/sh script -q -c "/usr/sbin/ssmtp $*" /dev/null