OutlookなどのメールクライアントではSMTP Auth で送信できるが、SmtpClient では送信エラーになる現象について紹介します。
System.Net.Mail.SmtpClient クラスを利用してSMTP Authでメールを送信すると送信エラーになる場合があります。Outlookなどのメールクライアントでは、SMTP Authを利用して正しく送信できます。
/var/log/maillog には以下の形式のエラーが記録されます。
Sep 6 00:21:07 MailServer postfix/smtpd[58363]: NOQUEUE: reject: RCPT from hostname.nnnnn.ne.jp[000.00.000.00]: 554 5.7.1 <hostname.nnnnn.ne.jp[000.00.000.00]>: Client host rejected: Access denied; from=<nnn@nnnn.com> to=<nnn@nnnn.net> proto=ESMTP helo=<adelie>
サーバーの設定状態や、利用しているSMTPのソフトウェアなどの要因で、System.Net.Mail.SmtpClient がサーバーでサポートしている SMTP-Auth に対応できていない可能性があります。
System.Net.Mail.SmtpClient は SMTP-Auth の AUTH LOGIN 方式のみをサポートしています。
以下の対策があります。
Webサーバーに設置したASP.NETプログラムや、PCからインターネットに通信する場合に固定されたIPアドレスのゲートウェイサーバーを通過する場合は、送信者のIPアドレスが固定できるため、指定したIPからのメール送信には SMTP Authを利用しない動作にすることで問題を回避できます。
送信先のメールアドレスが、SMTPサーバーのメールボックスの場合、メールの中継はしないため、SMTP Authを利用せずにメールを送信できます。
SendGrid を利用してメールを送信します。
Postfixでの対策実施を紹介します。
/etc/postfix/master.cf の smtpd_client_restrictions を使用せずに smtpd_relay_restrictions を利用して対策します。
submission inet n - n - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
# -o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
# -o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
submission inet n - n - - smtpd
# -o syslog_name=postfix/submission
# -o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
# -o smtpd_reject_unlisted_recipient=no
# -o smtpd_client_restrictions=$mua_client_restrictions
# -o smtpd_helo_restrictions=$mua_helo_restrictions
# -o smtpd_sender_restrictions=$mua_sender_restrictions
# -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
# -o milter_macro_daemon_name=ORIGINATING
-o smtpd_relay_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
クライアントの IP アドレスが $mynetworks に登録されていれば、任意のアドレスに送信できる状態になります。先の「対策1: SMTP Auth を利用しない (送信元のIPアドレスが固定の場合)」の対策になります。
また、$mynetworks に登録されていない場合は送信先のアドレスのメールボックスが、このSMTPサーバーに存在する場合は送信が可能な設定になります。先の「対策2: SMTP Auth を利用しない (送信先のアドレスがSMTPサーバーのメールボックスの場合)」の対策になります。
クライアントの IP アドレスが $mynetworks. に挙げられた いずれかのネットワークにマッチした時に要求を許可します。
SMTP-Authの認証ができた場合に、要求を許可します。
"reject_unauth_destination"は次のいずれかの条件を満たさなければ要求を拒否します
SendGridを利用する場合の手順は、「PostfixでSendGrid のSMTPを利用してメールを送信する」の記事を参照してください。