当我尝试在VBScript中将MHTML文件作为电子邮件的附件添加时,ContentMediaType错误地设置为"message/rfc822" (RFC 822)。据我所知,根据微软的说法,这是正确的,但根据RFC 2557的说法是不正确的,因为它应该是"multipart/related"。这是一个问题,因为大多数(如果不是全部)邮件客户端会将"message/rfc822"解释为电子邮件消息。由于文件扩展名".mht"和".mhtml"与电子邮件消息的任何有效文件扩展名都不匹配,因此邮件客户端将".msg"或".eml"等之一附加到文件名。当用户打开附件时,它将作为电子邮件消息打开,并且不会正确显示,因为MHTML文件和电子邮件消息的保存方式不同。
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"。如果Attachment (字符串)以".mht"或".mhtml" (不区分大小写)结尾,我需要它为"multipart/related"。我可以用下面的代码做到这一点。
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,隐式地调用了它的Fields的Update方法,我认为这就是导致这种意外行为的原因。
我如何解决这个问题,在保持适当的文件扩展名的同时发送一个带有"multipart/related"内容类型的MHTML文件?
发布于 2013-04-27 20:38:00
所以你的问题是,如果附件的内容类型被设置为content-type="message/rfc822",那么至少一些电子邮件客户端不能正确地保存MHTML附件。
首先,值得注意的是,您对问题根本原因的分析是有缺陷的。您似乎被multipart/related MIME类型的作用搞糊涂了。事实上,RFC 2557并没有规定附件对应的正文部分必须有content-type="multipart/related"。相反,MIME multipart/related是MHTML文件本身内部结构。引用维基百科article
使用MIME类型multipart/related对MHTML文件的内容进行编码,就好像它是一封HTML电子邮件一样。
也就是说,如果你用文本编辑器打开MHTML文件,你应该会看到以下内容:
Content-Type: multipart/related; ...微软声明,在KB937912中,MHTML文件应该与content-type="message/rfc822"一起提供。这正是您通过AddAttachment方法附加此类文件时CDO默认执行的操作。我相信这样的行为不会以任何方式与RFC2557相矛盾。根据RFC:
有很多种文档格式...其指定由根资源和根资源内URI所引用的多个不同的辅助资源组成的文档。显然需要能够在电子邮件SMTP、RFC822消息中发送这种多资源文档。本文档中定义的标准指定了如何将这些多资源文档以MIME格式的MIME1聚合到MIME5消息中,以达到此目的。
简单地说,您绝对不应该将MHTML附件的内容类型设置为multipart/related。
虽然message/rfc822似乎是使用MHTML文件的方式,但它显然会触发您在问题中描述的问题。我用Outlook 2010和OWA 2010进行了测试,并且能够重现它。
用于MHTML附件的各种电子邮件客户端使用的替代内容类型是application/octet-stream和application/x-mimearchive。这两个在我的测试中没有显示出问题。
https://stackoverflow.com/questions/15976836
复制相似问题