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