PHP+sSMTP 非阻塞

PHP+sSMTP 非阻塞

我正在使用 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

相关内容