7

当我尝试将 MHTML 文件作为附件添加到 VBScript 中的电子邮件时,它ContentMediaType被错误地设置为"message/rfc822"( RFC 822 )。据我了解,这在 Microsoft 中是正确的,但根据RFC 2557是不正确的,该 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". "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.

我已经按照这些说明查看了手动添加附件,但是当我调用时Message.Attachments.Item(1).Fields.Update,对象变得未定义。我认为设置附件的ContentMediaType,隐式调用它的Fields方法Update,我认为这是造成这种意外行为的原因。

如何解决此问题并发送具有"multipart/related"内容类型的 MHTML 文件,同时保持正确的文件扩展名?

4

1 回答 1

6

所以您的问题是,如果附件的内容类型设置为content-type="message/rfc822".

首先,值得注意的是,您对问题根本原因的分析存在缺陷。您似乎对multipart/relatedMIME 类型发挥作用的地方感到困惑。事实上,RFC 2557 并未声明与 MHTML 附件对应的正文部分必须具有content-type="multipart/related". 相反,MIME multipart/related 是 MHTML 文件本身的内部结构。引用维基百科文章

使用 MIME 类型 multipart/related 对 MHTML 文件的内容进行编码,就好像它是 HTML 电子邮件一样。

即,如果您使用文本编辑器打开 MHTML 文件,您应该会看到以下内容:

Content-Type: multipart/related; ...

Microsoft 声明 MHTML 文件应content-type="message/rfc822"KB937912中提供。AddAttachment当您通过方法附加此类文件时,这正是 CDO 默认执行的操作。我相信这种行为不会以任何方式与 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. 这两个在我的测试中没有表现出问题。

于 2013-04-27T12:37:59.733 回答