У меня есть каталог файлов .eml, содержащих сообщения электронной почты. Есть ли рекомендуемый подход в С# для парсинга файлов этого типа?
Рекомендации по разбору файлов .eml в С#
Ответ 1
Я разместил образец проекта, чтобы проиллюстрировать этот ответ в Github
CDO COM DLL является частью Windows/IIS и может быть указана в .net. Он обеспечит точный синтаксический анализ и хорошую объектную модель. Используйте его в сочетании со ссылкой на ADODB.DLL.
public CDO.Message LoadEmlFromFile(String emlFileName)
{
CDO.Message msg = new CDO.MessageClass();
ADODB.Stream stream = new ADODB.StreamClass();
stream.Open(Type.Missing, ADODB.ConnectModeEnum.adModeUnknown, ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified, String.Empty, String.Empty);
stream.LoadFromFile(emlFileName);
stream.Flush();
msg.DataSource.OpenObject(stream, "_Stream");
msg.DataSource.Save();
stream.Close();
return msg;
}
- Добавлено Август 2017: Также проверьте MimeKit: https://github.com/jstedfast/MimeKit. Он поддерживает .Netstandard, поэтому будет работать межплатформенная платформа.
Ответ 2
LumiSoft включает в себя Mime parser.
Sasa включает в себя синтаксический анализатор Mime.
Ответ 3
Следуйте этой ссылке для хорошего решения:
Резюме статьи - 4 шага (второй шаг ниже отсутствует в статье, но необходим):
-
Добавьте ссылку на "Microsoft CDO для библиотеки Windows 2000", которую можно найти на вкладке "COM" в диалоговом окне "Добавить ссылку" Visual Studio. Это добавит 2 ссылки на "ADODB" и "CDO" в вашем проекте.
-
Отключить вложение типов Interop для 2-х ссылок "ADODB" и "CDO". (Ссылки → ADODB → Свойства → Установить "Вставить типы взаимодействия" в False и повторить одно и то же для CDO)
-
Добавьте в свой код следующий код:
protected CDO.Message ReadMessage(String emlFileName) { CDO.Message msg = new CDO.MessageClass(); ADODB.Stream stream = new ADODB.StreamClass(); stream.Open(Type.Missing, ADODB.ConnectModeEnum.adModeUnknown, ADODB.StreamOpenOptionsEnum.adOpenStreamUnspecified, String.Empty, String.Empty); stream.LoadFromFile(emlFileName); stream.Flush(); msg.DataSource.OpenObject(stream, "_Stream"); msg.DataSource.Save(); return msg; }
-
Вызовите этот метод, передав полный путь к вашему файлу eml, и объект CDO.Message, который он возвращает, будет иметь всю анализируемую информацию, в которой вы нуждаетесь, включая To, From, Subject, Body.
Ответ 4
Возможно, вам нужен парсер электронной почты /MIME. Разбор всех полей заголовка не очень сложный, но разделение различных типов MIME, таких как изображения, вложения, различные текстовые и html-части и т.д., Может стать очень сложным.
Мы используем сторонний инструмент, но есть много инструментов и библиотек С#. Поиск бесплатного парсера MIME в С# в Google. Как я получил этот:
http://www.codeproject.com/Articles/11882/Advanced-MIME-Parser-Creator-Editor http://www.lumisoft.ee/lswww/download/downloads/Net/info.txt
Ответ 5
Получение достойного анализатора MIME было бы, вероятно, способом. Вы можете попытаться использовать бесплатный парсер MIME (например, этот из codeproject), но комментарии от автора кода, подобного этому
Я работал над этим примерно в том же время, в течение которого я работал над классом-оболочкой для файлов MSG. Большая разница в трудность. Где EML-обертка класс может занять день, чтобы прочитать spec и получить право, оболочка MSG класс занял неделю.
меня интересовало качество кода. Я уверен, что вы можете взломать синтаксический анализатор, который анализирует 95% сообщений электронной почты в течение нескольких дней/часов. Я также уверен, что правильные оставшиеся 5% займут месяцы. Рассмотрите возможность обработки S/MIME (зашифрованных и подписанных писем), unicode, неправильных электронных писем, вызванных неправильной работой почтовых клиентов и серверов, нескольких схем кодирования, проблем интернационализации, следя за тем, чтобы намеренно настроенные электронные письма не разбивали ваше приложение и т.д.
Если вам нужен синтаксический анализ электронной почты из одного источника, может потребоваться быстрый и грязный парсер. Если вам нужно разобрать электронные письма из дикой местности, может понадобиться лучшее решение.
Я бы рекомендовал наш компонент Rebex Secure Mail, но я уверен, что вы получите достойный результат с компонентами других производителей.
Убедитесь, что парсер по вашему выбору работает корректно на печально известном "Образце примера пыток", подготовленном Майком Криспином (соавтором MIME и IMAP RFC). Сообщение отображается в примере MIME Explorer и может быть загружено в установочном пакете.
Следующий код показывает, как читать и анализировать файл EML:
using Rebex.Mail;
MailMessage message = new MailMessage();
message.Load("file.eml");
Ответ 6
Я только начал использовать Mime-часть Papercut для этого. Кажется, что на первый взгляд это кажется простым и понятным.
public void ProcessRawContents(string raw)
{
// NB: empty lines may be relevant for interpretation and for content !!
var lRawLines = raw.Split(new []{"\r\n"}, StringSplitOptions.None);
var lMailReader = new MimeReader(lRawLines);
var lMimeEntity = lMailReader.CreateMimeEntity();
MailMessageEx Email = lMimeEntity.ToMailMessageEx();
// ...
}
(MailMessageEx
, конечно, получен из MailMessage
.)
Ответ 7
Try:
- febootimail
- SmtpExpress
- Информационный бюллетень LinkWS Turbo
- emlBridge - импорт eml файлов в Outlook и практически любой другой почтовый клиент
- Информационный бюллетень 2.1 Турбо
- ThunderStor (emlResender)
- Ruby (используя eml2mbox). См. метод jimbob.
- Эволюция - создайте новое сообщение, прикрепите файл eml,
Напишите программу:
- в С# (см. [this] [4] и this). См. Исходный код.
- с использованием Rebel Secure Mail
- .NET(см. this, this и this)
Обходные:
- $cat mail.eml | mail -s -c Но заголовки не будут разбираться, ни вложения.
- отбросьте их в свой GMail (Firefox сохранит их как вложения)
Ответ 8
Aspose.Email для .NET
Aspose.Email для .NET - это набор компонентов для работы с электронной почты из ваших приложений .NET. Это упрощает работу с несколькими форматами сообщений электронной почты и файлами хранения сообщений (PST/OST), а также возможности отправки и приема сообщений.
Aspose.Email упрощает создание, чтение и управление несколькими форматов сообщений, таких как файлы MSG, EML, EMLX и MHT без необходимости установки Microsoft Outlook. Вы можете не только изменить сообщение содержимого, но также манипулировать (добавлять, извлекать и удалять) вложения из объекта сообщения. Вы можете настроить заголовки сообщений, добавив или удаление получателей, изменение объекта или других свойств. Это также дает вам полный контроль над электронным сообщением, предоставляя доступ к его свойствам Mapi.
- http://www.aspose.com/.net/email-component.aspx
- https://www.nuget.org/packages/Aspose.Email/
- Существует оценочная версия со следующими ограничениями: http://www.aspose.com/docs/display/emailnet/Licensing
С# Outlook MSG для чтения файлов без необходимости в Outlook
MSGReader - это библиотека С#.NET 4.0 для чтения Outlook MSG и EML (Mime 1.0). Поддерживаются почти все общие объекты в Outlook.