Отправка файлов eml, сохраненных на диске

Я создаю eml и сохраняю их в каталог, используя процедуру, упомянутую здесь. Я хочу знать, как отправить эти файлы EML? Я попытался использовать объект класса SMTPClient, но он принимает объект MailMessage в качестве параметра, и я не смог найти и создать объект типа MailMessage с использованием этих сохраненных файлов eml.

7 ответов

Правильно загрузить файл EML не так просто, как кажется. Вы можете написать реализацию, работающую в 95% случаев в течение нескольких дней. Оставшиеся 5% займут как минимум несколько месяцев;-). Я знаю, потому что я участвовал в разработке одного.

Рассмотрим следующие трудности:

  • электронные письма в юникоде
  • языки справа налево
  • исправление искаженных файлов EML, вызванных известными ошибками в популярных почтовых клиентах и ​​серверах
  • работа с S/MIME (зашифрованные и подписанные почтовые сообщения)
  • правильно работает с несколькими методами кодирования вложений
  • работа с встроенными изображениями и таблицами стилей, встроенными в электронные письма HTML
  • убедившись, что он правильно анализирует сообщение о пытках MIME от Майка Криспина (соавтор RFC Mime и IMAP)
  • убедившись, что искаженное сообщение не приведет к переполнению буфера или другому отказу приложения
  • обработка иерархических сообщений (сообщение с прикрепленными сообщениями)
  • убедившись, что он правильно обрабатывает очень большие письма

Созревание такого парсера занимает годы и постоянную обратную связь для его пользователей. В данный момент в.NET Framework нет такого парсера. Пока это не изменится, я бы рекомендовал получить MIME-парсер от третьей стороны от известного поставщика.

Следующий код использует наш компонент Rebex Secure Mail, но я уверен, что аналогичная задача может быть легко воспроизведена с компонентами других поставщиков.

Код основан на учебнике по почтовому сообщению.

// create an instance of MailMessage 
MailMessage message = new MailMessage();

// load the message from a local disk file 
message.Load("c:\\message.eml");

// send message
Smtp.Send(message, "smtp.example.org");

Используйте EMLReader для извлечения данных из файла.eml. Он содержит все данные, необходимые для создания объекта MailMessage, такие как От, До, Тема, Тело и многое другое.

FileStream fs = File.Open(filePath, FileMode.Open, FileAccess.ReadWrite);
EMLReader reader = new EMLReader(fs);
fs.Close();

MailMessage message = new System.Net.Mail.MailMessage(reader.From, reader.To, reader.Subject, reader.Body);

Если вы магазин Microsoft и у вас есть сервер Exchange, то есть другое решение, которое намного, намного проще, чем все, что предлагается здесь:

Каждый сервер Exchange имеет каталог раскладки, настроенный из коробки.
По умолчанию это %ExchangeInstallPath%TransportRoles\Pickup,

Вы просто копируете .eml файлы в этот каталог, и Exchange автоматически отправит письма.


Прочитайте эту статью TechNet для получения дополнительной информации:
Каталог раскладки и каталог воспроизведения

Как продемонстрировали другие, EML просто не хороший способ serialize почтовое сообщение Возможно, вам будет лучше, если вы сохраните свою почту в другом формате. Несмотря на то, что в.Net Framework есть несколько механизмов сериализации для сериализации любого объекта, вы также можете подумать о том, чтобы просто сохранить компоненты вашей почты, такие как адреса, тело и файлы, которые должны быть прикреплены в base64, в файле XML вашего собственного дизайна.

Ниже приведен пример, с которого можно начать:

    <?xml version="1.0" encoding="utf-8"?>
    <mail>
      <to display="Thomas Edison" address="tedison@domain.com" />
      <body>
        Hi Thomas,
        How are you doing?
        Bye
      </body>
      <attachment name="MaryLamb.wav">
        cmF0aWUgYWFuIGluIFBERi1mb3JtYWF0LiBEZSBmYWN0dXVyIGlzIGVlbiBvZmZpY2ll
        ZWwgZ2VzaWduZWVyZA0KZG9jdW1lbnQgdmFuIEV1cm9maW5zIE9tZWdhbSBCVi4gRGUg
        c2lnbmF0dXJlIGt1bnQgdSB2ZXJpZmnDq3Jlbi4NCg0KVm9vciBoZXQgdmVyaWZpw6ty
        ...
      </attachment>
    </mail>

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

XML очень легко создавать и анализировать в C#.

Вы не указали причину сохранения EML. Если целью является долгосрочное архивирование, у xml может быть преимущество.

Вы можете сделать это с помощью встроенного SMTP-сервера Windows Server, так же, как в предыдущем ответе с использованием Exchange.

Перетащите файл.eml в C:\inetpub\mailroot\Pickup и необработанное сообщение будет отправлено (локальное или удаленное).

Вы можете пересылать сообщения, просто вставив строку сверху:

To: email@address.com

Вы можете манипулировать заголовком почты дальше, если вам нужно.

Делай то, что я сделал... сдавайся.

Построение объекта MailMessage, кажется, находится в центре внимания, и у меня есть похожие вопросы, нерешенные и здесь... Как отправить электронное письмо, когда оно уже есть в виде строки?

Из того, что я видел, самый простой способ сделать это - использовать необработанный сокет, чтобы выгружать все содержимое файла.eml на почтовый сервер, как есть, и позволить почтовому серверу разобраться с такими сложными вещами, как от, к теме, и т. Д. анализируя электронную почту, используя ее движок.

Единственная проблема... RFC 821 ... такая боль, я пытаюсь найти чистый способ сделать это и быстро читать почту уже в почтовом ящике.

РЕДАКТИРОВАТЬ:

Я нашел чистое решение и накрыл его в своей ветке:)

Как отправить электронное письмо, когда оно уже есть в виде строки?

Для записей:

В консоли Nuget Packager напишите:

Install-Package LumiSoft.Net.dll

Тогда в вашем коде:

using (FileStream fs = new FileStream( cacheFileName, FileMode.Open, FileAccess.Read )) 
using (LumiSoft.Net.SMTP.Client.SMTP_Client client = 
   new LumiSoft.Net.SMTP.Client.SMTP_Client())
{
    client.SendMessage( fs );
}
Другие вопросы по тегам