2019年11月4日 星期一

[C# ASP.NET]透過MailServer發送文本內容為HTML文件的Email

        最近工作需求上要寄出多封圖文並茂的系統通知信件,
為了滿足這方面需求而在網上找了些資料後,最終整理出下面這個方法。
傳入內容為HTML格式,利用HTML標記語法可以做到字型大小顏色的相關變化,
也可以插入圖片和連結,相當的方便。

'      StrMailServer               : MailServerIP
'      StrSendFrom               : 寄件人Mail地址
'      StrSendFromPwd        : 寄件人Mail密碼 
'      StrSendFromName     : 寄件人Mail顯示名稱
'      StrSendTo                   : 收件人Mail地址
'      StrSendSubject           : Mail標題 
'      StrHTMLMailBody       : Mail Html內容
'      LResourseArray          : Mail Html內容中引用到的資源陣列(ex: img)
'      AttArray                       : Mail 夾帶的附件資源陣列
'      回傳:錯誤訊息,""空字串代表寄信成功

public static string SendHtmlMail(string StrMailServer, string StrSendFrom,
  string StrSendFromPwd, string StrSendFromName,string StrSendTo,
       string StrSendSubject, string StrHTMLMailBody,
       LinkedResource[] LResourseArray, Attachment[] AttArray)
{
    //錯誤訊息
    string StrErr = "";

    MailMessage MailMsg = new MailMessage();
    //寄件人
    MailMsg.From = new MailAddress(StrSendFrom, StrSendFromName);

    //收件人加入
    try
    {
        MailMsg.To.Add(StrSendTo);
    }
    catch (Exception e)
    {
        StrErr = "收件人格式不對!";
        return StrErr;
    }

    //主旨
    MailMsg.Subject = StrSendSubject;

    //採用HTML格式
    MailMsg.IsBodyHtml = true;

    //訊息內容
    AlternateView htmlView= AlternateView.CreateAlternateViewFromString(StrHTMLMailBody, null, "text/html");
          
    //HTML外部資源加入
    if (LResourseArray != null)
    {
        foreach (LinkedResource LRele in LResourseArray)
        {
            htmlView.LinkedResources.Add(LRele);
        }
    }

    //處理好的HTML訊息內容加入到Mail物件
    MailMsg.AlternateViews.Add(htmlView);

    if (AttArray != null)
    {
        //加入夾帶附件
        foreach (Attachment Attele in AttArray)
        {
            MailMsg.Attachments.Add(Attele);
        }
    }

    //Smtp物件設定
    SmtpClient SClient = new SmtpClient();
    //MailServer
    SClient.Host = StrMailServer;
    //MailServer Port
    SClient.Port = 25;

    //寄件人帳密
    SClient.Credentials = new System.Net.NetworkCredential(StrSendFrom, StrSendFromPwd);

    //是否加密連線
    SClient.EnableSsl = false;

    try
    {
        //寄送
        SClient.Send(MailMsg);
    }
    catch (Exception E)
    {
        //釋放
        MailMsg.Dispose();
        MailMsg = null;

        StrErr = "信件寄送失敗!";
        return StrErr;
    }

    //釋放
    MailMsg.Dispose();
    MailMsg = null;

    return StrErr;
}


此方法需要特別注意傳入HTML文本(StrHTMLMailBody )和引用資源(LResourseArray)的ID
ex:假設在HTML文本中有引用到圖片(<img src="cid:img1" >,cid前置詞代表 Base64 編碼)
而名稱img1必須要和引用資源ID一樣,如下

LinkedResource[] LResourseArray = new LinkedResource[1];
//參數:檔案路徑, MIME類型
LResourseArray[0] = new LinkedResource("D:\\img\\img.jpg", "image/jpg");
//ID要和HTML引用的名稱一樣
LResourseArray[0].ContentId = "img1";
//編碼
LResourseArray[0].TransferEncoding = System.Net.Mime.TransferEncoding.Base64;

        如此就可以在EMail上嵌入圖片了,但是最好盡量避免在信件引用太多資源,
引用大量資源也同時代表EMail大小的膨脹,如果又同時寄出大量信件,勢必會影響效能上運作。
如果真的需要大量圖片的場合,建議可以利用免費空間來上傳圖檔,然後HTML標記用外連方式(ex: src="http://xxx.xxx/img.jpg")來處理引用資源部分。

沒有留言:

張貼留言