2013-04-12 95 views
6

當我嘗試在VBScript中將電子郵件附件添加爲MHTML文件時,ContentMediaType錯誤地設置爲"message/rfc822"RFC 822)。據我所知,根據微軟的說法,這是正確的,但根據RFC 2557的說法是錯誤的,它表明它應該是"multipart/related"。這是一個問題,因爲大多數(如果不是全部的話)郵件客戶端將"message/rfc822"解釋爲電子郵件消息。由於文件擴展名".mht"".mhtml"不匹配的電子郵件的任何有效的文件擴展名,郵件客戶端附加的".msg"之一,".eml",等來的文件名。當用戶打開附件時,它會以電子郵件的形式打開,並且不能正確顯示,因爲MHTML文件和電子郵件的保存方式不同。修改CDO.Message對象中附件的內容類型

Sub SendEmail(FromAddress, ToAddress, Subject, Body, Attachment) 
    Call Err.Clear 
    On Error Resume Next 

    Schema = "http://schemas.microsoft.com/cdo/configuration/" 
    Set Configuration = Sys.OleObject("CDO.Configuration") 
    Configuration.Fields.Item(Schema + "sendusing") = 2 
    Configuration.Fields.Item(Schema + "smtpserver") = SMTPServer 
    Configuration.Fields.Item(Schema + "smtpserverport") = 25 
    Configuration.Fields.Item(Schema + "smtpauthenticate") = 1 
    ' Configuration.Fields.Item(schema + "sendusername") = "" 
    ' Configuration.Fields.Item(schema + "sendpassword") = "" 
    Call Configuration.Fields.Update 

    Set Message = Sys.OleObject("CDO.Message") 
    Set Message.Configuration = Configuration 
    Message.From = FromAddress 
    Message.To = ToAddress 
    Message.Subject = Subject 
    Message.HTMLBody = Body 
    If Not IsEmpty(Attachment) Then 
    'CDO.Message.AddAttachment doesn't set the correct content media type for an MHTML file. 
    Call Message.AddAttachment(Attachment) 
    End If 

    Call Message.Send 
End Sub 

當我運行這段代碼,Message.Attachments.Item(1).ContentMediaType設置爲"message/rfc822"。我需要它是"multipart/related"如果Attachment(字符串)與".mht"".mhtml"(不區分大小寫)結束。我可以用下面的代碼來做到這一點。

If Len(Attachment) >= 4 And InStr(Len(Attachment) - 3, Attachment, ".mht", vbTextCompare) Or Len(Attachment) >= 4 And InStr(Len(Attachment) - 5, Attachment, ".mhtml", vbTextCompare) Then 
    Message.Attachments.Item(1).ContentMediaType = "multipart/related" 
End If 

對於一些未知的原因,這從取消定義的Message.Attachments附件。

我已經看過手動添加附件每個these instructions,但是當我打電話Message.Attachments.Item(1).Fields.Update時,該對象變得未定義。我認爲設置附件的ContentMediaType,隱含地調用它的FieldsUpdate方法,這是我認爲對這種意外行爲負責的方法。

我怎樣才能解決這個問題,並與"multipart/related"內容類型發送一個MHTML文件,同時保持適當的文件擴展名?

+0

@IlyaKurnosov,我已經試過Microsoft Outlook 2010中,蘋果公司郵件(在iPhone),我的Web客戶端(交換)。 –

+0

可能相關:http://stackoverflow.com/questions/31250/content-type-for-mht-files –

回答

3

所以你的問題是,至少有一些電子郵件客戶端不正確地保存附件MHTML如果附件內容類型設置爲content-type="message/rfc822"

首先,值得注意的是你的問題的根本原因分析是有缺陷的。您似乎對multipart/related MIME類型發揮作用感到困惑。事實上,RFC 2557並未聲明對應於MHTML附件的身體部位必須具有content-type="multipart/related"。相反,MIME multipart/related是MHTML文件本身的內部結構。引用維基百科article

MHTML文件的內容使用MIME類型multipart/related進行編碼,就像它是HTML電子郵件消息一樣。

I.e.如果你打開MHTML文件與文本編輯器,你應該看到以下內容:

Content-Type: multipart/related; ... 

微軟表示MHTML文件應該以content-type="message/rfc822"KB937912送達。這正是CDO通過AddAttachment方法附加此文件時默認執行的操作。我相信這種行爲在任何情況下都不會與RFC 2557相抵觸。由於每RFC:

有多種文檔格式...指定 文件由一個根資源和一些由根資源中的URI應參考不同 子公司的資源。 有一個明顯的需要能夠在電子郵件[SMTP]發送這樣多資源 文件,[RFC822]消息。

本文檔中定義的標準指定如何爲MIME格式的[MIME1到MIME5]消息 彙總此類多資源文檔。

要回顧一下,你絕對不應該的內容類型MHTML附件設置爲multipart/related

雖然message/rfc822似乎與MHTML文件使用方式,這顯然會觸發你在問題中提到的問題。我測試了Outlook 2010和OWA 2010,並能夠重現它。這是爲MHTML附件使用的各種電子郵件客戶端

替代內容類型application/octet-streamapplication/x-mimearchive。這兩個在我的測試中沒有出現問題。

+0

我很欣賞你的一部分研究。您的最後一段概述了可能的替代內容類型,但是您沒有解釋我可以如何做到這一點。我採取的這兩種方法都不行。我不更新CDO中附件的內容類型。也許有另一種方式發送VBScript中的電子郵件? –

+1

@TylerCrompton更新附件的內容類型當然*可能與CDO。它不適合你,因爲你試圖將它設置爲'multipart/related'。只需在問題中顯示的代碼中使用'application/octet-stream'或'application/x-mimearchive'即可。 –