这是我发送大量电子邮件的代码。我想优化此代码,以确保它可以工作,并可以成功发送所有电子邮件。我该怎么办?我知道在发送之间放置中断可能很有用,但我该怎么做呢?
主要问题是避免将电子邮件归类为垃圾邮件并减少失败的已发送电子邮件数量。
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
}
答案 0 :(得分:3)
我建议您不要将所有reciepients添加到同一邮件中。
而是使用此代码:
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);
}
答案 1 :(得分:1)
通过一点尽职调查,这可以通过一个非常简单的控制台应用程序来完成,该应用程序可以从Web表单调用以发送电子邮件。通过努力,我的意思是在批次之间插入一个暂停,以便邮件服务器不会陷入困境。例如,如果您从数据库中获取地址并将其发送出去,则可以使用以下内容:
if ((count >= 100) && (count % 100 == 0))
Thread.Sleep(30000);
-----------------------------------------
// Web表单代码隐藏
//将主题和消息字符串作为参数传递给控制台应用
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);