2010-02-16 26 views
2

這裏是設置:並非所有發送的ASP.NET MVC中使用SmtpClient發送的電子郵件。爲什麼?如何解決?

  1. 我有一個通知控制器從任務調度1X /天叫
  2. 的操作方法拉向上的300個地址,環路直通它們並使用SmtpClient類發送個人電子郵件給每個受衆。

從我可以告訴的過程中運行正常,沒有例外......除了,並非所有的電子郵件被交付。任何人對發生了什麼以及如何解決有什麼想法?

下面是代碼:

foreach (var emp in division.Users) 
{ 
    var fromAddress = "myfromaddress"; 
    var mailServer = "mymailserver"; 

    var toEmail = emp.EmailAddress; 

    var message = new MailMessage(fromAddress, toEmail) 
        { 
         Subject = subject, 
         Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>", 
         IsBodyHtml = true 
        }; 

    var client = new SmtpClient(mailServer); 
    client.Send(message); 
} 

UPDATE:

在發送電子郵件之間可以解決該問題添加一個暫停。但爲什麼這個工作?有沒有更好的方法(例如使用Async())來更好地解決問題?

更新代碼...

foreach (var emp in division.Users) 
{ 
    var fromAddress = "myfromaddress"; 
    var mailServer = "mymailserver"; 

    var toEmail = emp.EmailAddress; 

    var message = new MailMessage(fromAddress, toEmail) 
        { 
         Subject = subject, 
         Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>", 
         IsBodyHtml = true 
        }; 

    var client = new SmtpClient(mailServer); 
    client.Send(message); 

    Thread.Sleep(3000); // Wait 3s until sending next message 
} 
+0

你確定你的SMTP服務器的功能?也許用Gmail代碼嘗試你的代碼可以幫助你找到問題。也嘗試使用某些日誌工具進行日誌記錄,希望有所幫助 – Parsa 2010-02-16 19:10:38

+0

不幸的是,我懷疑你的代碼中沒有任何東西可以改變來解決這個問題。這可能是一個服務器配置問題。當你設置一個批量smtp服務器時,你必須跳過一大堆**,否則你的郵件將被許多電子郵件提供商標記爲垃圾郵件。您應該在serverfault上嘗試使用這個問題的一個版本。 – 2010-02-16 19:11:28

+0

是的,我已經驗證過,這可以處理更小的電子郵件列表(例如,我剛剛測試了一個循環中發送20封電子郵件...沒問題) – wgpubs 2010-02-16 19:12:27

回答

0

有一個與SMTP客戶端和默認值默認的超時時間爲100秒

more info here

+0

我不認爲這是超時,因爲它不需要接近100秒發送個人電子郵件。 – wgpubs 2010-02-16 19:14:55

0

我會使用SmtpClient.SendAsync()作爲發送強烈建議()阻塞。

我會檢查您要發送到的SMTP服務器的日誌。注意:發送自己的電子郵件更有可能以垃圾郵件結束,而不是使用可信任的提供程序。

編輯:添加品SendAsync代碼

smtpClient.SendCompleted += smtpClient_SendCompleted; 

static void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
{ 
    if (e.Error != null) 
    { 
     Log.ErrorFormat("Async Mail exception {0} :: {1}", 
      e.Error.GetType().Name, e.Error.Message); 
    } 
} 
+0

這是如何在MVC環境中工作的?換句話說,我如何確定成功,失敗等...? – wgpubs 2010-02-16 19:14:09

+0

在asp.net中做異步調用真的很棘手 – Fredou 2010-02-16 19:14:57

+0

@Fredou如何?所有需要改變的是調用SendAsync併爲SendCompleted事件提供一個事件處理程序... – Nate 2010-02-16 19:25:28

0

如果你沒有任何異常,我會檢查垃圾郵件文件夾和電子郵件地址。我也會嘗試從你的outlook手動發送一封電子郵件到沒有收到郵件的地址之一。

在一個側面說明,除非你正在使用不同的郵件服務器,我想你可以將此代碼更改爲

var client = new SmtpClient(mailServer); 
var mailServer = "mymailserver"; 

foreach (var emp in division.Users) 
{ 
    var fromAddress = "myfromaddress"; 


    var toEmail = emp.EmailAddress; 

    var message = new MailMessage(fromAddress, toEmail) 
        { 
         Subject = subject, 
         Body = "<body style='font:normal 13px tahoma,arial,helvetica;'>" + body + "</body>", 
         IsBodyHtml = true 
        }; 


    client.Send(message); 
} 

您也可以嘗試在SmtpClient類的SendAsync方法,像這樣:

// setup the callback method when the send finishes 
client.SendCompleted += SendComplete; //new SendCompletedEventHandler(smtpSender_SendCompleted); 

// send the email 
client.SendAsync(message, null); 



private void SendComplete(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
{ 
    // do stuff on complete 
} 
+0

不...垃圾郵件文件夾沒有郵件 – wgpubs 2010-02-16 19:16:42

+0

我有一個類似的應用程序使用SendAsync方法,它發送100個電子郵件沒有問題... – Nate 2010-02-16 19:20:39

+0

在ASP.NET MVC應用程序嗎? – wgpubs 2010-02-16 19:23:18

相關問題