
Estamos enviando e-mails usando exim (configurado através de WHM). Com a mesma configuração exata, aparentemente na maioria das vezes o exim envia o nome de usuário e senha AUTH LOGIN corretos, porém às vezes ele omite esta parte e o sendgrid recusa com o seguinte erro:
host smtp.sendgrid.net [158.85.10.138]
SMTP error from remote mail server after MAIL FROM:<info@*******.net> SIZE=2048:
550 Unauthenticated senders not allowed
Aprofundando-me nisso, posso reproduzir o problema (nem sempre, às vezes) com o seguinte:
# exim -v **@****.com
From: **@****.com
To: **@****.com
Subject: Test exim
This is an exim test.
Estas são as configurações do exim:
Seção: AUTH
sendgrid_login:
driver = plaintext
public_name = LOGIN
client_send = : ******** : **************
Seção: ROUTERSTART
send_via_sendgrid:
driver = manualroute
domains = ! +local_domains
transport = sendgrid_smtp
route_list = "* smtp.sendgrid.net::587 byname"
host_find_failed = defer
no_more
Seção: TRANSPORTESTART
sendgrid_smtp:
driver = smtp
hosts = smtp.sendgrid.net
hosts_require_auth = smtp.sendgrid.net
hosts_require_tls = smtp.sendgrid.net
authenticated_sender_force = true
Quando funciona, este é o log:
LOG: MAIN
cwd=/home/** 3 args: exim -v **@****.com
From: **@****.com
To: **@****.com
Subject: Test exim
This is an exim test.
LOG: MAIN
<= **@****-**.com U=jf P=local S=354 T="Test exim"
**@****-** [~]# LOG: MAIN
cwd=/var/spool/exim 4 args: /usr/sbin/exim -v -Mc 1ZjWZy-0005re-S3
delivering 1ZjWZy-0005re-S3
Transport port=25 replaced by host-specific port=587
Connecting to smtp.sendgrid.net [198.37.144.212]:587 ... connected
SMTP<< 220 ismtpd-064 ESMTP service ready
SMTP>> EHLO **.****-**.com
SMTP<< 250-**.***.26.157
250-SIZE 20480000
250-STARTTLS
250-AUTH PLAIN LOGIN
250-8BITMIME
250-PIPELINING
250 AUTH=PLAIN LOGIN
SMTP>> STARTTLS
SMTP<< 220 Begin TLS negotiation now
SMTP>> EHLO **.****-**.com
SMTP<< 250-**.***.26.157
250-8BITMIME
250-SIZE 20480000
250-AUTH=PLAIN LOGIN
250-AUTH PLAIN LOGIN
250 PIPELINING
SMTP>> AUTH LOGIN
SMTP<< 334 VXNlcm5hbWU6
SMTP>> ****
SMTP<< 334 UGFzc3dvcmQ6
SMTP>> ********************
SMTP<< 235 Authentication successful.
SMTP>> MAIL FROM:<**@****-**.com> SIZE=1388 AUTH=**@****-**.com
SMTP>> RCPT TO:<**@****.com>
SMTP>> DATA
SMTP<< 250 Sender address accepted
SMTP<< 250 Recipient address accepted
SMTP<< 354 Continue
SMTP>> writing message and terminating "."
SMTP<< 250 Delivery in progress
SMTP>> QUIT
LOG: MAIN
=> **@****.com R=send_via_sendgrid T=sendgrid_smtp H=smtp.sendgrid.net [198.37.144.212] X=TLSv1.2:AES128-GCM-SHA256:128 A=sendgrid_login C="250 Delivery in progress"
LOG: MAIN
Completed
Preste atenção especial na linha SMTP>> AUTH LOGIN
e nos seis logo abaixo, terminando na 235 Authentication successful.
linha.
Aqui está uma falha:
LOG: MAIN
cwd=/home/** 3 args: exim -v **@****.com
From: **@****.com
To: **@****.com
Subject: Test exim
This is an exim test.
LOG: MAIN
<= **@****-**.com U=jf P=local S=340 T="Test exim"
**@****-** [~]# LOG: MAIN
cwd=/var/spool/exim 4 args: /usr/sbin/exim -v -Mc 1ZjWjO-0006T8-Eq
delivering 1ZjWjO-0006T8-Eq
Transport port=25 replaced by host-specific port=587
Connecting to smtp.sendgrid.net [198.37.144.225]:587 ... connected
SMTP<< 220 ismtpd-078 ESMTP service ready
SMTP>> EHLO ****-**.com
SMTP<< 250-**.***.157
250-SIZE 20480000
250-STARTTLS
250-AUTH PLAIN LOGIN
250-8BITMIME
250-PIPELINING
250 AUTH=PLAIN LOGIN
SMTP>> STARTTLS
SMTP<< 220 Begin TLS negotiation now
SMTP>> EHLO ****-**.com
SMTP<< 250-**.***.26.157
250-8BITMIME
250-SIZE 20480000
250-AUTH=PLAIN LOGIN
250-AUTH PLAIN LOGIN
250 PIPELINING
SMTP>> MAIL FROM:<**@****-**.com> SIZE=1374
SMTP>> RCPT TO:<**@****.com>
SMTP>> DATA
SMTP<< 550 Cannot receive from specified address <**@****-**.com>: Unauthenticated senders not allowed
SMTP<< 503 Must have sender before recipient
SMTP<< 503 Must have valid receiver and originator
SMTP>> QUIT
LOG: MAIN
** **@****.com R=send_via_sendgrid T=sendgrid_smtp H=smtp.sendgrid.net [198.37.144.225] X=TLSv1.2:AES128-GCM-SHA256:128: SMTP error from remote mail server after MAIL FROM:<**@****-**.com> SIZE=1374: 550 Cannot receive from specified address <**@****-**.com>: Unauthenticated senders not allowed
LOG: MAIN
cwd=/var/spool/exim 8 args: /usr/sbin/exim -v -t -oem -oi -f <> -E1ZjWjO-0006T8-Eq
LOG: MAIN
<= <> R=1ZjWjO-0006T8-Eq U=mailnull P=local S=1383 T="Mail delivery failed: returning message to sender"
LOG: MAIN
cwd=/var/spool/exim 4 args: /usr/sbin/exim -v -Mc 1ZjWjn-0006TR-BX
delivering 1ZjWjn-0006TR-BX
LOG: MAIN
Completed
LOG: MAIN
=> ** <**@****-**.com> R=localuser T=local_delivery
LOG: MAIN
Completed
Observe que SMTP>> AUTH LOGIN
as seis linhas seguintes não são chamadas...?
A questão é: por que o exim omite a SMTP>> AUTH LOGIN
parte real da solicitação, mas apenas algumas vezes? Está usando oexatamente o mesmoconfiguração de conexão (você pode vê-la referenciada em ambos os logs como R=send_via_sendgrid T=sendgrid_smtp
).
Responder1
EDITAR 8 de novembro de 2015:
A solução é usar
hosts_require_auth = <; $host_address
hosts_require_tls = <; $host_address
Em vez de
hosts_require_auth = smtp.sendgrid.net
hosts_require_tls = smtp.sendgrid.net
A sintaxe de aparência incomum <;
ocorre no caso de o nome do host ser resolvido para um endereço IPv6 (já que, pelo que parece, os dois pontos em um endereço IPv6 podem quebrar as coisas de outra forma). A variável $host_address é usada para resolver o caso em que o endereço IP que o nome do host resolve muda (como neste caso com smtp.sendgrid.net resolvendo para vários IPs e às vezes um diferente sendo resolvido no meio do processo) - I acho que evita que precise ser consultado novamente (veja tambémO transporte smtp). CréditoConfigurando o Exim para usar o Gmail como Smarthoste também o OP e @wurtel.
RESPOSTA ANTERIOR / COMO TESTAR E REPRODUZIR::
Acredito que o comentário de @wurtel sobre a questão sobre a mudança do endereço IP está correto porque posso reproduzir isso de forma confiável usando um script para alterar rapidamente qual IP smtp.sendgrid.net resolve. Também confirmei que, sem nenhuma entrada no arquivo hosts, esse problema acontece pelo menos a cada 2 horas quando envio um e-mail a cada 5 segundos, mas quando codifiquei um IP em /etc/hosts, passei 8 horas sem erros nessa frequência de envio, então essa é a solução temporária que estou usando por enquanto.
Veja como reproduzi esse problema. NOTA: isso é atual no final de outubro de 2015 - se você tentar depois disso, os IPs podem ser diferentes, então execute dig smtp.sendgrid.net
e use dois IPs que ele retornará.
Adicione isto ao /etc/hosts
108.168.190.108 smtp.sendgrid.net
Salve isso em um arquivo PHP, substituindo[e-mail protegido]com um endereço de e-mail que você controla.
#!/usr/local/bin/php
<?php
while (true) {
mail('[email protected]', 'Test email deletethiswithafilter', 'test ' . time());
usleep(500000);
}
Salve isso em um arquivo PHP e execute-o enquanto o acima também estiver em execução. A cada 5 ms - 15 ms, ele alternará a entrada no arquivo hosts para smtp.sendgrid.net entre os dois IPs que ele resolve, que são 158.85.10.138 e 108.168.190.108
#!/usr/local/bin/php
<?php
while (true) {
passthru('new_hosts_file_contents=`cat /etc/hosts | sed \'s/108.168.190.108/ip108/g\' | sed \'s/158.85.10.138/ip158/g\' | sed \'s/ip108/158.85.10.138/g\' | sed \'s/ip158/108.168.190.108/g\'`; echo "$new_hosts_file_contents" > /etc/hosts 2>&1');
usleep(10000 + rand(-5000,5000));
}