2013-11-15 40 views
1

我們有一個C#ASP.Net項目,它通過SMTP發送電子郵件。
我們有一個正常的密碼恢復週期,發送兩封電子郵件。 第一個有一個訪問代碼來恢復密碼,第二個返回一個臨時密碼。通過.Net的SMTP C#Web應用程序 - 不在生產服務器上發送的第二封電子郵件

當用戶請求他丟失的密碼時,總是收到此電子郵件。 然後,用戶點擊電子郵件中的鏈接,輸入代碼併發送第二封電子郵件。第一封電子郵件總是收到。

第二封電子郵件始終在我們的開發環境中收到,但只在我們的部署版本中間歇性收到。 (Webdrive服務器)

第二封電子郵件使用相同的郵件配置。它是我們稱之爲發送方法的郵件消息對象。我們沒有收到任何錯誤消息。我們認爲它可能被視爲垃圾郵件,但..... 任何想法?

電子郵件在單獨的線程上運行。這兩封電子郵件是異步發送的。

電子郵件的web.config settinga是:

<mailSettings> 
     <smtp deliveryMethod="Network" from="[email protected]"> 
     <network host="smtp.webhost.co.nz" 
        defaultCredentials="false" 
        enableSsl="true" 
        password="password" 
        port="587" 
        userName="[email protected]"/> 
    </smtp> 
    </mailSettings> 

下面的代碼:

public bool SendEMailTempPass(string EmailRecipients, string Subject, string Body, bool isHTML = true) 
     { 
      try 
      { 
       var sendMailThreadPass = new Thread(() => 
       { 
        System.Net.Configuration.SmtpSection smtpSettings = new System.Net.Configuration.SmtpSection(); 
        System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();//settings.Smtp.Network.Host); 
        string strFrom = ConfigurationManager.AppSettings["Mailto"]; 
        MailMessage mailObj = new MailMessage(strFrom, EmailRecipients, Subject, Body); 
        mailObj.IsBodyHtml = isHTML; 
        smtp.SendCompleted += new SendCompletedEventHandler(PassChangeEmail_SendCompleted); 

        smtp.SendAsync(mailObj, null); 
       }); 

       sendMailThreadPass.Start(); 

      } 
      catch (Exception ex) 
      { 
       ErrorMessage = ex.Message; 
       return false; 
      } 
      ErrorMessage = ""; 
      return true; 
     } 

     void PassChangeEmail_SendCompleted(object sender, AsyncCompletedEventArgs e) 
     { 
      if (e.Cancelled) 
      { } 
      else if (e.Error != null) 
      { 
       ErrorMessage = e.Error.ToString(); 
       EmailStatus = 0; 
      } 
      else 
      { 
       ErrorMessage = ""; 
       SuccessMessage = "Thank you. We will be in touch!"; 
       EmailStatus = 1; 
      } 
     } 

這是它被怎麼叫:

string body = PassResetEmail.PopulateBodyPassReset(this.Name + " " + this.Lastname,                    LinkURL,PicURL, NewPassword, strPassResetEmailTemplate); 

PassResetEmail.SendEMailTempPass(this.Email, "Change your temporary password", body, true); 

我用谷歌進行了測試我們遇到了同樣的問題:第一封電子郵件已發送,第二封郵件很少發送。

任何想看看或看什麼的想法?

起初我們認爲它可能是某種垃圾郵件過濾器,但它似乎與兩個不同的提供者相同。

另一件事是,即使使用相同的郵件提供程序設置,它在我們的本地環境中也能正常工作。

任何想法都會非常感謝!

謝謝!

+0

你的代碼在哪裏發送郵件?你有沒有調試過它,並且它是否成功執行發送,沒有任何異常? –

+0

謝謝,我添加了電子郵件例程。謝謝你的幫助! – DataAnalyst1

回答

0

我有問題與SendAsync掩蓋實際的錯誤 - 我不記得確切的情況,但我使用線程池取代它與我自己的異步調用:

更換你到​​通話
ThreadPool.QueueUserWorkItem(SendEmail, new EmailPair { Client = client, Email = message }); 

你需要以下輔助類和發送電子郵件的實際方法:

public class EmailPair 
{ 
    public SmtpClient Client { get; set; } 
    public MailMessage Email { get; set; } 
} 

public static void SendEmail(object state) 
{ 
    var pair = (EmailPair) state; 
    try 
    { 
     pair.Client.Send(pair.Email); 
    } 
    catch (Exception e) 
    { 
     Log.Error(e); 
    } 
} 

你真的需要記錄e的所有例外情況(確保e.InnerException正在被正確記錄,以便您可以看到發生了什麼)

您可能需要讓您的友好網絡人員參與,看他是否能夠看到實際到達郵件服務器的內容。

+0

非常感謝伴侶。這解決了這個問題。爲了記錄,smtp.SendAsync有什麼問題?這讓我精神振奮!歡呼 – DataAnalyst1

+0

@ DataAnalyst1我快速查看了「SendAsync」的源代碼 - 它絕對不像我想象的那麼簡單; ergo我不知道爲什麼錯誤報告與同步調用不同。 – wal

相關問題