ASP.NET 實現傳送郵件 + 多個收件人 + 多個附件
最近專案中需要實現傳送郵件+新增附件的功能,於是又學習了一下System.Net.Mail.MailMessage和System.Net.Mail.SmtpClient等幾個.Net中發郵件的幾個類,根據網上的一些程式碼,做了一個小Demo分享一下。
介面效果
老規矩,還是先看效果,以下為傳送郵件的介面:
發件人輸入傳送人的郵箱、密碼;
收件人欄目可輸入多個收件人,多個收件人之間需要用英文狀態下的分號“ ; ”來隔開(當然這只是一種方式,還可以根據需求設計輸入聯絡人的方式,如從通訊錄選擇聯絡人等);
主題、內容不再多說,附件可選擇多個附件,這裡只畫了三個input控制元件,也可以根據需求增刪控制元件或動態設定控制元件數量。
程式碼
下面來看程式碼,根據程式碼整理思路:
這是這個小Demo的解決方案結構:
根目錄建立了一個files資料夾,作為客戶端傳送郵件時在服務端的一個臨時目錄(這裡如果不明白,請繼續往下看)。
介面程式碼:
Default.aspx
介面程式碼比較簡單,這裡不再多說。<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="SendEmail_Attachments.Default" %> <!DOCTYPE html> <html> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <form id="form1" runat="server"> <div> <table align="center" border="0" cellpadding="0" cellspacing="0" width="776"> <tr> <td> <table align="center" border="0" cellpadding="4" cellspacing="1" width="600" bgcolor="#cccccc"> <tr> <td colspan="2" bgcolor="#f0f0f0" align="center">傳送郵件+多收件人+多附件</td> </tr> <tr> <td bgcolor="#f0f0f0" align="right" style="width: 73px">傳送人:</td> <td bgcolor="#ffffff" align="left"> <asp:TextBox ID="fromMail" runat="server" Width="300" /></td> </tr> <tr> <td bgcolor="#f0f0f0" align="right" style="width: 73px">密 碼:</td> <td bgcolor="#ffffff" align="left"> <asp:TextBox ID="password" runat="server" Width="300" TextMode="Password"/></td> </tr> <tr> <td bgcolor="#f0f0f0" align="right" style="width: 73px; height: 32px">收件人:</td> <td bgcolor="#ffffff" align="left" style="height: 32px"> <asp:TextBox ID="toMail" runat="server" TextMode="multiLine" Width="300px" Height="22"/><asp:Label ID="Label1" runat="server" Text="多個收件人請用分號隔開" ForeColor="Red"></asp:Label></td> </tr> <tr> <td bgcolor="#f0f0f0" align="right" style="width: 73px">主 題:</td> <td bgcolor="#ffffff" align="left"> <asp:TextBox ID="subject" runat="server" Width="300" /></td> </tr> <tr> <td bgcolor="#f0f0f0" align="center" style="width: 74px">附 件:</td> <td bgcolor="#ffffff" align="left"> <input type="file" id="upfile1" runat="server" style="width: 297px"/> <input type="file" id="upfile2" runat="server" style="width: 297px"/> <input type="file" id="upfile3" runat="server" style="width: 297px"/> </td> </tr> <tr> <td bgcolor="#f0f0f0" align="right" style="width: 73px">內 容:</td> <td bgcolor="#ffffff" align="left"> <asp:TextBox ID="body" TextMode="multiLine" runat="server" Width="500px" Height="200" /></td> </tr> <tr> <td bgcolor="#f0f0f0" align="right" style="width: 73px">格 式:</td> <td bgcolor="#ffffff" align="left"> <asp:RadioButtonList ID="format" runat="server" /></td> </tr> <tr> <td bgcolor="#f0f0f0" colspan="2" align="center"> <asp:Button ID="send" runat="server" Text="傳送" OnClick="send_Click" /> <asp:Button ID="reset" runat="server" Text="重置" /> </td> </tr> </table> </td> </tr> </table> </div> </form> </body> </html>
服務端程式碼:
Default.aspx.cs
注意引用相應的名稱空間
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Net.Mail; using System.Text; using System.Net; using System.IO; namespace SendEmail_Attachments { public partial class Default : System.Web.UI.Page { //ASP.NET傳送郵件帶附件 http://blog.csdn.net/hope94/article/details/4364471 protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { format.Items.Add(new ListItem("文字", "0")); format.Items.Add(new ListItem("HTML", "1")); format.Items[0].Selected = true; } } /// <summary> /// 傳送郵件的點選事件 /// </summary> /// <param name="obj"></param> /// <param name="e"></param> protected void send_Click(object obj, EventArgs e) { bool flag = SendMail(); if (flag == true) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('傳送成功!');</script>"); } else { Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('傳送失敗!');</script>"); } } /// <summary> /// 傳送郵件的執行過程 /// </summary> /// <returns></returns> public bool SendMail() { //例項化MailMessage類,該類表示可以使用 SmtpClient 類傳送的電子郵件 //這裡myEmail就表示將要傳送的電子郵件例項 MailMessage myEmail = new MailMessage(); myEmail.From = new MailAddress(fromMail.Text.Trim()); //電子郵件的發件人 myEmail.Subject = subject.Text.Trim(); //電子郵件的主題 myEmail.IsBodyHtml = format.SelectedItem.Value == "0" ? false : true; //設定電子郵件正文格式是否為HTML格式 //遍歷收件人郵箱地址,並新增到此郵件的收件人裡 if (toMail.Text.Trim().Length != 0) { string[] receivers = toMail.Text.Trim().Split(';'); for (int i = 0; i < receivers.Length; i++) { if (receivers[i].Length > 0) { myEmail.To.Add(receivers[i]); //為該電子郵件新增聯絡人 } } } //遍歷從客戶端接收到的附件,並依次新增到郵件的附件中 HttpFileCollection uploadFilCol = Request.Files; for (int i = 0; i < uploadFilCol.Count; i++) { string ServerFileName = ""; HttpPostedFile file = uploadFilCol[i]; if (file.ContentLength != 0) { try { string upFileName = file.FileName; string[] strTemp = upFileName.Split('.'); string upFileExp = strTemp[strTemp.Length - 1].ToString(); string fileName = upFileName.Substring(upFileName.LastIndexOf("\\") + 1); ServerFileName = Server.MapPath("/files") + "\\" + fileName; file.SaveAs(ServerFileName); //將此檔案臨時儲存到服務端的files目錄 myEmail.Attachments.Add(new Attachment(ServerFileName)); //為該電子郵件新增附件 } catch (Exception ex) { Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert(" + ex.Message + ");</script>"); throw; } } } myEmail.Body = body.Text.Trim(); //電子郵件的主體內容 myEmail.BodyEncoding = Encoding.UTF8; //電子郵件主體內容的編碼方式 myEmail.Priority = MailPriority.High; //設定此電子郵件的優先順序 //例項化SmtpClient類,該類用於將電子郵件傳送到 SMTP 伺服器以便傳遞 SmtpClient smtp = new SmtpClient(); smtp.Credentials = new NetworkCredential(fromMail.Text.Trim(), password.Text.Trim()); //設定用於驗證發件人身份的憑據 smtp.Port = 25; //設定用於 SMTP 事務的埠 //根據發件人的電子郵件地址判斷髮件伺服器地址 if (fromMail.Text.Trim().Length != 0) { string[] addressor = fromMail.Text.Trim().Split(new Char[] { '@', '.' }); switch (addressor[1]) { case "163": smtp.Host = "smtp.163.com"; break; case "gmail": smtp.Host = "smtp.gmail.com"; break; case "hotmail": smtp.Host = "smtp-mail.outlook.com"; break; case "qq": smtp.Host = "smtp.qq.com"; break; case "foxmail": smtp.Host = "smtp.qq.com"; break; case "sina": smtp.Host = "smtp.sina.com.cn"; break; } } smtp.EnableSsl = true; //指定 SmtpClient 是否使用安全套接字層(SSL)加密連線 try { smtp.Send(myEmail); //傳送該郵件 myEmail.Dispose(); //關閉郵件使用的所有程序 DeleteFiles(); //刪除臨時目錄files中剛剛上傳的所有附件 } catch (Exception e) { DeleteFiles(); //刪除臨時目錄files中剛剛上傳的所有附件 Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('傳送失敗,請檢查您的郵箱賬號和密碼是否填寫正確!');</script>"); ; } return true; } /// <summary> /// 遍歷刪除files資料夾內所有剛剛上傳的附件 /// </summary> protected void DeleteFiles() { DirectoryInfo files = new DirectoryInfo(Server.MapPath("/files")); foreach (System.IO.FileInfo f in files.GetFiles("*.*")) { f.Delete(); } } } }
System.Net.Mail.MailMessage類
在MSDN上可以查到,MailMessage的屬性如下:
其中收件人To屬性、抄送CC、密送BCC和附件Attachments都可以為多個值,所以在上面程式碼中,在傳送函式SendEmail()中才可以為郵件新增多個收件人和多個附件,這裡沒有新增密送和抄送的功能,但道理一樣。
System.Net.Mail.SmtpClient類
SmtpClient的屬性有:
方法有:
根據這些屬性和方法,您肯定能夠理解程式碼中SmtpClient是如何將電子郵件傳送出去了,這裡說明幾點注意事項:
SmtpClient的Host屬性,傳送不同型別的電子郵件使用的伺服器是不同的,因此Host屬性也是不同的,如果您有多個種類的郵箱,那麼可以看一下您每個郵箱的發件伺服器的地址是不是不同的,比如:
163郵箱的發件伺服器地址為:smtp.163.com
谷歌郵箱的發件伺服器地址為:smtp.gmail.com
Hotmail郵箱的發件伺服器地址為:smtp-mail.outlook.com
Foxmail和QQ郵箱的發件伺服器地址為:smtp.qq.com
所以在程式碼中,加了一個Switch來根據發件人郵箱型別來設定發件伺服器地址~∪~
最後郵件傳送成功或者失敗時,都需要呼叫一下DeleteFiles()函式,來刪除剛剛上傳到伺服器上的臨時檔案(附件),說一下為什麼要增加這個files資料夾,因為這個例子在一臺電腦上做測試完全不必加這個資料夾,直接把本地檔案作為附件新增到MailMessage的例項就行,但因為為MailMessage新增附件這句程式碼myEmail.Attachments.Add(new Attachment(ServerFileName)); 是執行在服務端的,因此如果程式釋出,在異地執行操作時就不可行了,所以需要先把附件上傳到服務端(這裡就在服務端添加了files資料夾用來存放臨時檔案),再為MailMessage新增該附件,最後清理上傳到客戶端的附件。
暫時先做成這樣,後面有需求時再進行優化。
原創不易,最後附上參考文章:
本例是在此文基礎上修改而來