呼之欲出 WebMail 開發手記 (七) 郵件傳送

iDotNetSpace發表於2009-07-15


與收郵件相比,發郵件就相對要簡單一些。

首先、使用者需要設定當前預設的傳送郵箱伺服器(從郵箱設定中選擇一個),這樣方便自動提交呢稱和對方需要回復郵件時的回覆地址等。當然傳送郵件的時候我們還可以設定郵件模板,比如業務員自己的相關聯絡,電話號碼,地址等等。這些只是頁面的東西,這次還是講多執行緒傳送郵件。

第二、發郵件的時候,如果使用者選擇郵件傳送級別為高階,就應當立即傳送(要不然,延務了使用者的時間可不要找我哦~~),其他的才可以暫時放到執行緒裡面,由伺服器自動處理。

呼之欲出 WebMail 開發手記 (七) 郵件傳送
呼之欲出 WebMail 開發手記 (七) 郵件傳送#region 傳送郵件
呼之欲出 WebMail 開發手記 (七) 郵件傳送
public void SendStart() {
    
if (userId == 0 || _threadSend != null)
        
return;
呼之欲出 WebMail 開發手記 (七) 郵件傳送    
lock(this{
呼之欲出 WebMail 開發手記 (七) 郵件傳送        
if(_smtpState != 0{
            _smtpState 
= 0;
        }

        _threadSend 
= new Thread(new ThreadStart(BeginSend));
        _threadSend.Start();
    }

}


呼之欲出 WebMail 開發手記 (七) 郵件傳送
public void SendStop() {
呼之欲出 WebMail 開發手記 (七) 郵件傳送    
if (_threadSend != null{
        _threadSend.Abort();
        _threadSend 
= null;
    }

}


呼之欲出 WebMail 開發手記 (七) 郵件傳送
private void BeginSend() {
    SqlDataReader configs 
= (new Config()).GetConfigs(userId);
呼之欲出 WebMail 開發手記 (七) 郵件傳送    
if(configs != null{
        _smtpTime 
= DateTime.Now;
        _smtpState 
= 1;
呼之欲出 WebMail 開發手記 (七) 郵件傳送        
while(configs.Read()) {
            DateTime pTime 
= DateTime.Parse(configs["smtpTime"].ToString());
            TimeSpan m 
= DateTime.Now - pTime;
            
// 每10分鐘傳送郵件一次/超過100分鐘也重新傳送
呼之欲出 WebMail 開發手記 (七) 郵件傳送
            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 
= "傳送完成";
呼之欲出 WebMail 開發手記 (七) 郵件傳送    }
 else {
        _smtpState 
= 3;
        _smtpMessage 
= "無配置資訊";
    }

    _threadSend 
= null;
}

#endregion

 

傳送郵件我們使用 System.Net.Mail 下面的 MailMessage 類,記住一定要設定郵件主題、內容、附件等的編碼,一般我們設定 gb2312 就可以了,當然也可以使用 utf-8 可能會更好:

呼之欲出 WebMail 開發手記 (七) 郵件傳送
呼之欲出 WebMail 開發手記 (七) 郵件傳送#region 傳送單個郵箱的郵件
呼之欲出 WebMail 開發手記 (七) 郵件傳送
/// 
/// 傳送單個郵箱的郵件
/// 

呼之欲出 WebMail 開發手記 (七) 郵件傳送public void Send(int configId, string smtpUid, string smtpPwd, string smtpAddress, int smtpPort, byte smtpAuth, string smtpReply, string smtpName) {
呼之欲出 WebMail 開發手記 (七) 郵件傳送    
if(!string.IsNullOrEmpty(smtpAddress)) {
        MailHelper.SaveLogs(basePath, _smtpMail);
//string.Format("開始傳送 {0} 的郵件, 當前使用者ID是 {1}", _smtpMail, userId));

        _smtpMessage 
= "正在檢查需要傳送的郵件";

        DataSet mails 
= dbmail.GetNeedSendMailsByConfigDS(configId);
呼之欲出 WebMail 開發手記 (七) 郵件傳送        
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;
呼之欲出 WebMail 開發手記 (七) 郵件傳送            
if(smtpAuth == 1{
                client.UseDefaultCredentials 
= true;
                client.Credentials 
= new System.Net.NetworkCredential(smtpUid, smtpPwd);
            }

            
// 依次傳送郵件
呼之欲出 WebMail 開發手記 (七) 郵件傳送
            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];
呼之欲出 WebMail 開發手記 (七) 郵件傳送                
try {
                    mail 
= new MailMessage();
                    mail.From 
= new MailAddress(smtpReply, smtpName);
                    
// 設定優先順序別
呼之欲出 WebMail 開發手記 (七) 郵件傳送
                    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);
呼之欲出 WebMail 開發手記 (七) 郵件傳送                    
foreach(MailAddress address in mailAddr) {
                        mail.To.Add(address);
                    }


                    mailAddr 
= MailHelper.GetAddress(mymail["CCAddress"].ToString(), ref mSize);
呼之欲出 WebMail 開發手記 (七) 郵件傳送                    
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()));
呼之欲出 WebMail 開發手記 (七) 郵件傳送                    
if(dr != null{
呼之欲出 WebMail 開發手記 (七) 郵件傳送                        
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()));
呼之欲出 WebMail 開發手記 (七) 郵件傳送                }
 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章