私のASP.NET MVC 5アプリケーションでは、主にアカウント認証に電子メール(System.Net.Mail
)を使用しています。最近まで完全に機能していて、何が起こったのか分かりません。私が知っている限り、私は電子メールに関連するものでさえも何も変えなかった。Gmail SMTP経由で電子メールを送信するとエラー無く無期限に応答します
コントローラでSendAsync
コールに入ると、制御が無期限にハングするブラウザに戻されます。最終的には、アプリケーションプールを停止して再起動して、任意のページにアクセスする必要があります。これには数分かかります(通常はすぐに戻ることができます)。
Googleアプリのパスワードを使用するように設定しました。これは要件です(そうしないとセキュリティに関するエラーが発生します)。それはthe new app password hasn't been used以来、Googleほどまでには達していないようだ。
私はTLSポートとSSLポートを試しました。私が最後にTLSを使用していたのです。
のWeb.config:
<configuration>
<appSettings>
<add key="SmtpUsername" value="[email protected]" />
<add key="SmtpPassword" value="AppPassword" />
<add key="SmtpSender" value="[email protected]" />
<add key="SmtpHost" value="smtp.gmail.com" />
<add key="SmtpPort" value="587" /> <!-- SSL: 465, TLS: 587 -->
<add key="SmtpEnableSsl" value="true" />
</appSettings>
</configuration>
メールコード:
public class EmailClient : SmtpClient
{
public EmailClient()
{
UseDefaultCredentials = false;
Host = WebConfigurationManager.AppSettings.Get("SmtpHost");
Port = int.Parse(WebConfigurationManager.AppSettings.Get("SmtpPort"));
EnableSsl = bool.Parse(WebConfigurationManager.AppSettings.Get("SmtpEnableSsl"));
Credentials = new NetworkCredential(WebConfigurationManager.AppSettings.Get("SmtpUsername"),
WebConfigurationManager.AppSettings.Get("SmtpPassword"));
DeliveryMethod = SmtpDeliveryMethod.Network;
Timeout = 30000; // Waiting 30 seconds doesn't even end the "loading" status
}
}
public class EmailMessage : MailMessage
{
private bool isBodyHtml = true;
public EmailMessage(string subject, string body, string recipients)
: base(WebConfigurationManager.AppSettings.Get("SmtpSender"), recipients, subject, body)
{
IsBodyHtml = isBodyHtml;
}
public EmailMessage(string subject, string body, IEnumerable<string> recipients)
: base(WebConfigurationManager.AppSettings.Get("SmtpSender"), string.Join(",", recipients), subject, body)
{
IsBodyHtml = isBodyHtml;
}
}
public static class Email
{
/// <param name="recipients">Comma-delimited list of email addresses</param>
public static async Task SendAsync(string subject, string body, string recipients)
{
using (EmailMessage msg = new EmailMessage(subject, body, recipients))
using (EmailClient client = new EmailClient())
{
await client.SendMailAsync(msg);
}
}
/// <param name="recipients">Collection of email addresses</param>
public static async Task SendAsync(string subject, string body, IEnumerable<string> recipients)
{
using (EmailMessage msg = new EmailMessage(subject, body, recipients))
using (EmailClient client = new EmailClient())
{
await client.SendMailAsync(msg);
}
}
}
使用法:
public class TestController : BaseController
{
public async Task<ActionResult> Test()
{
await Email.SendAsync("TEST", "test", "[email protected]");
return View(); // Never reaches this point
}
}
親愛なるdownvoter、何が間違っているか説明してください。 –
私はdownvoteしませんでしたが、おそらくそれはあなたが質問に答えなかったからですか?質問は "なぜこれは機能しないのですか?" "設定を保存する別の方法はありますか?"もう一度、私は他の人のために話すことはできませんが、これは確かにセロカのものより悪くはありません。 – Sinjai