并非所有使用SmtpClient在ASP.NET MVC中发送的电子邮件都已发送。为什么?怎么解决?

时间:2010-02-16 19:05:01

标签: asp.net asp.net-mvc smtpclient

以下是设置:

  1. 我有一个从任务调度程序1x /天调用的通知控制器
  2. 动作方法向上拉出300个地址,通过它们循环并使用SmtpClient类向每个接收者发送单独的电子邮件。
  3. 据我所知,该流程运行正常,没有例外...... 除了并非所有电子邮件都在发送。任何人对于发生了什么以及如何解决都有任何想法?

    以下是代码:

    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);
    }
    

    更新

    在发送电子邮件之间添加暂停可以解决问题。但为什么这有效呢?是否有更好的方法(例如使用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
    }
    

3 个答案:

答案 0 :(得分:0)

smtp客户端有默认超时,默认值为100秒

more info here

答案 1 :(得分:0)

我强烈建议使用SmtpClient.SendAsync(),因为Send()正在阻止。

我会检查您要发送到的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);
    }
}

答案 2 :(得分: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
}