Мы отправляем почту с помощью exim (настроенного через WHM). При той же самой конфигурации, по-видимому, большую часть времени exim отправляет правильное имя пользователя и пароль AUTH LOGIN, однако иногда он пропускает эту часть, и sendgrid отклоняет со следующей ошибкой:
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
Разобравшись в этом, я могу воспроизвести проблему (не каждый раз, но иногда) следующим образом:
# exim -v **@****.com
From: **@****.com
To: **@****.com
Subject: Test exim
This is an exim test.
Вот настройки конфигурации exim:
Раздел: AUTH
sendgrid_login:
driver = plaintext
public_name = LOGIN
client_send = : ******** : **************
Раздел: 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
Раздел: ТРАНСПОРТСТАРТ
sendgrid_smtp:
driver = smtp
hosts = smtp.sendgrid.net
hosts_require_auth = smtp.sendgrid.net
hosts_require_tls = smtp.sendgrid.net
authenticated_sender_force = true
Когда все работает, вот журнал:
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
Обратите особое внимание на строку SMTP>> AUTH LOGIN
и шестерку прямо под ней, заканчивающуюся строкой 235 Authentication successful.
.
Вот неудача:
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
Обратите внимание, что SMTP>> AUTH LOGIN
и следующие шесть строк не называются...?
Вопрос в том, почему exim пропускает фактическую SMTP>> AUTH LOGIN
часть запроса, но только иногда? Он используетто же самое точноконфигурация соединения (в обоих журналах она упоминается как R=send_via_sendgrid T=sendgrid_smtp
).
решение1
ИЗМЕНИТЬ 8 ноября 2015 г.:
Решение состоит в том, чтобы использовать
hosts_require_auth = <; $host_address
hosts_require_tls = <; $host_address
Вместо
hosts_require_auth = smtp.sendgrid.net
hosts_require_tls = smtp.sendgrid.net
Необычно выглядящий <;
синтаксис имеет место в случае, если имя хоста разрешается в адрес IPv6 (поскольку, как можно предположить, двоеточия в адресе IPv6 могут все испортить). Переменная $host_address используется для решения случая, когда IP-адрес, в который разрешается имя хоста, изменяется (например, в этом случае, когда smtp.sendgrid.net разрешается в несколько IP-адресов, а иногда другой разрешается в середине процесса) - я думаю, что это предотвращает необходимость повторного поиска (см. такжеТранспорт smtp). КредитНастройка Exim для использования Gmail в качестве Smarthostа также автор поста и @wurtel.
ПРЕДЫДУЩИЙ ОТВЕТ / КАК ПРОВЕРИТЬ И ВОСПРОИЗВЕСТИ::
Я считаю, что комментарий @wurtel по вопросу об изменении IP-адреса верен, потому что я могу надежно воспроизвести это, используя скрипт для быстрого изменения того, какой IP разрешает smtp.sendgrid.net. Я также подтвердил, что без какой-либо записи в файле hosts эта проблема возникает по крайней мере каждые 2 часа, когда я отправляю письмо каждые 5 секунд, но когда я жестко закодировал IP в /etc/hosts, я проработал 8 часов без ошибок при такой частоте отправки, так что это временное решение, которое я использую сейчас.
Вот как я воспроизвел эту проблему. ПРИМЕЧАНИЕ: это актуально на конец октября 2015 года - если вы попробуете это после этого, IP-адреса могут быть другими, поэтому запустите dig smtp.sendgrid.net
и используйте два IP-адреса, которые он вернет вместо этого.
Добавьте это в /etc/hosts
108.168.190.108 smtp.sendgrid.net
Сохраните это в файл PHP, заменив[email protected]с адресом электронной почты, который вы контролируете.
#!/usr/local/bin/php
<?php
while (true) {
mail('[email protected]', 'Test email deletethiswithafilter', 'test ' . time());
usleep(500000);
}
Сохраните это в файл PHP и запустите его, пока работает выше. Каждые 5 мс - 15 мс он будет переключать запись в файле hosts для smtp.sendgrid.net между двумя IP-адресами, в которые он разрешается, а именно 158.85.10.138 и 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));
}