PHP + sSMTP sem bloqueio

3

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.)

    
por raugfer 17.05.2012 / 02:52

4 respostas

0

Ok, eu percebi! Usando o comando script , podemos escrever um wrapper:

#!/bin/sh
script -q -c "/usr/sbin/ssmtp $*" /dev/null
    
por 21.05.2012 / 02:30
3

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.

    
por 17.05.2012 / 13:58
3

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 &
    
por 13.04.2015 / 15:28
1

Você pode usar o gearman ou outras técnicas similares para fazer o bloqueio de maneira assíncrona. Consulte o link

    
por 17.05.2012 / 07:10

Tags