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 配置設置:
部分:授權
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)); }