OutlookなどのメールクライアントではSMTP Auth で送信できるが、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を利用してメールを送信する」の記事を参照してください。

AuthorPortraitAlt
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
作成日: 2016-09-07
Copyright © 1995–2025 iPentec all rights reserverd.