Назад | Перейти на главную страницу

PHP + sSMTP Неблокирующий

Я использую 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