呼之欲出 WebMail 開發手記 (七) 郵件傳送
與收郵件相比,發郵件就相對要簡單一些。
首先、使用者需要設定當前預設的傳送郵箱伺服器(從郵箱設定中選擇一個),這樣方便自動提交呢稱和對方需要回復郵件時的回覆地址等。當然傳送郵件的時候我們還可以設定郵件模板,比如業務員自己的相關聯絡,電話號碼,地址等等。這些只是頁面的東西,這次還是講多執行緒傳送郵件。
第二、發郵件的時候,如果使用者選擇郵件傳送級別為高階,就應當立即傳送(要不然,延務了使用者的時間可不要找我哦~~),其他的才可以暫時放到執行緒裡面,由伺服器自動處理。
#region 傳送郵件
public void SendStart() {
if (userId == 0 || _threadSend != null)
return;
lock(this) {
if(_smtpState != 0) {
_smtpState = 0;
}
_threadSend = new Thread(new ThreadStart(BeginSend));
_threadSend.Start();
}
}
public void SendStop() {
if (_threadSend != null) {
_threadSend.Abort();
_threadSend = null;
}
}
private void BeginSend() {
SqlDataReader configs = (new Config()).GetConfigs(userId);
if(configs != null) {
_smtpTime = DateTime.Now;
_smtpState = 1;
while(configs.Read()) {
DateTime pTime = DateTime.Parse(configs["smtpTime"].ToString());
TimeSpan m = DateTime.Now - pTime;
// 每10分鐘傳送郵件一次/超過100分鐘也重新傳送
if ((m.TotalMinutes >= 10 && configs["smtpDoing"].ToString() == "0") || m.TotalMinutes >= 100) {
_smtpMail = string.Format("當前傳送郵箱({0}):", configs["ConfigName"]);
dbmail.SetSendState(userId, configs["Id"], DateTime.Now, 1);
Send(
int.Parse(configs["ID"].ToString()),
configs["SmtpUid"].ToString(),
MailHelper.Decrypt(configs["SmtpPwd"].ToString(), "123456"),
configs["SmtpAddress"].ToString(),
int.Parse(configs["SmtpPort"].ToString()),
byte.Parse(configs["SmtpAuth"].ToString()),
configs["SmtpReply"].ToString(),
configs["SmtpName"].ToString()
);
}
}
configs.Close();
_smtpState = 2;
_smtpMessage = "傳送完成";
} else {
_smtpState = 3;
_smtpMessage = "無配置資訊";
}
_threadSend = null;
}
#endregion
傳送郵件我們使用 System.Net.Mail 下面的 MailMessage 類,記住一定要設定郵件主題、內容、附件等的編碼,一般我們設定 gb2312 就可以了,當然也可以使用 utf-8 可能會更好:
#region 傳送單個郵箱的郵件
///
/// 傳送單個郵箱的郵件
///
public void Send(int configId, string smtpUid, string smtpPwd, string smtpAddress, int smtpPort, byte smtpAuth, string smtpReply, string smtpName) {
if(!string.IsNullOrEmpty(smtpAddress)) {
MailHelper.SaveLogs(basePath, _smtpMail);//string.Format("開始傳送 {0} 的郵件, 當前使用者ID是 {1}", _smtpMail, userId));
_smtpMessage = "正在檢查需要傳送的郵件";
DataSet mails = dbmail.GetNeedSendMailsByConfigDS(configId);
if(mails.Tables.Count > 0) {
int mSize = 0;
MailMessage mail;
MailAddressCollection mailAddr;
Attachment attachment;
// 郵件編碼
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("gb2312");
// 傳送元件基本配置
SmtpClient client = new SmtpClient(smtpAddress, smtpPort);
client.DeliveryMethod = SmtpDeliveryMethod.Network;
if(smtpAuth == 1) {
client.UseDefaultCredentials = true;
client.Credentials = new System.Net.NetworkCredential(smtpUid, smtpPwd);
}
// 依次傳送郵件
for(int i = 0; i < mails.Tables[0].Rows.Count; i++) {
_smtpMessage = string.Format("正在傳送第 {0} 封郵件,共 {1} 封", i+1, mails.Tables[0].Rows.Count);
DataRow mymail = mails.Tables[0].Rows[i];
try {
mail = new MailMessage();
mail.From = new MailAddress(smtpReply, smtpName);
// 設定優先順序別
switch(mymail["Priority"].ToString()) {
case "0":
mail.Priority = MailPriority.Low;
break;
case "2":
mail.Priority = MailPriority.High;
break;
case "1":
default:
mail.Priority = MailPriority.Normal;
break;
}
mailAddr = MailHelper.GetAddress(mymail["ToAddress"].ToString(), ref mSize);
foreach(MailAddress address in mailAddr) {
mail.To.Add(address);
}
mailAddr = MailHelper.GetAddress(mymail["CCAddress"].ToString(), ref mSize);
foreach(MailAddress address in mailAddr) {
mail.CC.Add(address);
}
mail.Subject = mymail["Name"].ToString();
mail.SubjectEncoding = enc;
mail.IsBodyHtml = true;
mail.Body = mymail["Body"].ToString();
mail.BodyEncoding = enc;
// 新增附件
SqlDataReader dr = dbmail.GetAttachmentsByMail(int.Parse(mymail["ID"].ToString()));
if(dr != null) {
while(dr.Read()) {
attachment = new Attachment(basePath + dr["URL"].ToString());
attachment.Name = dr["Name"].ToString();
attachment.NameEncoding = enc;
mail.Attachments.Add(attachment);
}
}
client.Send(mail);
// 設定傳送狀態
dbmail.SetSendState(int.Parse(mymail["ID"].ToString()));
} catch(Exception ex) {
MailHelper.SaveLogs(basePath, "傳送第" + i.ToString() + "封郵件時出錯:" + ex.Message);
}
}
mails.Dispose();
}
// 儲存最後傳送時間
dbmail.SetSendState(userId, configId, DateTime.Now, 0);
MailHelper.SaveLogs(basePath, "郵件傳送完成\r\n");
}
}
#endregion
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-609237/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 呼之欲出 WebMail 開發手記 (六) 郵件收取WebAI
- 呼之欲出 WebMail 開發手記 (五) 郵件操作類WebAI
- 呼之欲出 WebMail 開發手記 (四) 郵件收發準備WebAI
- 呼之欲出 WebMail 開發手記 (八) WebServiceWebAI
- 呼之欲出 WebMail 開發手記 (一) 基本功能WebAI
- 郵件開發:傳送程式
- 呼之欲出 WebMail 開發手記 (三) 使用者資訊存取WebAI
- 郵件傳送
- 傳送郵件
- JSP筆記-傳送郵件JS筆記
- SpringBoot整合Mail傳送郵件&傳送模板郵件Spring BootAI
- Laravel 傳送郵件Laravel
- PHP傳送郵件PHP
- Django——郵件傳送Django
- java郵件傳送Java
- Laravel傳送郵件Laravel
- gmail傳送郵件AI
- Oracle郵件傳送Oracle
- java傳送郵件Java
- Powershell郵件傳送
- thinkphp 郵件傳送PHP
- centos 傳送郵件CentOS
- phpcms傳送郵件PHP
- 郵件的傳送
- C#原生郵件傳送+傳送日誌記錄C#
- SSIS遍歷記錄傳送郵件
- Java Mail 郵件傳送(二):簡單封裝的郵件傳送JavaAI封裝
- AOP記錄異常郵件傳送記錄
- Android開發呼叫第三方郵件應用傳送郵件Android
- golang傳送郵件(qq郵箱)Golang
- 郵件傳送API整理API
- php windows 傳送郵件PHPWindows
- 定時傳送郵件
- thinkjs 傳送郵件JS
- 使用phpmailer傳送郵件PHPAI
- Ubuntu的郵件傳送Ubuntu
- python傳送郵件Python
- nodejs 傳送郵件NodeJS