[C#] OutlookなどのメールクライアントではSMTP Auth で送信できるが、SmtpClient では送信エラーになる

このページのタグ:[C#] [SmtpClient]
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 方式のみをサポートしています。

対策方法

以下の対策があります。

対策1: SMTP Auth を利用しない (送信元のIPアドレスが固定の場合)

Webサーバーに設置したASP.NETプログラムや、PCからインターネットに通信する場合に固定されたIPアドレスのゲートウェイサーバーを通過する場合は、送信者のIPアドレスが固定できるため、指定したIPからのメール送信には SMTP Authを利用しない動作にすることで問題を回避できます。

対策2: SMTP Auth を利用しない (送信先のアドレスがSMTPサーバーのメールボックスの場合)

送信先のメールアドレスが、SMTPサーバーのメールボックスの場合、メールの中継はしないため、SMTP Authを利用せずにメールを送信できます。

対策3: SendGrid を利用する

SendGrid を利用してメールを送信します。

対策実施手順(Postfixの場合)

Postfixでの対策実施を紹介します。

smtpd_client_restrictions の使用をやめる

/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サーバーのメールボックスの場合)」の対策になります。

オプションの説明

permit_mynetworksの説明
クライアントの IP アドレスが $mynetworks. に挙げられた いずれかのネットワークにマッチした時に要求を許可します。
permit_sasl_authenticatedの説明
SMTP-Authの認証ができた場合に、要求を許可します。
reject_unauth_destinationの説明
"reject_unauth_destination"は次のいずれかの条件を満たさなければ要求を拒否します
  • 名前解決した配送先アドレスが $relay_domains またはそのサブドメインに マッチし、アドレスに送信者指定のルーティング(user@elsewhere@domain) を含まないとき
  • Postfix が最終配送先のとき: $mydestination や $inet_interfaces, $virtual_alias_maps, $virtual_mailbox_domains にマッチする いずれかの配送先

対策実施手順(SendGrid利用の場合)

SendGridを利用する場合の手順は、「PostfixでSendGrid のSMTPを利用してメールを送信する」の記事を参照してください。

登録日 :2016-09-07    最終更新日 :2016-09-09
このページのタグ:[C#] [SmtpClient]
Japanese
プライバシー    iPentecについて
iPentec all rights reserverd. (ISDC)