傳統發送mail VS 多執行緒發送mail
最近要寫一個電子報發送程式,由於可能同時點選多封郵件同時發送,通常會寫一個function呼叫執行,但可能會因為太多郵件造成超時,因此必須改成多執行緒發送郵件
傳統方式
多執行緒發送
多執行緒的使用方法來源參考 迷之殿
傳統方式
//發送電子報
protected void SendMail()
{
try
{
MailAddress fromMail = new MailAddress("發信者信箱", "電子報標題", System.Text.Encoding.UTF8);
MailAddress toMail = new MailAddress("收件者信箱", "收件者姓名");
MailMessage message = new MailMessage(fromMail, toMail);
message.Subject = cobEName.Text;
message.Body = "這裡是電子報發送的內容";
message.IsBodyHtml = true;
message.Headers.Add("Disposition-Notification-To", "<回傳的mail>");
SmtpClient mailClient = new SmtpClient("SMTPServer");
mailClient.Credentials = new System.Net.NetworkCredential(txtLoginID.Text, txtLoginPwd.Text);//取得或設定驗證資料
//mailClient.EnableSsl = true;//指定 SmtpClient 是否使用 SSL 加密連線
//mailClient.Port = 587;
mailClient.Send(message);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
多執行緒發送
public delegate string AsyncSendMail(string From, string[] To);
//非同步發送
private void btnAsySend_Click(object sender, EventArgs e)
{
string[] aryMail = txtTo.Text.Split(',');//收件者信箱
AsyncSendMail AsySend = new AsyncSendMail(SendMailAsync);
AsyncCallback AsyBack = new AsyncCallback(SendMailCallBack);
IAsyncResult isr = AsySend.BeginInvoke(txtFrom.Text, aryMail, AsyBack, AsySend); MessageBox.Show("郵件已加入工作排程,完成後會寄送一封通知信給您,謝謝");
}
public string SendMailAsync(string From, string[] To)
{
StringBuilder sb = new StringBuilder();
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); sb.AppendFormat("起始時間 - {0} - ", DateTime.Now);
sb.AppendFormat("總共{0}封郵件 ", To.Length);
int Success = 0;
int Failure = 0;
SmtpClient emailClient = new SmtpClient("SMTPServer");
emailClient.Credentials = new NetworkCredential("ID", "Pwd");
sw.Reset();
sw.Start();
for (int i = 0; i < To.Length; i++)
{
try
{
MailMessage message = new MailMessage()
{
Body = txtBody.Text,
BodyEncoding = Encoding.UTF8,
From = new MailAddress(From),
IsBodyHtml = true,
Subject = txtSubject.Text,
SubjectEncoding = Encoding.UTF8,
};
message.Headers.Add("Disposition-Notification-To", "回傳的信箱");
message.To.Add(To[i]); emailClient.Send(message);
Success++;
message.Dispose();
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
sb.AppendFormat(" 寄送失敗的郵件 - {0}", To[i]); Failure++; continue;
}
}
sw.Stop();
emailClient = null;
sb.AppendFormat("成功郵件數量:{0}失敗郵件數量:{1} ", Success, Failure);
sb.AppendFormat(" 結束時間 - {0} - ", DateTime.Now);
sb.AppendFormat(" 總共時數 - {0}小時{1}分{2}秒{3}毫秒", sw.Elapsed.Hours, sw.Elapsed.Minutes, sw.Elapsed.Seconds, sw.Elapsed.Milliseconds);
return sb.ToString();
}
public void SendMailCallBack(IAsyncResult isr)
{
AsyncSendMail AsySend = (AsyncSendMail)isr.AsyncState;
string result = AsySend.EndInvoke(isr);
SmtpClient emailClient = new SmtpClient("SMTPServer");
emailClient.Credentials = new NetworkCredential("ID", "PWD");
MailMessage ResultMail = new MailMessage("回傳的信箱", "回傳的信箱", "郵件寄送完成通知信", result);
ResultMail.IsBodyHtml = true;
emailClient.Send(ResultMail);
emailClient = null;
ResultMail.Dispose();
}
多執行緒的使用方法來源參考 迷之殿
留言
張貼留言
您好,我是 Lawrence,這裡是我的開發筆記的網誌,如果你對我的文章有任何疑問或者有錯誤的話,歡迎留言讓我知道。