gpt4 book ai didi

c# - 在 ASP.NET C# 中异步发送电子邮件

转载 作者:行者123 更新时间:2023-11-30 18:27:12 26 4
gpt4 key购买 nike

我想知道是否有一种方法可以在 asp.net c# 中异步发送电子邮件。我使用以下代码发送电子邮件:

 if (checkObavijest.Checked)
{
List<hsp_Kupci_Newsletter_Result> lista = ServisnaKlasa.KupciNewsletter();
for (int i = 0; i < lista.Count; i++)
{
MailMessage mail = new MailMessage();

mail.From = new MailAddress("*******");
mail.To.Add(lista[i].Email);
mail.Subject = "Subject";
mail.SubjectEncoding = Encoding.UTF8;
mail.BodyEncoding = Encoding.UTF8;
mail.IsBodyHtml = true;
mail.Priority = MailPriority.High;
mail.Body = "Some message";
SmtpClient smtpClient = new SmtpClient();
Object state = mail;
smtpClient.Credentials = new NetworkCredential("****@gmail.com", "****");
smtpClient.Port = 587;
smtpClient.Host = "smtp.gmail.com";
smtpClient.EnableSsl = true;
smtpClient.SendCompleted += new SendCompletedEventHandler(smtpClient_SendCompleted);
try
{
smtpClient.SendAsync(mail, state);
}
catch (Exception ex)
{

}
}

void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{

MailMessage mail = e.UserState as MailMessage;

if (!e.Cancelled && e.Error != null)
{
string poruka = "Emailovi poslani!";
ClientScript.RegisterStartupScript(this.GetType(), "myalert", "alert('" + poruka + "');", true);
}
}

但是当我勾选发送电子邮件的选项时,页面加载大约 40 秒,然后在 40 秒后发送电子邮件。如您所见,我目前从我的数据库中提取了 20-30 封电子邮件。我认为这是异步发送邮件的正确方法,但显然不是... 我怎样才能将电子邮件发送到另一个线程,这样它就不会影响正在使用此页面的用户?有人可以帮我解决这个问题吗?谢谢!

最佳答案

原因在 MSDN documentation on SmtpClient.SendAsync 上提到

After calling SendAsync, you must wait for the e-mail transmission to complete before attempting to send another e-mail message using Send or SendAsync.

您可以通过包装方法调用使用 ThreadPool 调用 SendAsync。这会给你一些类似即发即弃的场景。

像这样:

public void SendViaThread(System.Net.Mail.MailMessage message) {
try {
System.Threading.ThreadPool.QueueUserWorkItem(SendViaAsync, message);
} catch (Exception ex) {
throw;
}
}

private void SendViaAsync(object stateObject) {
System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient();
System.Net.Mail.MmailMessage message = (MmailMessage)stateObject;
...
smtp.Credentials = new NetworkCredential("...");
smtp.Port = 587;
smtp.Host = "...";
...
smtp.SendCompleted += new SendCompletedEventHandler(smtpClient_SendCompleted);
...
smtp.Send(message);
}

然后您将在代码中调用 SendViaThread(mail)。所以,你的循环现在变成了:

for (int i = 0; i < lista.Count; i++) {
MailMessage mail = new MailMessage();
mail.From = new MailAddress("...");
mail.To.Add(lista[i].Email);
mail.Subject = "...";
...
mail.Body = "...";
SendViaThread(mail);
}

关于c# - 在 ASP.NET C# 中异步发送电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27078340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com