C# 自動發送信件需內嵌圖片

  • 9994
  • 0
  • C#
  • 2019-03-20

上篇了解自動發送信件如何發送後,以為後段作業會輕鬆度過。

結果卻被內嵌圖片這件是搞得頭昏腦脹。


信件內嵌圖片

常常我們會看到信件裡面不只是文字外,還會有圖片。起初我一開始一直以為只要利用html <img src="" > 便可以一了了之。

結果,沒想到一直出現下面這個樣子。

可以確定我的html都沒有錯誤但他就是呈現不出來圖片。

因此去查了一下發現,圖片必須要用附加檔案的方式 (Attachments)

https://blog.miniasp.com/post/2008/02/06/How-to-send-Email-with-embedded-picture-image.aspx

但是其實我這個東西只是類似公司的LOGO或是一些圖片資訊,並不需要給使用者附加檔案的樣子。

因此又花了一段時間,終於找到原來要使用 LinkedResource

直接來看程式碼

public void sendGmail()
{
        string Email = email.Text;
        Encoding encode = Encoding.GetEncoding("UTF-8");
        MailMessage mail = new MailMessage();
        //前面是發信email後面是顯示的名稱
        mail.From = new MailAddress("gmail", "xxx");
        //收信者email
        mail.To.Add(Email);   
        //設定優先權
        mail.Priority = MailPriority.Normal;
        //標題
        mail.Subject = "XXX";
        mail.SubjectEncoding = encode;
        
        //內容
        mailBody(mail);

        //內容使用html
        mail.IsBodyHtml = true;
        //設定gmail的smtp
        SmtpClient MySmtp = new SmtpClient("smtp.gmail.com", 587);
        //您在gmail的帳號密碼
        MySmtp.Credentials = new System.Net.NetworkCredential("account", "pw");
        //開啟ssl
        MySmtp.EnableSsl = true;
        //發送郵件
        MySmtp.Send(mail);
        //放掉宣告出來的MySmtp
        MySmtp = null;
        //放掉宣告出來的mail
        mail.Dispose();
    }



public void mailBody(MailMessage mail)
{
   string palinBody ="【XXXX】";
   AlternateView plainView = AlternateView.CreateAlternateViewFromString(
            palinBody, null, "text/plain");

   string htmlBody = "<p> 此為系統主動發送信函,請勿直接回覆此封信件。</p> ";
        htmlBody += "<img alt=\"\" hspace=0 src=\"cid:logo\" align=baseline border=0 >";

   AlternateView htmlView = 
           AlternateView.CreateAlternateViewFromString(htmlBody, null, "text/html");
   imgResource(htmlView, "logo.jpg", "image/jpg");


   // add the views
   mail.AlternateViews.Add(plainView);
   mail.AlternateViews.Add(htmlView);
}


public void imgResource(AlternateView htmlView, string imgName, string imgType)
{
   // create image resource from image path using LinkedResource class..   
   LinkedResource imageResource = new LinkedResource(getImgPath(imgName), imgType);
   string[] imgArr = imgName.Split('.');
   imageResource.ContentId = imgArr[0];
   imageResource.TransferEncoding = TransferEncoding.Base64;
   htmlView.LinkedResources.Add(imageResource);

}

private string getImgPath(string strImgName)
{
   //設定(絕對)圖片路徑
   string strImgPath = @"C:\xxxxx\img\" + strImgName;
   return strImgPath;
}

需要注意的是cid 後面的名稱 跟 imageResource.ContentId 要一致,不然會有問題。


收到mail就可以看到我們內嵌成功啦!!!!


在寫的過程中,一個不小心在 imageResource.ContentId = logo.jpg 

結果發現竟然便成附件了!!!

如果之後需要附加檔案可以利用這個方法。


參考資料:

1.最有幫助:http://aspalliance.com/1411_Using_LinkedResource_Class_for_Sending_HTML_Email_in_NET_20.6

2.http://lesliechang-blog.logdown.com/posts/255333 (使用這個代碼會有點小報錯,我出現附加檔案可是卻不能打開。但圖片仍有出來)