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

Tyl*_*ton 7 email vbscript content-type email-attachments mhtml

当我尝试在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
Run Code Online (Sandbox Code Playgroud)

当我运行此代码时,Message.Attachments.Item(1).ContentMediaType设置为"message/rfc822".我需要它是"multipart/related"if Attachment(一个字符串)以".mht"or 结尾".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
Run Code Online (Sandbox Code Playgroud)

由于某些未知的原因,这取决于附件Message.Attachments.

我已经看过按照这些说明手动添加附件,但是当我调用时Message.Attachments.Item(1).Fields.Update,对象变得不确定.我想设置附件的ContentMediaType,隐式调用它FieldsUpdate方法,这是我认为是负责这个意外的行为.

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

Ily*_*sov 5

因此,您的问题是,如果附件的内容类型设置为,则至少某些电子邮件客户端会错误地保存MHTML附件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; ...
Run Code Online (Sandbox Code Playgroud)

微软指出,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。这两个在我的测试中均未显示出问题。

  • @TylerCrompton CDO确实可以*更新附件的内容类型。它对您不起作用,因为您尝试将其设置为`multipart / related`。只需在问题中显示的代码中使用“ application / octet-stream”或“ application / x-mimearchive”即可。 (2认同)