首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修改CDO.Message对象中附件的内容类型

修改CDO.Message对象中附件的内容类型
EN

Stack Overflow用户
提问于 2013-04-13 00:50:58
回答 1查看 5.3K关注 0票数 7

当我尝试在VBScript中将MHTML文件作为电子邮件的附件添加时,ContentMediaType错误地设置为"message/rfc822" (RFC 822)。据我所知,根据微软的说法,这是正确的,但根据RFC 2557的说法是不正确的,因为它应该是"multipart/related"。这是一个问题,因为大多数(如果不是全部)邮件客户端会将"message/rfc822"解释为电子邮件消息。由于文件扩展名".mht"".mhtml"与电子邮件消息的任何有效文件扩展名都不匹配,因此邮件客户端将".msg"".eml"等之一附加到文件名。当用户打开附件时,它将作为电子邮件消息打开,并且不会正确显示,因为MHTML文件和电子邮件消息的保存方式不同。

代码语言:javascript
复制
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"。我可以用下面的代码做到这一点。

代码语言:javascript
复制
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文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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文件,你应该会看到以下内容:

代码语言:javascript
复制
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-streamapplication/x-mimearchive。这两个在我的测试中没有显示出问题。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15976836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档