如何發送內嵌圖片的 E-mail ( Inline Attachment )

  分享到噗浪!

我們在發送 HTML 郵件時,通常會將網頁中的圖片都全部上傳到網站,然後在 E-Mail 內的所有圖片就直接設定絕對網址(Absolute URL)就可以了,但這有個缺點,就是當使用者「看信」的時候如果沒有上網,將會無法看到完整的郵件內容,因為沒網路無法下載圖片。

我們也有另一種選擇,就是將圖片、CSS直接內嵌到郵件中,使用者收到信的時候不會看到有個「附件」在郵件裡,而是直接將圖片顯示在郵件本文裡,又不用上網下載圖片,但唯一的缺點就是每一封郵件的 KB 數會比較大,發送的時候比較暫頻寬。

我在【System.Web.Mail 太陽春、System.Net.Mail 有問題】這篇文章已經有提到在使用 System.Net.Mail 時最好採用 UTF-8 編碼,雖然不會影響附件檔案的發送,但還是提醒各位要注意字集的問題。

以下是範例程式:

 

using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Mail;

namespace SystemNetMailTest
{
   class Program
   {
      static void Main(string[] args)
      {
         string myMailEncoding = "utf-8";

         string myFromEmail = "testtest.com";
         string myFromName = "測試寄件者";

         string myToEmail = "testtest.com";
         string myToName = "測試收件者";

         MailAddress from = 
            new MailAddress(myFromEmail, myFromName, 
                Encoding.GetEncoding(myMailEncoding));
         MailAddress to = 
            new MailAddress(myToEmail, myToName, 
                Encoding.GetEncoding(myMailEncoding));

         MailMessage myMessage = new MailMessage(from, to);

         myMessage.Subject = "郵件主旨";
         myMessage.SubjectEncoding = Encoding.GetEncoding(myMailEncoding);

         myMessage.Body = "<h1>這是郵件內容</h1><hr/><img src=\"Logo.gif\" />";
         myMessage.BodyEncoding = Encoding.GetEncoding(myMailEncoding);

         myMessage.IsBodyHtml = true;

         myMessage.Priority = MailPriority.High;

         // 設定附件檔案(Attachment)

         string strFilePath = @"C:\Logo.gif";

         System.Net.Mail.Attachment attachment1 =
            new System.Net.Mail.Attachment(strFilePath);
         attachment1.Name = System.IO.Path.GetFileName(strFilePath);
         attachment1.NameEncoding = Encoding.GetEncoding(myMailEncoding);
         attachment1.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;

         // 設定該附件為一個內嵌附件(Inline Attachment)
         attachment1.ContentDisposition.Inline = true;
         attachment1.ContentDisposition.DispositionType =
            System.Net.Mime.DispositionTypeNames.Inline;

         myMessage.Attachments.Add(attachment1);

         SmtpClient smtp = new SmtpClient("localhost");

         try
         {
             smtp.Send(myMessage);
             Console.WriteLine(DateTime.Now.ToString() + " 寄信成功");
         }
         catch
         {
             Console.WriteLine(DateTime.Now.ToString() + " 寄信失敗!!!");
         }

         Console.ReadKey();
     }
  }
}

以上的範例特別要注意的地方就是在使用 <img src="logo.gif" /> 的時候,必須要跟在 C# 中設定 attachment1.Name 的設定一模一樣才會正確顯示圖片!

如下圖示,郵件中看的到圖片,但沒有附件的檔案,使用者幾乎沒辦法辨識「內嵌圖檔」與「設定圖片網址」這兩種方式的差異。

 內嵌圖片的 E-mail 圖示

相關網址如下:

此文章由 will 發表於 2008/2/6 下午 03:04:00

永久連結 | 評論 (21) | 此文章的RSSRSS comment feed |

分類: .Net | C#

標籤: , , ,

評論

七月 31. 2008 12:36

willym

請問您在附件檔案寄出時,附件檔案是否有檔案的限制?
因為先前是初如果大於1MB檔案時,附件信件無法寄出!

非常感謝您!!

willym Taiwan

七月 31. 2008 12:44

Will 保哥

檔案大小的限制是在「郵件伺服器」(Mail Server)設定的,跟 .NET 沒關係。

如果你發信不出去,你可以看你用哪一台 SMTP Server 發信,然後去查那一台主機的「單一郵件最大限制」的相關設定。

Will 保哥 Taiwan

七月 31. 2008 12:51

willym

非常感謝您

willym Taiwan

九月 22. 2008 15:33

Peggy

我想請問~~
若我程式完整了
收件者但是卻遲遲收不到信件~~
是遺漏掉何處ㄋ

Peggy Taiwan

九月 22. 2008 15:38

will

有許多可能耶,例如:
1. 本機的 SMTP 伺服器沒發信,或因為網路問題暫時沒發信
2. 收件者端的 SMTP 沒收信或無法收信
3. 收了信被丟棄(例如被辨識為垃圾信)
4. ... ...

will Taiwan

十一月 20. 2008 12:56

Jeffrey

我想請問,依照您的範例寄出去,信件的圖片是附加檔案而不是內崁圖片,要如何修改才能變成內崁圖片?

Jeffrey Taiwan

十一月 20. 2008 13:49

will

你設定的 attachment1.Name 必須要跟你郵件中的 <img src="XXXXX"> 的 XXXXX 部分一模一樣才行。

will Taiwan

十一月 21. 2008 09:30

Jeffrey

Dear will,
請問<img src="XXXXX"> 中的XXXXX,依您的例子指的是"Logo.gif",而不是"C:\Logo.gif",所以我的attachment1.Name 要等於Logo.gif,等於 圖檔名稱 + 附檔名,是這個意思嗎?

這一部份我目前的設定也是如此,但是寄出去的MAIL圖片可以在MAIL中顯現沒問題,但是,該圖檔仍會以附加檔案的方式存在,我想請問的是,要如何只秀出圖片內崁在MAIL中,而不附加於檔案.

Jeffrey Taiwan

十一月 21. 2008 10:35

will

那是你的收信軟體的問題,因為這是一個 Inline 附件,有些 Mail Client 會顯示,有些不會,要看怎麼實做。像我的 Outlook 在收到信中有包括 Inline 附件的檔案,就不會顯示。

will Taiwan

十一月 22. 2008 09:51

Jeffrey

Dear Will,
這一部份我實測過,同樣的收信軟體,可以收到有些mail圖片是內崁,但是我自己寄出的則是會有附加檔,我用gmail作過同樣測試也是如此,因此我想基本上可以排除是收信軟體的問題,不知是否還有其它原因可能導致這個狀況?

Jeffrey Taiwan

十一月 22. 2008 11:11

will

那就多測試摟,一定有辦法的。

will Taiwan

五月 19. 2009 16:10

Dave

也可以使用 AlternateView + LinkedResource 的方式處理
但 cid 怎麼不見了?

Dave Taiwan

五月 19. 2009 21:30

will

請參考: aspalliance.com/..._Sending_HTML_Email_in_NET_20.6

will Taiwan

七月 16. 2009 02:14

ann

請問如果用vb寫
<img src="logo.gif" />這行要怎麼寫勒???

ann Taiwan

七月 16. 2009 13:27

Jeffrey

<img src="logo.gif" />這一行是放在你要寄Mail的html碼,無關乎用vb或用其它語言。

Jeffrey Taiwan

十一月 16. 2009 10:59

jean

請問我把 <img src="test.jpg"/> 改用
background-image:url(test.jpg)  顯示,圖檔變成用附件加上去,而不是嵌入至mail裡,why ?!

jean Taiwan

十一月 16. 2009 11:05

Will 保哥

jean: 你只能用 img 標籤喔!

Will 保哥 Taiwan

十二月 23. 2009 11:48

yau

請問這內嵌flash也是可以嗎

yau Taiwan

十二月 23. 2009 11:58

Will 保哥

yau: 可以內嵌,不過通常 Mail Client 會因為安全性的問題無法顯示,所以不建議你這麼用!

Will 保哥 Taiwan

十月 1. 2010 20:07

Eri

您好~^^
能否麻煩版主幫個忙?
我是電機電子方面的大外行…
最近收到了一封"inline"附件的mail
雖然下載了、可是怎麼樣都打不開附件…
因為很想知道內容,可以麻煩版主幫我解答嗎?

請問要怎麼打開郵件附件中以「inline」為名的檔案?

Eri Taiwan

十月 3. 2010 01:13

Will 保哥

Eri: 建議你可以去 Microsoft Answers 論壇 ( http://answers.microsoft.com/zh-tw/ ) 發問。

Will 保哥 Taiwan

新增評論


( 您輸入的Email不會顯示於網站上 )

  Country flag

biuquote
  • 評論
  • 線上預覽
Loading