Ok, eu percebi! Usando o comando script
, podemos escrever um wrapper:
#!/bin/sh
script -q -c "/usr/sbin/ssmtp $*" /dev/null
Estou usando o sSMTP com PHP para enviar e-mails e funciona bem.
O problema é que o sSMTP realiza a entrega de forma síncrona, o que adiciona latência aos meus scripts PHP, permitindo que o usuário espere um pouco demais.
Existe uma maneira de fazê-lo funcionar sem bloqueio?
(Eu pensei em um hack no shell, para iniciar o processo sSMTP no plano de fundo ou algo assim, e retornar mais cedo de volta ao PHP, mas não consegui fazê-lo funcionar.)
Sim, use um dos nullmailers que oferece suporte a enfileiramento ou a um MTA completo em vez de ssmtp. Embora você possa escrever um wrapper em torno do SSMTP, ele precisará aplicar fork e setsid para isolar o processo de php de chamada.
Isso funciona com a tubulação do sendmail. Aqui está um exemplo de como os dados que são canalizados se parecem com
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
Salve este script como /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 &
Você pode usar o gearman ou outras técnicas similares para fazer o bloqueio de maneira assíncrona. Consulte o link