我正在使用 sSMTP 和 PHP 发送电子邮件,并且运行良好。
问题是 sSMTP 同步执行传递,这会增加我的 PHP 脚本的延迟,让用户等待的时间过长。
有没有办法让它非阻塞地工作?
(我虽然想过对 shell 进行破解,在后台启动 sSMTP 进程或者其他什么,然后再返回到 PHP,但我无法让它工作。)
答案1
是的,使用其中一种空邮件它支持队列或完整的 MTA,而不是 ssmtp。虽然您可以编写一个围绕 SSMTP 的包装器,但它需要 fork 和 setsid 来与调用 php 进程隔离。
答案2
这适用于 sendmail 管道。以下是管道传输数据的示例
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 &
答案3
你可以使用 gearman 或其他类似技术来异步阻塞事物。参见 http://www.phpclasses.org/blog/post/108-Distributing-PHP-processing-with-Gearman.html
答案4
好的,我明白了!使用script
命令我们可以编写一个包装器:
#!/bin/sh
script -q -c "/usr/sbin/ssmtp $*" /dev/null