Eu tenho um site com um formulário. Ao enviar o formulário, o php envia um email para um gateway local.
o código php fica assim:
$ok = @mail($emailData['to'], $emailData['subject'], $message, $emailData['headers']);
if ($ok) {
echo "<p>Message has been sent.</p>";
} else {
echo "<p>Message could not be sent!</p>";
}
Portanto, quando um e-mail for enviado com sucesso, o mail.log terá a seguinte aparência:
May 11 06:15:01 webserver postfix/qmgr[2280345]: 7B6B0600EF: from=<www-data@webserver>, size=803, nrcpt=1 (queue active)
May 11 06:15:01 webserver postfix/smtp[2573042]: 7B6B0600EF: to=<[email protected]>, relay=192.168.1.250[192.168.1.250]:26, delay=0.06, delays=0.03/0.01/0.02/0.01, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 8478AE11B4)
May 11 06:15:01 webserver postfix/qmgr[2280345]: 7B6B0600EF: removed
No entanto, devido a um problema técnico, o gateway não estava acessível e o mail.log ficou assim:
May 8 06:40:12 webserver postfix/qmgr[1521]: 33890607E6: from=<www-data@webserver>, size=67769, nrcpt=2 (queue active)
May 8 06:40:42 webserver postfix/smtp[1493379]: connect to 192.168.1.250[192.168.1.250]:26: Connection timed out
May 8 06:41:12 webserver postfix/smtp[1493379]: 33890607E6: to=<[email protected]>, relay=none, delay=399463, delays=399402/0.04/60/0, dsn=4.4.1, status=deferred (connect to 192.168.1.250[192.168.1.250]:26: Connection timed out)
O PHP só pode dizer se um e-mail foi aceito para entrega, mas não pode dizer se o e-mail foi enviado com sucesso. Então, em ambos os casos, recebi a mensagem "A mensagem foi enviada"...
Então tento encontrar uma maneira de deixar o postfix pelo menos salvar o conteúdo do email (com anexos) localmente em sua própria máquina (servidor web), caso o gateway não esteja acessível. Porque caso contrário o e-mail, respectivamente o conteúdo do formulário, desaparecerá para sempre.
Por outro lado já forneci uma forma de obter uma informação, quando o gateway não estiver acessível a partir do servidor web (com a ajuda do cronjobs). Mas isso só me ajuda a perceber os problemas mais rapidamente.
Alguma ideia?
Obrigado por me ajudar.
Você precisa de algumas informações básicas sobre a infraestrutura de correio. Contra a crença comum, um e-mail não é instantâneo. A mensagem de erro acima (adiada) é um bom exemplo: esta é uma falha temporária - e nesse caso, qualquer sistema de correio tentará novamente até que o tempo de vida da fila termine (o que pode ser uma questão de dias!). Um exemplo em que você veria esse tipo de erro é a greylisting .
Isso significa que não há como obter um resultado final naquele momento - se você quiser o resultado final, você precisa ficar atento à sua caixa de entrada para ver se há mensagens devolvidas. Sempre que um erro final é encontrado (por exemplo, um domínio inexistente dentro do campo Para), uma mensagem de devolução do mailer-daemon é gerada - e esse é o seu resultado.
O
deferred
status já significa que a mensagem está na fila e será tentada novamente; por padrão, ela tentará entregá-la por aprox. 1 semana. Em seguida, ele desistirá e enviará uma notificação de não entrega ao remetente do envelope.Você não precisa fazer nada.
Você pode visualizar a fila com
postqueue -p
e solicitá-la para agendar tentativa de entrega imediata compostqueue -i deferred
.