-1

我正在使用 C++ builder 6 和 Indy 9/10。我正在编写代码以接收带有附件(基本上是 pdf 和 xml 文件)的认证电子邮件。当我收到电子邮件时,它有一个 TidMessageParts,其中包含一个多部分/混合部分,其他部分用于小文本,一个 xml 附件,其中包含有关电子邮件认证的信息和用于数字签名的部分等等。我的问题是:如何打开第一部分(多部分/混合)以提取其中的文本和附件。

请参阅我将发布的答案。

谢谢你。法布里齐奥

4

2 回答 2

0

TIdMessagePartTCollectionItem后代。该TCollectionItem::Collection属性指向拥有(parent) TCollection,而不是一些内部集合,就像您期望的那样1。这就是为什么mp1mp指向内存中的相同地址。

您不会在 Indy 中“打开消息部分”。TIdMessage::MessageParts您只需将集合从一端迭代到另一端,直到找到您感兴趣的特定部分,例如通过查看它们的类类型、ContentType属性等。例如:

TIdMessageParts *mp = MailMessage->MessageParts; 

for (int i = mp->Count-1; i > 0; --i)
{
    TIdMessagePart *part = mp->Items[i];

    if ((TIdAttachment *att = dynamic_cast<TIdAttachment*>(part)) != NULL)
    {
        ...
    }
    else if ((TIdText *txt = dynamic_cast<TIdText*>(part)) != NULL)
    {
        if (txt->ContentType = "text/xml")
        {
            ...
        }
        else if (txt->ContentType = "text/plain")
        {
            ...
        }
    }
}

1:内部嵌套集合的支持还没有实现,甚至在 Indy 10 中也没有实现。最早要到 Indy 12 才会实现。

于 2018-11-05T16:33:34.633 回答
0

我发布的问题的答案:@Remy 告诉我一个我无法很好理解的正确观察: “内容被解析并根据需要分成额外的集合项目。” 我正在阅读的电子邮件是“经过认证的电子邮件”,因此真正的电子邮件是带有 .eml 扩展名的附件,该附件在阅读的位置被我忽略(我的电子邮件客户端显示包含的电子邮件中的附件与基本电子邮件的附件一起) . 所以,当我正确理解了雷米的话并意识到在哪里搜索附件时:

  1. 我已将 .eml 文件提取到一个文件夹中
  2. 在表单上添加了一个新的 TIdMessage 组件(称为 PartMessage);
  3. 使用 LoadFromFile 方法读取存储的文件,现在在 PartMessage 中所有附件都是可见的,我能够将它们保存为文件。

再次感谢雷米的话,他说在哪里可以找到解决方案。

PS 该解决方案适用于 Indy 9 和 10,但由于版本不同而需要进行必要的调整。PPS 我不知道为什么在我的测试中我发现电子邮件是 s/mime 编码的文本,因为它不是。

于 2018-11-15T13:07:02.363 回答