Exim не всегда отправляет имя пользователя/пароль AUTH LOGIN

Exim не всегда отправляет имя пользователя/пароль AUTH LOGIN

Мы отправляем почту с помощью 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));
}

Связанный контент