9

ホスト「smtp.gmail.com」でポート465を使用してAsp.NetC#アプリケーションで電子メールを送信しようとしましたが、アプリケーション全体がハングします(ロードを続けます)。デバッグ時に、SmtpClient.Send(msg)でスタックします。

指定されたクレデンシャルに関係なく、キャッチする例外やタイムアウトエラーはスローされません。ページへのアクセスを回復するには、ページを閉じるか更新する必要があります。

代わりにポート587を設定すると、すべてが正常に機能し、SmtpClient.Sendが応答して電子メールを送信するか、操作のタイムアウトや資格情報に基づく電子メールの送信の失敗などの適切な例外を返します。

デモ用に以下のコードを簡略化しました。

var smtp = new SmtpClient
                        {
                            Host = "smtp.gmail.com",
                            Port = 465,
                            EnableSsl = true,
                            Timeout = 200, // or any value it doesn't solve the problem
                            DeliveryMethod = SmtpDeliveryMethod.Network,
                            UseDefaultCredentials = false,
                            Credentials = new NetworkCredential("name@gmail.com", "password")
                        };

var msg = new MailMessage("name@gmail.com", "name@gmail.com", "Any subject", "Any body"); 
smtp.Send(msg); // stuck here
smtp.Dispose(); // never reached
msg.Dispose();

SendAsyncを試し、タイムアウト間隔を短くしましたが、問題は解決しませんでした。問題は、smtp.gmail.comに到達したが、ポート465に正しく応答しなかったため、メソッドがスタックしたことだと思います。

私のアプリケーションはSMTPサーバーの詳細の動的設定を許可し、間違った詳細が入力された場合にアプリケーション全体がハングしたくないので、このような動作を回避する必要があります。

ありがとうございました、

ここに画像の説明を入力してください

4

2 に答える 2

3

誰かがここに来た場合に備えて、この答えを見つけました

SmtpClient タイムアウトが機能しない

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IAsyncResult result = socket.BeginConnect("192.168.1.180", 25, null, null);
// Two second timeout
bool success = result.AsyncWaitHandle.WaitOne(2000, true);
if (!success) {
    socket.Close();
    throw new ApplicationException("Failed to connect server.");
}
于 2014-06-07T02:56:31.070 に答える