2015年4月13日 星期一

[C#] 以SMTP 發送E-mail

簡單來講就是建立一個MailMessage物件,再透過SmtpClient物件將信透過SMTP(Simple

Mail Transport Protocol)傳送到SMTP伺服器做傳送的動作。

分成3個部份

1.發送mail函式。

  /// <summary>  
     /// 完整的寄信函數  
     /// </summary>  
     /// <param name="MailFrom">寄信人Email Address</param>  
     /// <param name="MailTos">收信人Email Address</param>  
     /// <param name="Ccs">副本Email Address</param>  
     /// <param name="MailSub">主旨</param>  
     /// <param name="MailBody">內文</param>  
     /// <param name="isBodyHtml">是否為Html格式</param>  
     /// <param name="files">要夾帶的附檔</param>  
     /// <returns>回傳寄信是否成功(true:成功,false:失敗)</returns>  
     public bool Send_Mail(string MailFrom, string[] MailTos, string[] Ccs, string MailSub, string MailBody, bool isBodyHtml, Dictionary<string, Stream> files)  
     {         
       try  
       {  
         //沒給寄信人mail address  
         if (string.IsNullOrEmpty(MailFrom))  
         {//※有些公司的Smtp Server會規定寄信人的Domain Name須是該Smtp Server的Domain Name,例如底下的 system.com.tw  
           MailFrom = "sysadmin@system.com.tw";  
         }  
         //建立MailMessage物件  
         MailMessage mms = new MailMessage();  
         //指定一位寄信人MailAddress  
         mms.From = new MailAddress(MailFrom);  
         //信件主旨  
         mms.Subject = MailSub;  
         //信件內容  
         mms.Body = MailBody;  
         //信件內容 是否採用Html格式  
         mms.IsBodyHtml = isBodyHtml;  
         if (MailTos != null)//防呆  
         {  
           for (int i = 0; i < MailTos.Length; i++)  
           {  
             //加入信件的收信人(們)address  
             if (!string.IsNullOrEmpty(MailTos[i].Trim()))  
             {  
               mms.To.Add(new MailAddress(MailTos[i].Trim()));  
             }  
           }  
         }//End if (MailTos !=null)//防呆  
         if (Ccs != null) //防呆  
         {  
           for (int i = 0; i < Ccs.Length; i++)  
           {  
             if (!string.IsNullOrEmpty(Ccs[i].Trim()))  
             {  
               //加入信件的副本(們)address  
               mms.CC.Add(new MailAddress(Ccs[i].Trim()));  
             }  
           }  
         }//End if (Ccs!=null) //防呆  
            //附件處理  
           if (files != null && files.Count > 0)//寄信時有夾帶附檔  
           {  
             foreach (string fileName in files.Keys)  
             {  
               Attachment attfile = new Attachment(files[fileName], fileName);  
               mms.Attachments.Add(attfile);  
             }//end foreach  
           }//end if  
           using (SmtpClient client = new SmtpClient(smtpServer,smtpPort))//或公司、客戶的smtp_server  
           {  
             if (!string.IsNullOrEmpty(mailAccount) && !string.IsNullOrEmpty(mailPwd))//.config有帳密的話  
             {                             
               client.Credentials = new NetworkCredential(mailAccount, mailPwd);//寄信帳密  
             }  
             client.Send(mms);//寄出一封信  
           }//end using  
           //釋放每個附件,才不會Lock住(不過即使附加檔案失敗,也會寄出信去)  
           if (mms.Attachments != null && mms.Attachments.Count>0)  
           {  
             for (int i = 0; i < mms.Attachments.Count;i++ )  
             {  
               mms.Attachments[i].Dispose();  
               //mms.Attachments[i] = null;  
             }  
           }  
         return true;//成功  
       }  
       catch (Exception ex)  
       {  
         //寄信失敗,寫Log文字檔  
         Console.WriteLine("寄信失敗" + ex.StackTrace);  
         return false;  
       }  
     }//End 寄信  

2.將附加檔案轉換成Stream。

  /// <summary>  
     /// 將附加檔案轉換成Stream  
     /// </summary>  
     /// <param name="file">檔案完整路徑</param>  
     /// <returns>回傳Stream</returns>  
     private Stream FileToStream(string file)  
     {  
       Stream sf = File.OpenRead("d:\\cpu.txt");  
       System.IO.MemoryStream data = new System.IO.MemoryStream();  
       sf.CopyTo(data);  
       data.Seek(0, SeekOrigin.Begin);  
       byte[] buf = new byte[data.Length];  
       data.Read(buf, 0, buf.Length);  
       //再移到位置0,附加檔案時才可以被讀取  
       data.Seek(0, SeekOrigin.Begin);  
       return data;  
     }  


3.主程式

     private string smtpServer = "your mail smtp server";  
     private int smtpPort = 25;  
     private string mailAccount="sample";  
     private string mailPwd = "sampelPW";  
     private void button1_Click(object sender, EventArgs e)  
     {  
       //收件人名單  
       string receiveMails = "sample1@yahoo.com.tw,sample2@yahoo.com.tw";  
       //主旨  
       string mailTitle = "C# 寄信來了";  
       //寄件人(通常是寄件本人)  
       string sendMail = "sample1@yahoo.com.tw";  
       //副件名單  
       string[] Cc ={"sample3@gmail.com"};  
       //信件內容  
       string mailbody="test send mail by c#" ;        
       //切割收件人名單  
       string[] _receiveMail=receiveMails.Split(new string[]{","},StringSplitOptions.RemoveEmptyEntries);  
       //附加檔案  
       string filename="d:\\CPU.TXT";  
       Dictionary<string, Stream> listFile = new Dictionary<string, Stream>();  
       //把檔案轉換成Stream  
       listFile.Add(Path.GetFileName(filename), FileToStream(filename));  
       //寄信  
       Send_Mail(sendMail, _receiveMail, Cc, mailTitle, mailbody, true, listFile);  
     }  


程式碼中的Email以及帳密已經過變更,請以自己的為主,以下截圖為真實收到信的情況
















接下來我們來打開附檔,是本機的CPU資訊檔案。


















































其實是可以發送HTML格式的內文。

例如我們把

string mailbody="test send mail by c#" ;

改成

 string mailbody="test <br />send <br />mail ";  


則會有如下的結果












還有另一件事就是寄件人的問題,一般而言是應該要寫在smtp伺服器上你自己的e-mail,

但有些伺服器並不會擋,所以即使你亂寫,它還是會讓你寄,有些則會擋下假的email

地址,所以還是要守規矩,建立良好的信用,本篇純教學用途。


參考資料來源

http://www.dotblogs.com.tw/shadow/archive/2011/05/23/25887.aspx

沒有留言:

張貼留言