16

Amazon SES をセットアップしましたが、最初は数時間動作しましたが、突然停止しました。私が送信しているすべての電子メールと私たちのドメインは確認済みです。大量の電子メールを送信することはありません。1 日に数百通のみです。web.config に変更を加えるたびに、さらに 2 ~ 3 時間は再び機能するようです。たとえば、動作を停止したため、ポート 587 を 25 に切り替えたところ、2 ~ 3 時間動作し始め、その後停止しました。その後、587 に戻しましたが、同じことが起こりました。動作が停止すると、それ自体で再び開始することはないようです。2 つの負荷分散サーバー、asp.net フレームワーク v2.0、IIS 7.5 で実行されています。私が使用しているコードは次のとおりです。

web.config:

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network" from="no-reply@ourdomain.com">
      <network defaultCredentials="false" host="email-smtp.us-east-1.amazonaws.com" userName="***" password="***" port="587" />
    </smtp>
  </mailSettings>
</system.net>

c# コード:

var smtpClient = new SmtpClient() { EnableSsl = true };

var mailMessage =
    new MailMessage(fromAddress, toAddress, subject, body)
    {
        IsBodyHtml = true
    };

smtpClient.Send(mailMessage);

私が受け取った2つのエラーは次のとおりです。

The following exception was thrown by the web event provider '(null)' in the application '/' (in an application lifetime a maximum of one exception will be logged per provider instance):

System.Web.HttpException: Unable to send out an e-mail to the SMTP server. Please ensure that the server specified in the <smtpMail> section is valid. ---> System.Net.Mail.SmtpException: Failure sending mail. ---> System.IO.IOException: Received an unexpected EOF or 0 bytes from the transport stream.
   at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.Security.SslState.StartReadFrame(Byte[] buffer, Int32 readBytes, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Threading.ExecutionContext.runTryCode(Object userData)
   at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
   at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Mail.SmtpConnection.Flush()
   at System.Net.Mail.ReadLinesCommand.Send(SmtpConnection conn)
   at System.Net.Mail.SmtpConnection.GetConnection(String host, Int32 port)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   --- End of inner exception stack trace ---
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at System.Web.Management.MailWebEventProvider.SendMail(MailMessage msg)
   --- End of inner exception stack trace ---
   at System.Web.Management.MailWebEventProvider.SendMail(MailMessage msg)
   at System.Web.Management.SimpleMailWebEventProvider.SendMessageInternal(WebBaseEventCollection events, Int32 notificationSequence, Int32 begin, DateTime lastFlush, Int32 discardedSinceLastFlush, Int32 eventsInBuffer, Int32 messageSequence, Int32 messagesInNotification, Int32 eventsInNotification, Int32 eventsLostDueToMessageLimit)
   at System.Web.Management.SimpleMailWebEventProvider.SendMessage(WebBaseEvent eventRaised)
   at *****.Global.SimpleMailWithSslWebEventProvider.ProcessEvent(WebBaseEvent raisedEvent)
   at System.Web.Management.WebBaseEvent.RaiseInternal(WebBaseEvent eventRaised, ArrayList firingRuleInfos, Int32 index0, Int32 index1)

The following exception was thrown by the web event provider '(null)' in the application '/' (in an application lifetime a maximum of one exception will be logged per provider instance):

System.Web.HttpException: Unable to send out an e-mail to the SMTP server. Please ensure that the server specified in the <smtpMail> section is valid. ---> System.Net.Mail.SmtpException: Service not available, closing transmission channel. The server response was: Timeout waiting for data from client.
   at System.Net.Mail.MailCommand.CheckResponse(SmtpStatusCode statusCode, String response)
   at System.Net.Mail.SmtpTransport.SendMail(MailAddress sender, MailAddressCollection recipients, String deliveryNotify, SmtpFailedRecipientException& exception)
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at System.Web.Management.MailWebEventProvider.SendMail(MailMessage msg)
   --- End of inner exception stack trace ---
   at System.Web.Management.MailWebEventProvider.SendMail(MailMessage msg)
   at System.Web.Management.SimpleMailWebEventProvider.SendMessageInternal(WebBaseEventCollection events, Int32 notificationSequence, Int32 begin, DateTime lastFlush, Int32 discardedSinceLastFlush, Int32 eventsInBuffer, Int32 messageSequence, Int32 messagesInNotification, Int32 eventsInNotification, Int32 eventsLostDueToMessageLimit)
   at System.Web.Management.SimpleMailWebEventProvider.SendMessage(WebBaseEvent eventRaised)
   at *****.Global.SimpleMailWithSslWebEventProvider.ProcessEvent(WebBaseEvent raisedEvent)
   at System.Web.Management.WebBaseEvent.RaiseInternal(WebBaseEvent eventRaised, ArrayList firingRuleInfos, Int32 index0, Int32 index1)

Amazon フォーラムで助けを求めようとしましたが、うまくいきませんでした。何かが接続を妨害しているように見えますが、何が原因かわかりません。何か案は?ありがとう。

4

3 に答える 3

25

これは確かにトリッキーな問題のように聞こえます-私はこれについて100%肯定的ではありませんが、SMTPクライアントの破棄を見逃しているようです。見る:

SmtpClient を破棄しないと、エラーが発生します...

「サービスを利用できません。伝送チャネルを閉じています。サーバーの応答は次のとおりでした: クライアントからのデータを待っているタイムアウト。

これは、実際には断続的な問題の適切な説明です。つまり、実行されたコード パスによっては、この問題が原因でAmazon SESへの SMTP 接続がハングする可能性があります。これは明らかに別のポートに切り替えることで改善され、接続がリセットされることを意味します。SmtpClient.Dispose メソッドも次のことを保証します。

QUIT メッセージを SMTP サーバーに送信し、TCP 接続を正常に終了し、SmtpClientクラスの現在のインスタンスによって使用されているすべてのリソースを解放します。

したがって、適切なパターンは、 Amazon SES および .NET の使用開始 で示されているように、 using Statementを容易にすることです。

  String username = "SMTP-USERNAME";  // Replace with your SMTP username.
  String password = "SMTP-PASSWORD";  // Replace with your SMTP password.
  String host = "email-smtp.us-east-1.amazonaws.com";
  int port = 25;

  using (var client = new System.Net.Mail.SmtpClient(host, port))
  {
    client.Credentials = new System.Net.NetworkCredential(username, password);
    client.EnableSsl = true;

    client.Send
    (
              "FROM@EXAMPLE.COM",  // Replace with the sender address.
              "TO@EXAMPLE.COM",    // Replace with the recipient address.
              "Testing Amazon SES through SMTP",              
              "This email was delivered through Amazon SES via the SMTP end point."
    );
  }

サンプルはポート 25 を使用していることに注意してください。これは、通常は暗黙の送信制限があるため、避けることを強くお勧めします。それぞれの Amazon EC2 スロットリングの詳細については、以下の補遺を参照してください。

幸運を!


補遺

ポート 25 での Amazon EC2 スロットリング

あなたはおそらくこれを認識しているでしょう (実際にはここでは問題ではないと思います) が、Amazon EC2 はポート 25 経由で送信される E メールにデフォルトの送信制限を課し、Amazon を使用している場合でも適用される制限を超えようとすると、アウトバウンド接続を抑制しますSESAmazon SES SMTP の問題を参照してください。

ポート 25 を介して Amazon EC2 インスタンスから Amazon SES に送信しているが、Amazon SES の送信制限に到達できないか、タイムアウトを受信して​​いる— Amazon SES EC2 は、ポート 25 を介して送信される E メールにデフォルトの送信制限を課し、送信しようとするとアウトバウンド接続を抑制します。それらの制限を超えるために。これらの制限を削除するには、 メール送信制限の削除リクエストを送信してください。ポート 465 またはポート 587 経由で Amazon SES に接続することもできますが、どちらもスロットルされていません。

したがって、テスト/切り替えシナリオからポート 25 を削除し、代わりにポート 465/587 のみを使用して、誤ったリードを回避します (引用されているように、この制限を削除するように要求することもできますが、数時間かかり、ポート 25 は最初から避けるのが最善のようです) - いくつかの公式の Amazon SES サンプルがポート 25 を使用していて、実際にこの簡単に引き起こされる問題に言及していないのは少し残念です。

于 2013-01-29T10:42:45.870 に答える
2

この質問は .NET v2.0 に固有のものですが、最近 .NET v4.5 でもこの問題に遭遇しました。(以前の投稿で提案されているように) SMTP クライアントの使用を追加した後でも、断続的にこのエラーが発生していました。何時間もの調査の結果、AWS の STARTTLS ポート (2587; http://docs.aws.amazon.com/ses/latest/DeveloperGuide/smtp-connect.html ) のサポートに出会い、Microsoft は非常に細かい点で次のように述べています。 SMTP クライアントで "EnableSsl" が true の場合、クライアントは STARTTLS セッション ( https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient.enablessl(v=vs.110).aspx)。したがって、ポートを 2587 に更新した後、SmtpClient を「using {}」で囲みます

したがって、作業構成は次のようになります。

<system.net>
  <mailSettings>
    <smtp deliveryMethod="Network">
      <network host="email-smtp.us-west-2.amazonaws.com" port="2587" enableSsl="true" password="password" />
    </smtp>
  </mailSettings>
</system.net>

免責事項の 1 つは、AWS または .NET SMTP クライアントの実際の構成をまだ完全には理解していないため、これはまだ状況に応じたものです。

于 2015-10-20T14:40:53.277 に答える
0

AWSsesサービスも使用しています

 smtp deliveryMethod="Network" from="XXXXXXX@ZXXX.com"
    network enableSsl="true" host="email-smtp.us-east-1.amazonaws.com" userName="******" password="*********" port="25" 
 smtp

これがあなたのために働くことを願っています。

于 2013-01-28T18:52:22.820 に答える