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

时间:2013-03-23 06:29:42

标签: c# smtp mime adodb cdo.message

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

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

我认为如果我寻找那些奇怪的角色,我的代码可能会起作用,但我担心他们可能会从一封电子邮件更改为下一封电子邮件。任何想法为什么添加这些奇怪的字符?有没有更好的方法来访问自定义标题字段(不自己读取文件并解析它)?

我在Windows XP上运行此测试,包含所有最新补丁(我认为是SP3)。

很抱歉,如果我将此标记错误,我就无法为此找到标记。我正在使用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转换为:&lt;&gt;行到内部用户ID。这样我后来处理这些文件的线程知道放置邮件的位置。我不想将信息保存在单独的文件或类似的文件中,因为我喜欢我当前的设计,我只是想知道为什么CDO / ADODB将我的邮件头转换为一些奇怪的名称,比如混合匹配Unicode与ASCII或一些傻瓜。

2 个答案:

答案 0 :(得分:2)

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

为什么这些符号首先出现在文件中?这取决于文件的创建方式。这个问题似乎有帮助:Can I export excel data with UTF-8 without BOM?

答案 1 :(得分:1)

除非有人有更好的答案,比如我的加载邮件的代码中有错误,然后我会接受这个作为答案......

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

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

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

经过测试和工作,所以我很高兴。如果有人可以提供更多值得我开始的可能对其他人有帮助的信息,那么请将这个开放几天。