2

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

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 vs ASCII 或者一些愚蠢的东西。

4

2 回答 2

2

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

为什么这些符号首先存在于文件中?这取决于文件的创建方式。这个问题可能看起来很有帮助:我可以在没有 BOM 的情况下使用 UTF-8 导出 excel 数据吗?.

于 2013-03-31T17:25:19.943 回答
1

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

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

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

X-CDO-FIX: 修复 X-RCPT-TO-LIST: 1,2,3 ...此处为正常标头...

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

于 2013-03-25T18:01:50.330 回答