1. 程式人生 > >ASP.NET 實現傳送郵件 + 多個收件人 + 多個附件

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新增該附件,最後清理上傳到客戶端的附件。

        暫時先做成這樣,後面有需求時再進行優化。

        原創不易,最後附上參考文章:

        本例是在此文基礎上修改而來