私たちは 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
セクション: 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
とそのすぐ下の 6 つ、つまり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
そして次の 6 行は呼び出されません...?
問題は、なぜeximはSMTP>> AUTH LOGIN
リクエストの実際の部分を省略するのか、そしてそれが時々だけなのかということです。全く同じ接続構成 (両方のログで として参照されていますR=send_via_sendgrid T=sendgrid_smtp
)。
答え1
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 に解決されることがあります) を解決するために使用されます。これにより、再度検索する必要がなくなると思います (こちらも参照)。SMTPトランスポート)。 クレジットGmail をスマートホストとして使用するための Exim の設定そして OP と @wurtel にも。
前回の回答 / テストと再現方法::
IP アドレスの変更に関する質問に対する @wurtel のコメントは正しいと思います。なぜなら、スクリプトを使用して smtp.sendgrid.net が解決する IP をすばやく変更することで、この問題を確実に再現できるからです。また、hosts ファイルにエントリがない場合、5 秒ごとにメールを送信しているときにこの問題が少なくとも 2 時間ごとに発生することを確認しました。ただし、/etc/hosts に IP をハードコードすると、その送信頻度で 8 時間エラーが発生しなかったため、今のところはこれを一時的な回避策として使用しています。
この問題を再現する方法は次のとおりです。注: これは 2015 年 10 月末現在のものです。それ以降に試す場合は IP が異なる可能性があるため、dig smtp.sendgrid.net
代わりに 2 つの IP を使用して実行してください。
これを/etc/hostsに追加する
108.168.190.108 smtp.sendgrid.net
これをPHPファイルに保存し、[メールアドレス]あなたが管理するメールアドレスで。
#!/usr/local/bin/php
<?php
while (true) {
mail('[email protected]', 'Test email deletethiswithafilter', 'test ' . time());
usleep(500000);
}
これを PHP ファイルに保存し、上記も実行中に実行します。5 ミリ秒から 15 ミリ秒ごとに、smtp.sendgrid.net のホスト ファイル内のエントリが、解決される 2 つの 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));
}