Загрузите файлы вложений электронной почты, используя Indy IMAP4 в C++ Builder

Я ищу пошаговое решение для загрузки почтовых вложений с помощью Indy Imap в C++ Builder (я использую C++ Builder XE8). Я прочитал некоторый учебник в Delphi, но действительно запутался.

Например, что мне делать после выбора почтового ящика?

ImapClient->UIDRetrieve()

или же

ImapClient->RetrieveStructure()

или же

ImapClient->RetrievePart()

или же

ImapClient->RetrieveEnvelop().

Затем, что я должен делать дальше, чтобы определить No MessagePart, имеющий файл вложения?

Последний, как сохранить этот файл на локальный диск?

Должен ли я перевести следующее в C++?

TIdAttachmentFile(mbMsgP.MessageParts.Items[liCount]).SaveToFile(fName);

Но я не могу создать такое утверждение

 TIdAttachmentFile(IdMessage1->MessageParts->items[no])->SaveToFile("filename");

1 ответ

Решение

Я прочитал некоторый учебник в Delphi, но действительно запутался.

Не удивительно, поскольку IMAP является сложным и запутанным протоколом в целом. Поэтому TIdIMAP4 имеет гораздо больше методов по сравнению с другими протоколами почтовых ящиков, таких как TIdPOP3 а также TIdSMTP (и он даже не реализует все, на что способен IMAP).

Например, что мне делать после выбора почтового ящика?

ImapClient-> UIDRetrieve () или ImapClient->RetrieveStructure() или ImapClient->RetrievePart() или ImapClient->RetrieveEnvelop().

Это действительно зависит от того, что вы собираетесь делать с электронными письмами и их приложениями.

(UID)Retrieve() загружает всю электронную почту, анализируя ее в TIdMessage и пометив его как "прочитанный" на сервере.

(UID)RetrieveStructure() извлекает родительскую / дочернюю иерархию различных частей MiME в электронном письме, создавая запись для каждой части в TIdMessage.MessageParts или же TIdImapMessageParts сборник, предоставляя некоторую базовую описательную информацию о каждой части, такую ​​как тип контента и номер детали. Фактическое содержание каждой части не извлекается.

(UID)RetrievePart() извлекает фактическое содержание определенной части MIME письма. Вам не нужно загружать всю электронную почту. Но вам нужно сначала загрузить структуру электронного письма, чтобы вы знали номер детали, которую вы хотите получить.

(UID)RetrieveEnvelope() извлекает некоторые основные заголовки верхнего уровня для электронной почты: дата, тема, от, отправитель, ответ на, к, копия, скрытая копия, in-reply-to и идентификатор сообщения.

Затем, что я должен делать дальше, чтобы определить No MessagePart, имеющий файл вложения?

Если вы загрузите всю электронную почту, вам придется просмотреть ее MessageParts Коллекция ищет TIdAttachment объект, содержащий желаемое имя файла / тип контента, который вас интересует.

Если вы загружаете только часть электронного письма, вам нужно будет извлечь структуру электронного письма и пройтись по полученной коллекции в поисках записи, содержащей желаемое имя файла / тип содержимого, который вас интересует, тогда вы можете запросить содержимое этой конкретной части.

Последний, как сохранить этот файл на локальный диск?

Если вы загрузите всю электронную почту, то вы бы позвонили SaveToFile() по желанию TIdAttachment объект:

static_cast<TIdAttachment*>(IdMessage1->MessageParts->Items[no])->SaveToFile("filename");

Если вы загружаете структуру электронной почты, вы можете использовать (UID)RetrievePart() чтобы получить данные вложения в TStream объект, такой как TFileStream,

Другие вопросы по тегам