Windowsサーバー上で、リモートSMTPサーバー経由で電子メール通知を送信するソフトウェアを実行しています。構成オプションはほとんどなく、SSL/TLSを使用しない基本的なSMTP認証のみをサポートしています。このWindowsプログラムのSMTPサーバーとなるDebianサーバーでexim4を実行しています。デフォルトの構成でセットアップされ、さらにAUTH PLAINおよびAUTH LOGINの暗号化されていない接続を許可します。 Telnetでメールを送信しました。
telnet servername 25
ehlo test
250-AUTH PLAIN LOGIN
...
auth plain XXX
235 Authentication succeeded
mail from: ...
...
しかし、このサーバーに接続したいプログラムが接続に失敗します。理由を確認するために、接続中にパケットスニファを実行し、次のセッションを確認しました。
C: HELO hostname
S: 250 Hello hostname
C: AUTH LOGIN XXX | XXX
S: 503 AUTH command used when not advertised | 500 unrecognized command
C: QUIT
S: 221 closing connection
ここで何が行われているのかを理解するのに、SMTPプロトコルに精通していません。この接続を確立するには、exim4 SMTPサーバーで何を変更する必要がありますか?
503 AUTH command used when not advertised
は本質的にそれ自体を説明し、クライアントにAUTH
コマンドを使用するオプションを提供しませんでした。これは、クライアントがHELO
ではなくEHLO
を使用したことが原因と考えられます(Telnetテストを実行したときに使用したことに注意します)。
SMTP認証は、拡張SMTPの一部であり、EHLO
コマンドで開始されます。 「プレーンオールド」SMTPは認証をサポートしていなかったため、一部のSMTPサーバーでまだ許可されている場合でも、技術的には不正なコマンドです。
最善の解決策は、可能であれば拡張SMTP(EHLO
)を使用するようにプログラムに指示することです。そうでない場合、eximコマンドがHELO
タイプの接続でAUTHを許可するように強制する可能性があります。
**更新**
この投稿によると: http://www.exim.org/lurker/message/20040901.063858.126f66ac.en.html
EHLO(HELOではない)は、AUTHの前にクライアントが指定する必要があります。
つまり、AUTHコマンドは、(EHLOを介して、auth_advertiseに従って)アドバタイズされない限り使用できませんでした。この動作はExim 4.20で強化され、オプションではありません。
アプリケーションでEHLO
を実行できない場合は、別のMTAが必要なようです。または、認証requireを行いますか?IPベースのACLを使用して同じことを達成できますか?
最終的な解決策
Eximはこれについての回避策を持っています。説明されているようにallow_auth_unadvertised
を使用します here 、次のようなことができます:
hosts = *
control = allow_auth_unadvertised
同様の問題がありました。このメッセージは、サーバーがEximを実行しているときに、EHLOが使用されている場合でも発生する可能性があります。
WHM>ホーム>サービス構成> Exim構成マネージャーで、オプション "クライアントがSSLで接続するか、サーバーでの認証を許可される前にSTARTTLSコマンドを発行する必要があります "がデフォルト(オン)に設定されました。これを行ったかどうかはわかりませんが、通常はセキュリティの点で優れていますが、メールサーバーはAUTHではなくSTARTTLSコマンドのみを有効(アドバタイズ)にします。したがって、私のスクリプトがAUTHを送信するとき、サーバーが送信するエラーメッセージは正しいです。詳細は http://blog.networkpresence.co/?p=892 にあります。いつか時間があれば、TLSを使用するようにスクリプトを変更する方法を見つけるので、Eximオプションをオンにしてセキュリティを確保できます。
追加11/19/19:
ローカルの「電子メール送信」スクリプトを変更してTLSを使用する方法を見つけ、サーバーをTLSまたはSTARTTLSのいずれかを要求するように変更しました。
なぜこれをしたのですか?
私が使用するいくつかのWebサイトは、電子メール通知を送信するときに安全なメールサーバーを必要とするためです。私がメールアドレスについて不平を言っている理由を理解するのに時間の悪魔がいました。それは、私のメールサーバーが安全でない接続を受け入れたためです。
さらに考えてみると、すべてのWeb操作は安全でなければならないことに気付きました(これは、自動的に更新される無料のセキュリティ証明書を提供する最初のプロジェクトであるLet's Encryptプロジェクトの背後にある基本的な考え方です)。
PHP "send email"アプリケーションに2つの変更を加える必要があります。これは、fsockopen関数を使用して、メールサーバーとの安全でない接続から安全な接続に変更します(これにより、503エラーメッセージがなくなります。正しい方法):
Fsockopen port引数を25から465に変更します。
Fsockopen Host引数スキームを(空)からssl://に変更します。したがって、ホストが「mail.example.com」の場合は、「ssl://mail.example.com」に変更します。
また、httpd.confファイルの「LoadModule ssl_module modules/mod_ssl.so」の行を有効にする(ローカルApacheサーバーの場合)か、またはPHPインターネットトランスポートこの2つの変更だけですぐにうまくいきました。