У меня есть инструмент для рассылки новостей, который я пытаюсь настроить для работы в качестве фонового процесса для отправки электронной почты. Код ниже работает без каких-либо проблем, но проблема заключается в том, что он медленный.Установите фоновый процесс и позвольте пользователю продолжать, не дожидаясь.
Если есть 50 писем для отправки, это может быть очень медленным для конечного пользователя, поскольку они должны смотреть на экран до 1 минуты 30 секунд. Это становится большой проблемой для меня, если клиент отправляет электронное письмо большей группе людей.
Причина, по которой я отправляю каждую почтовую почтовую почтовую почтовую рассылку отдельно от отправления 1 и списком рассылки электронной почты, заключается в том, что каждое электронное письмо содержит определенный контент для каждого пользователя - например, коды отписки от подписки, личное имя в начале письма и т. Д.
Я ищу решение, в котором я могу позволить пользователю нажимать на кнопку и иметь .net запустить отправку электронной почты в фоновом режиме, в то время как переднего конечного пользователя отображается на страницу с сообщением о том, что отправляется их электронная почта , В идеале, это должно занять не больше, чем регулярная обратная передача для всего, что происходит, а не текущие несколько минут.
Любые мысли о том, как наилучшим образом достичь этого?
Спасибо за вашу помощь, Rich
if (Page.IsPostBack)
{
if (JustMeButton.Checked)
{
SendMail("[email protected]", EmailTemplate);
}
if (EveryoneButton.Checked)
{
//setup background process
BackgroundWorker bw = new BackgroundWorker();
bw.WorkerReportsProgress = false;
bw.WorkerSupportsCancellation = false;
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
bw.RunWorkerAsync();
//bring user to next screen and display message
Response.Redirect("emailSendingMessageScreen.aspx");
}
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
DataTable emailTable = (DataTable)Session["emailTable"];
foreach (DataRow row in emailTable.Rows)
{
SendMail(row["email"], row["name"], EmailTemplate);
}
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!(e.Error == null))
{
SendMail("[email protected]", "Error sending <br><br>" + e.Error.Message);
}
else
{
SendMail("[email protected]", "emails sent successfully.");
}
//clear out the sessions created for sending this email
Session.Remove("emailTable");
}
private void SendMail(string email, string emailMessage)
{
MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress("[email protected]");
mailMessage.To.Add(new MailAddress(email));
mailMessage.Subject = Server.HtmlEncode(EmailSubject.Text.Trim());
mailMessage.Body = emailMessage;
mailMessage.IsBodyHtml = true;
SmtpClient smtpClient = new SmtpClient();
Object userState = mailMessage;
smtpClient.SendCompleted += new SendCompletedEventHandler(smtpClient_SendCompleted);
smtpClient.Timeout = 10000;
try
{
smtpClient.SendAsync(mailMessage, userState);
}
catch (SmtpException smtpExc)
{
MailMessageTxt.Text += "Error Code: " + smtpExc.StatusCode;
MailMessageTxt.Visible = true;
}
catch (Exception ex)
{
MailMessageTxt.Text += "Error is: " + ex;
MailMessageTxt.Visible = true;
}
}
void smtpClient_SendCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
MailMessage mailMessage = e.UserState as MailMessage;
if (e.Error != null)
{
MailMessageTxt.Text = "Error occured, info=" + e.Error.Message;
MailMessageTxt.Visible = true;
}
}
Отличный пример. Спасибо Крису :) –