Отправка файлов 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 );
}