最近有個地方用到正文帶圖片的郵件發送功能,由於發送郵件調用的是web service,要求正文必須是string,而接收方要能看到圖片,還不能單純的添加一個圖片地址鏈接,查閱了很多資料,基本上都是從頭寫郵件發送類,以附件的形式上傳圖片然后替換這么個思路,不適合我目前的需求。思考了很久:不管是圖片也好,文字也好還是其他的什么文件,在網路上傳輸肯定都是數據流,無非是到了目的地數據流每一段解析的方式不同而已,那么能不能將郵件發送數據看成是一個數據流,文字和圖片都在里面呢?
使用OUTLOOK發送了一個帶圖片的郵件,收到之后另存MHT分析其代碼:
發現帶圖片img標簽的src屬性后面是一大堆字符<img alt="" src="data:image/png;base64, SkZJRgABAQEAZA…" />,那這個"亂碼"肯定就是圖片了!
再次查閱了一些資料得知郵件在網路上傳輸一般都要通過base 64編碼,然后直接賦給src
Data URI scheme是在RFC2397中定義的,目的是將一些小的數據,直接嵌入到網頁中,從而不用再從外部文件載入。在上面的Data URI中,data表示取得數據的協定名稱,image/png 是數據類型名稱,base64 是數據的編碼方法,逗號后面就是這個image/png文件base64編碼后的數據。 |
這就好辦了,先實現將圖片轉換為"字符串"替換到那個位置不就OK了?
base 64編碼方法:
Bitmap bmp = new Bitmap(Imagefilename); MemoryStream ms = new MemoryStream(); String strbaser64 = Convert.ToBase64String(arr); |
Imagefilename是圖片路徑
strbaser64是編碼后的字符串
然后寫HTML郵件正文:
<BODY style="MARGIN: 10px"><DIV><IMG src="data:image/png;base64, SkZJRgABAQEAZA…"> </IMG></DIV></BODY> |
將轉換成為字符串的圖片放到這個位置:下圖是我在163信箱做的實驗(注意要切換到HTML源碼試圖下)
點擊發送,然后過去收:
發現已經還原成為圖片了,初步實驗成功。
然后再試試使用代碼發送,簡單發送代碼如下:
System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("smtp.163.com"); client.UseDefaultCredentials = true;//設置為發送認證消息 client.Credentials = new System.Net.NetworkCredential("用戶名", "密碼");//認證消息 System.Net.Mail.MailMessage mess = new System.Net.Mail.MailMessage(); mess.From = new System.Net.Mail.MailAddress("shiyeping@163.com", "發信人的名稱"); mess.To.Add(new System.Net.Mail.MailAddress("shiyeping@163.com", "收信人的名稱")); mess.Subject = "主題"; mess.IsBodyHtml = true; mess.Body = "HTML格式的正文"; try { client.Send(mess); MessageBox.Show("發送成功完成"); } catch (Exception ex) { MessageBox.Show(ex.Message); } |
正文用變量表示如下:
string mailBody = "<BODY style=\"MARGIN: 10px\"><DIV><IMG src=\"data:image/png;base64,/9j/4AAQSkZ….WRN6iXizpJL//Z\"> </IMG></DIV></BODY> "; |
*注意轉義
發送成功之后再去郵箱就可以看到圖片已經正常顯示出來了:
同樣道理,如果要在郵件正文里面加一個視頻?FLASH 動畫?聲音?…?
我沒試,如果你有興趣可以試試,我只是推理!
附測試代碼下載:點擊下載