Я использую sSMTP с PHP для отправки электронной почты, и он отлично работает.
Проблема в том, что sSMTP выполняет доставку синхронно, что увеличивает задержку в моих сценариях PHP, позволяя пользователю ждать слишком долго.
Есть ли способ заставить его работать неблокирующе?
(Я подумал о том, чтобы взломать оболочку, чтобы запустить процесс sSMTP в фоновом режиме или что-то в этом роде, и вернуться раньше обратно в PHP, но я не мог заставить его работать.)
Это работает с конвейером sendmail. Вот пример того, как выглядят передаваемые данные
To: to@to.com
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 <noreply@cool.com>
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 &
Да, используйте один из nullmailers который поддерживает организацию очереди или полный MTA вместо ssmtp. Хотя вы можете написать оболочку для SSMTP, для изоляции от вызывающего процесса php потребуется fork и setsid.
Вы можете использовать gearman или другие аналогичные методы, чтобы блокировать вещи асинхронно. Видеть http://www.phpclasses.org/blog/post/108-Distributing-PHP-processing-with-Gearman.html
Хорошо, я разобрался! Используя script
command мы можем написать обертку:
#!/bin/sh
script -q -c "/usr/sbin/ssmtp $*" /dev/null