Отправка файлов eml, сохраненных на диске - PullRequest
8 голосов
/ 20 августа 2009

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

Ответы [ 7 ]

7 голосов
/ 27 января 2010

Правильная загрузка 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");
6 голосов
/ 20 августа 2009

Используйте 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);
1 голос
/ 02 октября 2015

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

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

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


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

1 голос
/ 23 января 2012

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

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

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

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

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

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

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

0 голосов
/ 02 августа 2018

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

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

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

To: email@address.com

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

0 голосов
/ 10 июня 2016

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

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

    <?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 может быть преимущество.

0 голосов
/ 16 июля 2015

Для записей:

В консоли 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 );
}
...