C ++ Builder - Indy - Получение сертифицированных писем - PullRequest
0 голосов
/ 05 ноября 2018

Я использую C ++ Builder 6 и Indy 9/10. Я пишу для получения сертифицированных писем с вложениями (в основном, PDF и XML-файлов). Когда я получаю электронное письмо, у него есть TidMessageParts с одной составной / смешанной частью и другими частями для небольшого текста, приложением xml с информацией о сертификации электронной почты и деталями для цифровой подписи и многим другим. Моя проблема: как открыть первую часть (multipart / mixed) для извлечения текста и вложений в нее.

Смотрите ответ, который я опубликую.

Спасибо. Фабрицио

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Ответ на проблему, которую я разместил: @ Реми сказал мне правильное наблюдение, которое я не смог хорошо понять: "Контент анализируется и при необходимости разбирается на дополнительные элементы коллекции." Письмо, которое я читаю, является «сертифицированным», поэтому реальное электронное письмо - это вложение с расширением .eml, которое читается и игнорируется (мой почтовый клиент показывает вложения в прилагаемом электронном письме, объединенные с вложения базы электронной почты). Итак, когда я правильно понял слова Реми и понял , где , чтобы найти вложения:

  1. Я удалил файл .eml в папку
  2. добавил новый компонент TIdMessage в форму (называемый PartMessage);
  3. использовал метод LoadFromFile для чтения сохраненного файла и теперь в PartMessage все вложения видны, и я смог сохранить их в виде файлов.

Еще раз спасибо Реми за его слова о том, где есть какие-либо причины для достижения решения.

P.S. Решение отлично работает для Indy 9 и 10 с необходимыми настройками из-за разных версий. P.P.S. я не знаю, почему во время моих тестов я нашел текст, что электронное письмо было закодировано в s / mime, поскольку это не так.

0 голосов
/ 05 ноября 2018

TIdMessagePart является потомком TCollectionItem. Свойство TCollectionItem::Collection указывает на , которому принадлежит (родительский) TCollection, а не на какую-то внутреннюю коллекцию, как вы ожидаете 1 . Вот почему mp1 и mp указывают на один и тот же адрес в памяти.

Вы не «открываете часть сообщения» в 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, как минимум.

...