Email

Exim 並不總是發送 AUTH LOGIN 使用者名/密碼

  • March 1, 2018

我們正在使用 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 配置設置:

部分:授權

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

部分: TRANSPORTSTART

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

編輯 2015 年 11 月 8 日:

解決方案是使用

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,有時另一個不同的 IP 解析為中間程序) - 我認為它可以防止需要再次查找它(另請參閱The smtp transport)。信用配置 Exim 以使用 Gmail 作為 Smarthost以及 OP 和 @wurtel。

以前的答案/如何測試和重現::

我相信@wurtel 關於 IP 地址更改問題的評論是正確的,因為我可以通過使用腳本快速更改 smtp.sendgrid.net 解析的 IP 來可靠地重現這一點。我還確認,在主機文件中沒有任何條目的情況下,當我每 5 秒發送一封電子郵件時,此問題至少每 2 小時發生一次,但是當我將 IP 硬編碼到 /etc/hosts 中時,我持續了 8 小時在該發送頻率下沒有任何錯誤,所以這是我現在使用的臨時解決方法。

這是我重現此問題的方式。注意:這是截至 2015 年 10 月的最新版本 - 如果您在此之後嘗試它,IP 可能會有所不同,因此請執行dig smtp.sendgrid.net並使用它返回的兩個 IP。

將此添加到 /etc/hosts

108.168.190.108 smtp.sendgrid.net

將此保存到 PHP 文件中,將 test@example.com 替換為您控制的電子郵件地址。

#!/usr/local/bin/php
<?php
while (true) {
   mail('test@example.com', 'Test email deletethiswithafilter', 'test ' . time());
   usleep(500000);
}

將其保存到 PHP 文件並在上面執行時執行它。每 5 毫秒 - 15 毫秒,它將在它解析到的兩個 IP 之間切換 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));
}

引用自:https://serverfault.com/questions/727198