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

StackOverflow https://stackoverflow.com/questions/2275547

  •  21-09-2019
  •  | 
  •  

这是设置:

  1. 我有一个通知控制器,每天从任务计划程序调用 1 次
  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);
}

更新:

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

解决方案

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

更多信息在这里

其他提示

如果您没有任何例外,我会检查垃圾邮件文件夹和电子邮件地址。我还尝试从您的 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
}

我强烈建议使用 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);
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top