2

这是设置:

  1. 我有一个从任务调度程序调用的通知控制器 1x/天
  2. action 方法提取了 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);
}

更新:

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

3 回答 3

0

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

更多信息在这里

于 2010-02-16T19:07:03.133 回答
0

我强烈建议使用SmtpClient.SendAsync()as 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);
    }
}
于 2010-02-16T19:10:57.760 回答
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
}
于 2010-02-16T19:12:35.103 回答