CDO.Message.Fields[].Name 包含奇怪的字符

Posted

技术标签:

【中文标题】CDO.Message.Fields[].Name 包含奇怪的字符【英文标题】:CDO.Message.Fields[].Name contains weird characters 【发布时间】:2013-03-13 02:50:58 【问题描述】:

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

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 之类的傻瓜。

【问题讨论】:

你用什么来发送这条消息的? 邮件来自 GMail。它是在我的电子邮件服务器上收到的,此代码是其中的一部分。如果有帮助,我会将整个 RAW 文件添加到我的问题中。 【参考方案1】:

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

为什么这些符号首先存在于文件中?这取决于文件的创建方式。这个问题可能看起来很有帮助:Can I export excel data with UTF-8 without BOM?。

【讨论】:

感谢您教会了我一些新东西。有了这些信息,我应该能够为我的代码提出更好的(非黑客)修复。【参考方案2】:

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

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

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

X-CDO-FIX:修复 X-RCPT-TO-LIST: 1,2,3 ...这里是正常的标题...

经过测试并且有效,所以我很高兴。将开放几天,以防有人可以提供更多值得我开始赏金的信息,这也可能对其他人有所帮助。

【讨论】:

我还用十六进制编辑器打开了电子邮件文件,以确认我的文件开头没有奇怪/额外的字符。 不得不承认这个问题很奇怪。另一个“修复”是在处理之前查找并删除该特定字符。 这让我想起了我多年前看到的一个问题,当时我正在使用 telnet 测试发送电子邮件。如果我在发送时将 TO: 或 FROM: 列在标题的第一行,我记得某些电子邮件客户端没有正确处理它(就像该字段不存在一样)。我现在不记得所有细节了,但我想这可能是相关的,如果那个电子邮件客户端使用这个版本的 CDO 来解析它们。我想说是 Outlook 出了问题,但我对此只有 60% 的把握(很久以前)。

以上是关于CDO.Message.Fields[].Name 包含奇怪的字符的主要内容,如果未能解决你的问题,请参考以下文章

vector_name、vector_name.begin() 和 (vector_name + vector_name.size())、vector_name.end() 有啥区别?

python编程之self._name与self.name的区别

编解码

js求数组的交集/并集/差集/去重

AutomationProperties.Name VS x:Name

在 WPF 中使用 x:Name 或 Name [重复]