CDO.Message.Fields[].名称中包含奇怪字符

本文关键字:包含奇 字符 Message Fields CDO | 更新日期: 2023-09-27 18:05:20

我正在阅读一个电子邮件文件,其中文件的第一行(因此头中的第一行)是:

X-RCPT-TO-LIST: 1、2、3

我使用CDO和ADODB加载它,像这样:

        ADODB.Stream stream = new ADODB.Stream();
        stream.Open(Type.Missing, ADODB.ConnectModeEnum.adModeUnknown, ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified, String.Empty, string.Empty);
        stream.LoadFromFile(filename);
        stream.Flush();
        CDO.Message msg = new CDO.Message();
        msg.DataSource.OpenObject(stream, "_Stream");
        msg.DataSource.Save();

然后我试着得到这样的字段:

ADODB.Field f = msg.Fields["urn:schemas:httpmail:X-RCPT-TO-LIST"];

不工作,它返回一个空字段(空值)。

查看调试器中的字段,我看到字段名称是:
urn:schemas:mailheader:ÿþx-rcpt-to-list

我假设如果我寻找那些奇怪的字符,我的代码可能会工作,但我担心它们可能会从一个电子邮件到下一个。知道为什么要添加这些奇怪的字符吗?是否有更好的方法来访问自定义头字段(不读取自己的文件和解析它)?

我在安装了所有最新补丁(SP3)的Windows XP上运行这个测试。

对不起,如果我标记这个错误,我有麻烦找到这个标签。如果不明显,我正在使用c#。

这是整个电子邮件文件,我删除了一些垃圾(一些出于隐私原因),但我确实重新测试了这个确切的版本,得到了相同的结果:

X-RCPT-TO-LIST: 1,2,3
Received: by mail-ia0-f172.google.com with SMTP id l29so4135896iag.3
        for <423a777e2af27f463b801fe2eb2242cbdf1d934000000001@users.domain.com>; Fri, 22 Mar 2013 19:52:00 -0700 (PDT)
MIME-Version: 1.0
X-Received: by 10.50.195.134 with SMTP id ie6mr6320542igc.6.1364007120542;
 Fri, 22 Mar 2013 19:52:00 -0700 (PDT)
Received: by 10.50.169.39 with HTTP; Fri, 22 Mar 2013 19:52:00 -0700 (PDT)
Date: Fri, 22 Mar 2013 19:52:00 -0700
Message-ID: <XXXXXXXX63pPLB9QYu=04W3mU3Ynhkjf2bdYYZqv5oVvQ__u1vg@mail.gmail.com>
Subject: test4
From: <xxxxx2003@gmail.com>
To: 423a777e2af27f463b801fe2eb2242cbdf1d934000000001 <423a777e2af27f463b801fe2eb2242cbdf1d934000000001@users.domain.com>
Content-Type: multipart/alternative; boundary=14dae9340b45e63f6204d88ea7fa
--14dae9340b45e63f6204d88ea7fa
Content-Type: text/plain; charset=UTF-8
test4
-- 
xxxxxx@gmail.com
I don't check *this account* very often
--14dae9340b45e63f6204d88ea7fa
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">test4<br clear=3D"all"><div><br>-- <br><div><a href=3D"mai=
lto:xxxxx@gmail.com" target=3D"_blank">xxxxx@gmail.com</a></div>
<div>I don&#39;t check <b>this account</b> very often</div>
<div>=C2=A0</div>
</div></div>
--14dae9340b45e63f6204d88ea7fa--

X-RCPT-TO-LIST行是由我的电子邮件服务器中的代码添加的,该代码将RCPT TO:<>行转换为内部用户id。这样以后处理这些文件的线程就知道把邮件放在哪里。我不想把信息保持在一个单独的文件或类似的东西,因为我喜欢我目前的设计,我只是想知道为什么CDO/ADODB翻译我的消息头在一些奇怪的名字,像Unicode与ASCII的混合匹配或一些愚蠢的东西。

CDO.Message.Fields[].名称中包含奇怪字符

"ÿþ"作为文本流的第一个符号,大多数情况下是所谓的"字节顺序标记"。如见。维基百科条目。它们出现在流中是因为它们位于正在读取的文件中。如果使用十六进制编辑器打开文件并检查其第一个字节,则必须显示BOM。例如,"ÿþ"是0xFFFE的文本表示。

为什么这些符号会出现在文件中?这取决于文件是如何创建的。这个问题可能看起来很有帮助:我可以导出excel数据与UTF-8没有BOM吗?

除非有人有更好的答案,比如我加载消息的代码可能有错误,那么我将接受这个作为答案…

这似乎是CDO或ADODB中的一个错误,对于任何消息的第一行都这样做。我通过删除X-RCPT-TO-LIST行进行测试,使第一行成为标准的"Received:"行,在这种情况下,Received行在名称中添加了奇怪的字符。我还测试了其他几封以不同项目作为第一行的电子邮件,在所有情况下,第一行总是有奇怪的字符加在名字后面。我只能想象这个bug已经被修复了(我使用的是相当老的XP),或者大多数使用CDO的人没有注意到,因为他们没有对Received:行做任何事情,而这通常是头中的第一行。

对于我来说,为了避免这个问题,我将在顶部添加额外的一行,所以我将有:

X-CDO-FIX:修复X-RCPT-TO-LIST: 1、2、3…

测试和工作,所以我很高兴。我会把这个打开几天,以防有人能提供更多的信息,值得我已经开始的赏金,可能也会帮助别人。

我分享了这些信息,以防有人遇到同样的问题。和我一样。

使用所有默认值打开ADODB.Stream对象。这将创建类型为adTypeText的流,Charset设置为Unicode(默认行为)。

当您LoadFromFile时,从文件中读取数据,并且由于流将其Charset设置为Unicode,因此流数据由BOM添加,如果它不存在于磁盘上。
如果CharsetUTF-8

,也会出现同样的情况

如果你ReadText你的流,你得到的文本(假设Charset一个),如果你改变它的类型为adTypeBinaryRead它,你看到的实际数据之前的BOM。

然后用该流馈送CDO.Message。在使用流数据之前,CDO.Message将其类型更改为adTypeBinaryRead将其更改为。因此在第一行前面出现了有趣的字符。

如果您确定磁盘上的文件中没有BOM,只需在调用LoadFromFile

之前将流Type更改为adTypeBinary

如果您不确定,请使用您最喜欢的方法将文件内容读取为字符串,然后将流Type设置为adTypeBinary并将Write设置为字符串,然后将其交给CDO.Message对象(而不是使用WriteText,它还将用BOM添加数据)

希望这篇文章对大家有所帮助。