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

Другие вопросы по тегам