2017-12-11 20 views
1

私の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 
    } 
} 

答えて

0

ここには、いくつかの答えが示すように、私のコードに間違いはありませんでした。私は私が再試験をすることなく、変化していた下記のかわからないんだけど、これはあなたがGmailのSMTP使用するために必要なものです:SmtpClient.EnableSsl

  • trueには有効に設定してください

    • 使用TLSポート587
    • をGoogleアカウントのMFAとSmtpClient.Credentialsのアプリパスワードを使用
  • -1

    ASP.NETからメールを送信するための標準的な方法があります。 Gmailはusername以外の送信者を除く外ないこと

    web.configファイル

    <system.net> 
        <mailSettings> 
         <smtp deliveryMethod="Network"> 
         <network defaultCredentials="false" enableSsl="true" host="smtp.gmail.com" password="password" port="587" userName="[email protected]"/> 
         </smtp> 
        </mailSettings> 
        </system.net> 
    

    は.cs

    var smtp = new SmtpClient(); // no other code. 
    var msg = CreateEmailMessage(); 
    //I use try... catch 
    try{ 
        smtp.Send(msg); 
        //return true; //if it is a separate function 
    } 
    catch(Exception ex){ 
        //return false; 
        //use ex.Message (or deeper) to send extra information 
    } 
    

    注意。住所を別の住所に返信したい場合は、

    msg.ReplyToList.Add(new MailAddress(email, publicName)); 
    
    +0

    親愛なるdownvoter、何が間違っているか説明してください。 –

    +0

    私はdownvoteしませんでしたが、おそらくそれはあなたが質問に答えなかったからですか?質問は "なぜこれは機能しないのですか?" "設定を保存する別の方法はありますか?"もう一度、私は他の人のために話すことはできませんが、これは確かにセロカのものより悪くはありません。 – Sinjai

    -1

    これははるかに簡単です。関連する名前空間を必ず追加してください。これはGmailのSMTPアドレスを使用して行われることに注意してください。それは電子メールプロバイダから電子メールプロバイダに変更されます。このコードは、

    using System.IO; 
    using System.Net.Mail; 
    using System.Net; 
    
    public void sendmail() 
    { 
        string emailFrom = "SENDING GMAIL ADDRESS HERE"; 
        string subject = " SUBJECT HERE"; 
        string body = "MESSAGE BODY HERE"; 
        MailMessage maile = new MailMessage(emailFrom, "RECIEVERS EMAIL ADDRESS", subject, body); 
        SmtpClient client = new SmtpClient("smtp.gmail.com",587); 
        client.Credentials = new System.Net.NetworkCredential("SENDING GMAIL ADDRESS HERE", "SENDERS GMAIL PASSWORD HERE"); 
        client.EnableSsl = true; 
        try 
        { 
         client.Send(maile); 
        } 
        catch(Exception e) 
        { 
         MessageBox.Show("" + e); 
        } 
    } 
    
    +0

    どうすれば簡単でしょうか? – Sinjai

    +0

    私の回答コードによれば、あなたはそれを自分で.csファイルで処理できます。どこでGmailを使ってメールを送ったのですか?したがって私は使用しているGoogleのsmtpアドレスとポートを使用しています。 yahooや他のプロバイダを使用する場合は、使用するポート番号と関連するsmtpプロバイダのアドレスを変更するだけです。電子メールの送信に使用しているアカウントの関連するアカウント資格情報(ユーザー名、パスワード)を指定できます。 [ネットワーク資格情報]行に入力します。 – SelakaN

    +0

    もちろん、設定を変更する必要がある場合は、再コンパイルする必要があります。あなたがしたことは、モジュール性の100%を取り除くことでした。 – Sinjai

    0

    Documentationに注意し、Gmailの送信制限を参照してください。..私のために完璧に動作します。、Gmail SMTPサーバーセクション。

    あなたのコードはうまく見えますが、SSLを有効にしているが、SSLメソッドを使用するユーザーが「TLS」のポートを使用しているため、問題が発生します。

    それに加えて、何も目には見えません。

    +0

    ええ、制限は2000です。私は数十にあります。はい、それはTLSポートですが、SSLポートも機能しません。これは、TLSポートに設定され、SSLは前回有効になっていました。私は何が起こっているのか分かりません。 – Sinjai

    関連する問題