私は新しい ASP.NET 開発者で、管理者/システムがユーザーに電子メールを送信できるプロジェクトに取り組んでいます。システムがメールを送信するまで管理者を待たせたくないので、SendAsync メソッドを使用する予定です。
ただし、非常に奇妙なエラーが発生します。
「SmtpExecption がキャッチされました: メールの送信に失敗しました。」
解決できなかったこと。
参考までに、私は .NET Framework 4 を使用しています。
protected void btnSend_Click(object sender, EventArgs e)
{
try
{
Mailer mail = new Mailer();
string senderE = ConfigurationManager.AppSettings["EmailID"].ToString();
string senderName = "Test User"
string recipientName = "TestSender";
string subject = txtSubject.Text;
string body = txtMessage.Text;
mail.SendAsync(senderE, senderName, recipient, recipientName, subject, body);
lblInfo.Text = "sent successfully :)";
Response.Redirect("Test.aspx");
}
catch
{
lblInfo.Text = "Error!!!";
}}
カスタム Mailer クラスの SendAsync メソッドのコードは次のとおりです。
public void SendAsync(string sender, string senderName, string recipient, string recipientName, string subject, string body)
{
var message = new MailMessage()
{
From = new MailAddress(sender, senderName),
Subject = subject,
Body = body,
IsBodyHtml = true
};
message.To.Add(new MailAddress(recipient, recipientName));
try
{
var client = new SmtpClient();
client.SendCompleted += new SendCompletedEventHandler(MailDeliveryComplete);
string userState = "Test";
client.SendAsync(message, userState);
}
catch (Exception ex)
{
//handle exeption
throw ex;
}
finally
{
//clean up.
message.Dispose();
}
}
public static void MailDeliveryComplete(object sender, AsyncCompletedEventArgs e)
{
string message = "";
// Get the unique identifier for this asynchronous operation.
MailMessage mail = e.UserState as MailMessage;
if (e.Error != null)
{
//handle error
message = "Error " + e.Error.ToString() + " occurred";
}
else if (e.Cancelled)
{
//handle cancelled
message = "Send canceled for mail with subject " + mail.ToString();
}
else
{
//handle sent email
message = "Mail sent successfully";
}
}
どうすれば修正できますか?
更新#1:
ところで、すべての SMTP 構成を Web.Config ファイルに保存しています。設定は次のとおりです。
<system.net>
<mailSettings>
<smtp from="My Gmail Account" deliveryMethod="Network">
<network enableSsl="true" host="smtp.gmail.com" port="587" userName="Username" password="Password" defaultCredentials="false"/>
</smtp>
</mailSettings>
</system.net>
更新 #2: さまざまな提案を試した後、Async=True を Page ディレクティブに追加したところ、次のような新しいエラー メッセージが表示されました。
非同期操作がまだ保留中に、非同期モジュールまたはハンドラーが完了しました。
コードをデバッグしたところ、今回はデバッガーが MailDeliveryMethod 内に入り、次のブロックからこのエラーがスローされました。
if (e.Error != null)
{
//handle error
message = "Error " + e.Error.ToString() + " occurred";
}
この種のエラーが発生する理由について何か考えはありますか?