Преобразование файлов .MSG в .TXT; Должен ли я использовать Microsoft.Interop Outlook?

Я пытаюсь преобразовать файлы .msg в .txt. У меня есть два вопроса.

1) Я исследовал и нашел пакет Microsoft.Interop Outlook, и есть способ, с помощью которого я могу извлечь bodyHTML, To, Sent Date и несколько других свойств, но я чувствую, что это очень ручной процесс, потому что я необходимо обрезать все теги html, такие как ‹ br>,  , href и т. д.

Вот мой текущий код...

MailItem mailItem = outlookApp.Session.OpenSharedItem(item) as MailItem;
TextFile textFile = new TextFile(); //collection of properties I am interested in
textFile.To = mailItem.To;
textFile.Subject = mailItem.Subject;
textFile.Sent = mailItem.SentOn.ToString();
textFile.Name = Path.GetFileNameWithoutExtension(item);
var atttach = mailItem.Attachments;  //Really just want the names 
textFile.Body = RemoveStuff(mailItem.HTMLBody); //manually removing all html tags
textFiles.Add(textFile);
Marshal.ReleaseComObject(mailItem);

Кто-нибудь знает, есть ли более эффективный способ сделать это на С# или способ использования Interop, о котором я не знаю?

2) Если я пойду по маршруту взаимодействия, есть ли способ обойти всплывающее окно в Outlook с вопросом, могу ли я разрешить доступ к Outlook? Кажется неэффективным, если моя цель - создать конвертер.

Любая помощь приветствуется.

Спасибо!


person bird    schedule 07.10.2017    source источник


Ответы (1)


Во-первых, почему вы используете свойство HTMLBody вместо простого текста Body?

Во-вторых, вы можете использовать MailItem.saveAs(..., olTxt) для сохранения сообщения в виде текстового файла. Или вы имеете в виду что-то другое под текстовым файлом?

Запрос безопасности выдается Outlook, если ваше антивирусное приложение не обновлено. Если вы не можете контролировать среду, в которой работает ваш код, используйте расширенный MAPi (только C++ или Delphi) или оболочку, такую ​​как Redemption (любой язык) — практически единственный вариант. См. http://www.outlookcode.com/article.aspx?id=52 для более подробной информации.

В Использование вы можете иметь что-то вроде следующего:

using Redemption;
...
RDOSession session = new RDOSession();
RDOMail msg = session.GetMessageFromMsgFile(TheFileName);
msg.SaveAs(TxtFileName, rdoSaveAsType.olTXT);
person Dmitry Streblechenko    schedule 08.10.2017
comment
Вау, большое спасибо, это именно то, что мне нужно было сделать, а именно сохранить это как текст. (Я не знал о saveAs, и поэтому я использовал HTMLBody и вручную анализировал все теги и объекты html). Единственное, что сейчас, это то, что он не захватывает свойства mailItem.To. Я слышал о Redemption, но не смогу им пользоваться из-за лицензии. Еще раз спасибо!!! - person bird; 08.10.2017
comment
Вы говорите, что формат txt не сохраняет заголовки To/CC? Или что адреса электронной почты не включены? - person Dmitry Streblechenko; 08.10.2017
comment
Оба, если я наберу mailItem.To, это будет null, но в моем .MSG явно есть получатели. Поскольку он нулевой, в текстовый файл ничего не сохраняется. - person bird; 08.10.2017
comment
Видите ли вы свойство PR_DISPLAY_TO для этого файла сообщения, если вы открываете его в OutlookSpy (щелкните OpenIMsgOnIStg)? - person Dmitry Streblechenko; 08.10.2017
comment
Он говорит MAPI_E_NOT_ENOUGH_MEMORY, но когда я дважды щелкаю значения, я вижу там все адреса электронной почты и имена. - person bird; 08.10.2017
comment
Хм, странно, я установил для свойства BodyFormat значение OlBodyFormat.olFormatPlain, и это сработало. - person bird; 08.10.2017
comment
Это происходит только с файлами MSG с большим количеством получателей? - person Dmitry Streblechenko; 08.10.2017
comment
Да, это происходит только тогда, когда файл MSG имеет большое количество получателей. - person bird; 08.10.2017
comment
Это ограничение OOM. Я могу только предложить использовать Redemption (у него нет этого ограничения) или расширенный MAPI (свойство PR_DISPLAY_TO необходимо открывать как IStream, а не извлекать с помощью IMAPIProp::GetProps) - person Dmitry Streblechenko; 09.10.2017
comment
Дмитрий, спасибо, буду разбираться. - person bird; 09.10.2017