在 CDO.Message 对象中修改附件的内容类型
Posted
技术标签:
【中文标题】在 CDO.Message 对象中修改附件的内容类型【英文标题】:Modifying the content type of an attachment in a CDO.Message object 【发布时间】:2013-04-05 07:17:51 【问题描述】:当我尝试将 Mhtml 文件作为附件添加到 VBScript 中的电子邮件时,ContentMediaType
被错误地设置为 "message/rfc822"
(RFC 822)。据我了解,根据 Microsoft 的说法这是正确的,但根据 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 文件,同时保持正确的文件扩展名?
【问题讨论】:
@IlyaKurnosov,我已经尝试过 Microsoft Outlook 2010、Apple Mail(在 iPhone 上)和我的网络客户端 (Exchange)。 可能相关:***.com/questions/31250/content-type-for-mht-files 【参考方案1】:所以你的问题是,如果附件的内容类型设置为content-type="message/rfc822"
,至少有些电子邮件客户端会错误地保存 MHTML 附件。
首先,值得注意的是,您对问题根本原因的分析存在缺陷。您似乎对multipart/related
MIME 类型的作用感到困惑。事实上,RFC 2557 并没有说明 与 MHTML 附件相对应的正文部分 必须有 content-type="multipart/related"
。相反,MIME multipart/related 是 MHTML 文件本身的内部结构。引用***article:
使用 MIME 类型 multipart/related 将 MHTML 文件的内容编码为 HTML 电子邮件消息。
即如果您使用文本编辑器打开 MHTML 文件,您应该会看到以下内容:
Content-Type: multipart/related; ...
Microsoft 声明 MHTML 文件应在 KB937912 中使用 content-type="message/rfc822"
提供。当您通过AddAttachment
方法附加此类文件时,这正是 CDO 默认执行的操作。我相信这种行为不会以任何方式与 RFC 2557 相矛盾。根据 RFC:
有许多文档格式...指定 由根资源和许多不同的文件组成的文档 该根资源中的 URI 引用的辅助资源。 显然需要能够发送这样的多资源 电子邮件 [SMTP]、[RFC822] 消息中的文档。
本文档中定义的标准指定了如何聚合此类 MIME 格式 [MIME1 到 MIME5] 消息中的多资源文档 正是为了这个目的。
回顾一下,您绝对不应该将 MHTML 附件的内容类型设置为 multipart/related
。
虽然message/rfc822
似乎是 与MHTML 文件一起使用的方式,但它显然会触发您在问题中描述的问题。我用 Outlook 2010 和 OWA 2010 进行了测试,并且能够重现它。
各种电子邮件客户端用于 MHTML 附件的替代内容类型是 application/octet-stream
和 application/x-mimearchive
。这两个在我的测试中没有出现问题。
【讨论】:
感谢您的研究。您的最后一段概述了可能的替代内容类型,但您没有解释我如何做到这一点。我采取的两种方法都行不通。我无法在 CDO 中更新附件的内容类型。也许还有另一种在 VBScript 中发送电子邮件的方法? @TylerCrompton 使用 CDO 更新附件的内容类型当然是可能的。它对您不起作用,因为您尝试将其设置为multipart/related
。只需在问题中显示的代码中使用application/octet-stream
或application/x-mimearchive
。以上是关于在 CDO.Message 对象中修改附件的内容类型的主要内容,如果未能解决你的问题,请参考以下文章
SMTP配置SendUsing配置值在ASP-Classic中无效