在ASP.NET中发送大量电子邮件

3
这是我用来发送大量电子邮件的代码。我希望优化这个代码,确保它能够成功地发送所有邮件。我知道在发送之间放置中断可能会有用,但我该如何做到这一点呢?
主要问题是避免将电子邮件分类为垃圾邮件,并减少发送失败的邮件数量。
var list = from c in context.Emails orderby c.EmailAddress select c.EmailAddress;
MailMessage mail = new MailMessage();
try
{
    mail.From = new MailAddress(txtfrom.Text);
    foreach (var c in list)  
    {  
        mail.To.Add(new MailAddress(c.ToString()));
    }
    mail.Subject = txtSub.Text;
    mail.IsBodyHtml = true;
    mail.Body = txtBody.Text;
    if (FileUpload1.HasFile)
    {
        mail.Attachments.Add(new Attachment(
           FileUpload1.PostedFile.InputStream, FileUpload1.FileName));
    }
    SmtpClient smtp = new SmtpClient();
    smtp.Send(mail); 
}
catch (Exception)
{
    //exception handling
}

使用本地中继服务器并通过它发送所有内容。这将使您的代码快速发送,并且您可以配置它在失败时重试。 - vcsjones
2
这个答案中有很多关于发送电子邮件的细节(链接:http://stackoverflow.com/a/3905805/861565)。 - Josh Darnell
电子邮件是一个雷区,自2005年以来,发送电子邮件系统不能再依赖于将一系列字符从一台计算机传递到另一台计算机。问题在于确认已被完全删除,而这是使电子邮件强大的基石。因此,电子邮件现在是一种“发送并祈祷”的异步协议。唯一知道收件人是否收到电子邮件的方法是在目标计算机上运行程序或询问收件人。这是由垃圾邮件发送者引起的,请阅读:http://www.codinghorror.com/blog/2008/11/is-email-efail.html - Eric Leschinski
2个回答

3

我建议您不要将所有收件人都添加到同一封邮件中。

相反,请使用以下代码:

mail.From = new MailAddress(txtfrom.Text);
mail.Subject = txtSub.Text;
mail.IsBodyHtml = true;
mail.Body = txtBody.Text;
if (FileUpload1.HasFile)
{
    mail.Attachments.Add(new Attachment(FileUpload1.PostedFile.InputStream, FileUpload1.FileName));
}
SmtpClient smtp = new SmtpClient();
foreach (var c in list)  
{  
    mail.To.Clear();
    mail.To.Add(new MailAddress(c.ToString()));
    smtp.Send(mail);
}

非常正确。大多数垃圾邮件过滤器会拦截超过20个收件人的电子邮件。 - tgolisch
2
+1,特别是它们都将进入“收件人”字段而不是“密送”字段。如果收件人彼此不认识,您刚刚向每个其他收件人公开了他们的PII。 - Richard Deeming

1

通过一些尽职调查,可以使用非常简单的控制台应用程序来完成此操作,该应用程序可以从Web表单中调用以分派电子邮件。所谓的尽职调查是指在批处理之间插入暂停,以使邮件服务器不会陷入困境。例如,如果您正在从数据库中获取地址并将其发送出去,则可以使用以下内容:

if ((count >= 100) && (count % 100 == 0))
    Thread.Sleep(30000);
-----------------------------------------

// 网页表单代码后台

// 将主题和消息字符串作为参数传递给控制台应用程序

ProcessStartInfo info = new ProcessStartInfo();

string arguments = String.Format(@"""{0}"" ""{1}""",
     subjectText.Text.Replace(@"""", @""""""),
     messageText.Text.Replace(@"""", @""""""));
info.FileName = MAILER_FILEPATH;

Process process = Process.Start(info.FileName, arguments);
Process.Start(info);

更多信息请参见:从Web表单调用控制台应用程序


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接