使用MailKit發送帶有內嵌圖片的郵件且圖片不顯示成附件 參考文章:MailKit 發送郵件 註意 在郵件客戶端中是否顯示內嵌圖片為附件依據不同郵件有所不同,暫經測試Outlook和qq不顯示為附件,新浪郵箱會顯示附件。 概述 要發送一封帶有複雜格式的郵件,且正文內容中帶有複雜的圖片,以一封阿裡雲 ...
使用MailKit發送帶有內嵌圖片的郵件且圖片不顯示成附件
參考文章:MailKit---發送郵件
註意
在郵件客戶端中是否顯示內嵌圖片為附件依據不同郵件有所不同,暫經測試Outlook和qq不顯示為附件,新浪郵箱會顯示附件。
概述
要發送一封帶有複雜格式的郵件,且正文內容中帶有複雜的圖片,以一封阿裡雲發送的郵件為例,其中還有5張圖片。現在想要使用MailKit這個庫來發送郵件,郵件模板中也含有圖片,該如何發送呢。
知識點
MIME-多用途互聯網郵件擴展類型
一封含有複雜內容的郵件可以如下圖表示,分為alternative、related、mixed三個部分,alternative部分包含純文本和超文本內容,related包含alternative部分和內嵌資源,mixed部分包含related部分和附件。
文章中圖片一般是作為圖中的內嵌資源,所以不會出現在郵件的附件列表中。
實踐
我們現在用這封阿裡雲的郵件作為模板,用MailKit發送這封郵件,且收到後的郵件效果相同。
準備工作
將郵件下載到本地,保存為Html文件,並將郵件中用到的圖片資源下載下來,將Html文件和圖片放在一個文件中一次作為一個模板。
代碼實現
實現步驟主要問,組裝正文部分包裹在alternative中,然後將alternative和內嵌資源包裹在related中,再將related用mixed包裹,將以上內容複製給郵件正文。
圖片的鏈接進行格式處理,原:<img src="xxx/xxx/xx.jpg"/>,修改為<img src="cid:aaaaaaaa"/>。詳見代碼中射擊ContentId部分。
使用bodyBuilder來構建郵件正文。具體見代碼。
public bool SendEmailToSingle(string toEmail, string Subject, string FormatId) { try { var message = new MimeMessage(); message.To.Add(new MailboxAddress(toEmail)); message.From.Add(new MailboxAddress(EmailDisplayName, EmailUserName)); message.Subject = Subject; // 獲取郵件模板 string FullFormatPath = Path.Combine(Environment.CurrentDirectory, "Content", FormatId); string[] ImgPaths = Directory.GetFiles(Path.Combine(FullFormatPath, "Resources")); string HtmlFormat = string.Empty; var builder = new BodyBuilder(); using (FileStream fs = new FileStream(Path.Combine(FullFormatPath, "format.htm"), FileMode.Open)) { using (StreamReader sr = new StreamReader(fs, Encoding.GetEncoding("gbk"))) { HtmlFormat = sr.ReadToEnd(); } } // 將圖片加入內嵌資源,並更換郵件中的圖片的鏈接 foreach (string imgpath in ImgPaths) { var image = builder.LinkedResources.Add(imgpath); image.ContentId = MimeUtils.GenerateMessageId(); HtmlFormat = HtmlFormat.Replace(Path.GetFileName(imgpath), string.Format("cid:{0}", image.ContentId)); } builder.HtmlBody = HtmlFormat; message.Body = builder.ToMessageBody(); //return message; using (SmtpClient client = new SmtpClient()) { client.ServerCertificateValidationCallback = (s, c, h, e) => true; client.Connect(EmailServerAddress, EmailServerPort, false); client.Authenticate(EmailUserName, EmailPassword); client.Send(message); client.Disconnect(true); } return true; } catch (Exception) { return false; } }
發送後收到的郵件