信件內嵌圖檔與 Outlook 讀信自動下載外部圖檔行為
2 |
HTML 格式已是當今 Email 格式主流,幾乎各家郵件軟體都支援,寫信時將重點文字改粗體,強調部分上顏色,再插幾張圖片做到圖文並茂,已是再平常不過的事。
若是由程式發信,程式庫一般也都支援 HTML 格式,但講到在在內文嵌入圖檔,則有些注意事項。以廣告行銷信為例,假設活動邀請信想附上會場地圖,從網頁開發者思維,將地圖的圖檔放在網站,信件內文加個 <img src="https://www.my-company.com/images/map.png" alt="會場地圖" />
似乎就行了,比起每封信夾帶圖檔當附件,能省下可觀的傳輸流量。但老鳥都知道,這個想法實際運作會有點問題:基於安全考量,郵件軟體通常不自動下載外部圖片,使用者打開信件會先看到無法顯示的叉燒包圖示,需點擊相關提示才會下載圖檔正常顯示。
那我們平常用 Gmail、Outlook 寫信,信件內文可以內嵌圖片沒問題,收信者可以直接看到呀?那是透過內含附件(Inline Attachment)形式實現的。這裡來說說在 Email 內嵌圖檔的幾種方法,借用之前 EWS 收發信範例,我建立了一封 HTML 格式信件使用 EWS 送出,HTML 有包含圖檔,分別用 Inline Attachment + ContentId、Data URI 跟 src 指向外部網站三種做法:
static async Task<int> Main(string[] args)
{
var ews = InitEws();
var message = new EWS.EmailMessage(ews);
message.Sender = new EWS.EmailAddress(Settings.Email);
message.ToRecipients.Add(Settings.Recipient);
message.Subject = $"內嵌及外部圖檔測試 - {DateTime.Now:HH:mm:ss}";
var cid = Guid.NewGuid().ToString();
var pngData = File.ReadAllBytes("icon180.png");
var html =$@"
<style>img {{margin:6px;}}</style>
<dl>
<dt>內嵌圖檔(ContentId)</dt>
<dd><img src=""cid:{cid}"" /></dd>
<dt>內嵌圖檔(Data URI)</dt>
<dd><img src=""data:image/png;base64,{Convert.ToBase64String(pngData)}"" width=""180"" height=""180"" /></dd>
<dt>外部圖檔</dt>
<dd><img src=""https://blog.darkthread.net/img/icon180x180.png"" /></dd>
</dl>";
message.Body = new EWS.MessageBody(html) { BodyType = EWS.BodyType.HTML };
message.Attachments.AddFileAttachment("icon180.png", pngData);
message.Attachments[0].IsInline = true; //設為 Inline 附件
message.Attachments[0].ContentId = cid; //指定 ContentId,對映 HTML 中的 cid:... URI
await message.SendAndSaveCopy();
return 0;
}
使用 Outlook 收信,Inline Attachment 跟 Data URI 有顯示,指向網站的外部圖檔呈現叉燒包,上方則有提示: 為了保護隱私,Outlook 不會自動下載郵件的某些圖片,要按一下才會下載:
這裡說的保護隱私是防止寄信者在 HTML 圖檔 URL 夾帶識別收信者身份的參數 (例如:https://web-server/some-img.png?recipient=jeffrey
),若 Outlook 在預覽或讀取時未經同意即直接下載,對方便能掌握收信者何時讀信、所在 IP 位置等資訊,這些未必是使用者想提供的,故 Outlook 預設不自動下載圖片。
Outlook 的自動下載設定在 Outlook 選項 / 信任中心 / 信任中心設定:
預設所有選項都是勾選的,但其中第一二點要留意,來自特定寄件者的信件或放在信任區域站台的圖片會略過這層防護,直接下載。
安全寄件者可在下載提示按右鍵新增:
網際網路選項 / 安全性 / 信任的網站 / 網站 可將特定 URL 設成信任的站台:
由於以上設定可避開防護,設定時請務必確認寄信對象或網站範圍是安全的,若求謹慎,建議取消勾選,不管安全寄件者或信任網站,一律詢問後再下載。
【同場加映】順便試試 Gmail。
Inline Attachment 沒問題,但不支援 Data URI,另外 Gmail 也能做到預設不下載圖片,點選才放行,以及加入安全寄件者清單。
但我的信箱不知為何預設是「一律顯示不明外部圖片」,要修改的話設定位置如下:
Comments
# by 苦命維護人員
黑大:不自動下載圖片的設定變成不可溝選的灰色狀態要怎麼改回來?
# by Jeffrey
to 苦命維護人員,直覺是被 Group Policy 強制鎖定了,參考: https://answers.microsoft.com/en-us/outlook_com/forum/all/outlook-automatic-download-is-greyed-out/3102322d-07c9-43d1-b398-402fc0f8fc1b