Как сохранить объект MailMessage на диск как файл * .eml или * .msg

Как сохранить объект MailMessage на диск? Объект MailMessage не предоставляет никаких методов Save ().

У меня нет проблем, если он сохраняется в любом формате * .eml или * .msg. есть идеи как это сделать?

Для простоты я просто приведу объяснение из элемента Connect :

Фактически вы можете настроить SmtpClient на отправку писем в файловую систему, а не в сеть. Вы можете сделать это программно, используя следующий код:

SmtpClient client = new SmtpClient("mysmtphost"); client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; client.PickupDirectoryLocation = @"C:\somedirectory"; client.Send(message); 

Вы также можете установить это в своем файле конфигурации приложения следующим образом:

           

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

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

Ниже приведен метод расширения для преобразования MailMessage в stream, содержащий данные EML. Очевидно, что он немного взломан, поскольку использует файловую систему, но он работает.

 public static void SaveMailMessage(this MailMessage msg, string filePath) { using (var fs = new FileStream(filePath, FileMode.Create)) { msg.ToEMLStream(fs); } } ///  /// Converts a MailMessage to an EML file stream. ///  ///  ///  public static void ToEMLStream(this MailMessage msg, Stream str) { using (var client = new SmtpClient()) { var id = Guid.NewGuid(); var tempFolder = Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name); tempFolder = Path.Combine(tempFolder, "MailMessageToEMLTemp"); // create a temp folder to hold just this .eml file so that we can find it easily. tempFolder = Path.Combine(tempFolder, id.ToString()); if (!Directory.Exists(tempFolder)) { Directory.CreateDirectory(tempFolder); } client.UseDefaultCredentials = true; client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory; client.PickupDirectoryLocation = tempFolder; client.Send(msg); // tempFolder should contain 1 eml file var filePath = Directory.GetFiles(tempFolder).Single(); // stream out the contents using (var fs = new FileStream(filePath, FileMode.Open)) { fs.CopyTo(str); } if (Directory.Exists(tempFolder)) { Directory.Delete(tempFolder, true); } } } 

Затем вы можете взять stream, который был возвращен, и делать с ним, как вы хотите, включая сохранение в другое место на диске или хранение в поле базы данных или даже отправку электронной почты в виде вложения.

По той или иной причине клиент.send не удалось (сразу после фактической отправки с использованием этого метода), поэтому я подключил хороший stream OOL CDO и ADODB. Мне также пришлось загрузить CDO.message с шаблоном.eml перед установкой значений .Message. Но это работает.

Так как приведенный выше C есть один для VB

  MyMessage.From = New Net.Mail.MailAddress(mEmailAddress) MyMessage.To.Add(mToAddress) MyMessage.Subject = mSubject MyMessage.Body = mBody Smtp.Host = "------" Smtp.Port = "2525" Smtp.Credentials = New NetworkCredential(------) Smtp.Send(MyMessage) ' Actual Send Dim oldCDO As CDO.Message oldCDO = MyLoadEmlFromFile("template.eml") ' just put from, to, subject blank. leave first line blank oldCDO.To = mToAddress oldCDO.From = mEmailAddress oldCDO.Subject = mSubject oldCDO.TextBody = mBody oldCDO.HTMLBody = mBody oldCDO.GetStream.Flush() oldCDO.GetStream.SaveToFile(yourPath) 

Если вы используете Mailkit . Просто напишите ниже код

 string fileName = "your filename full path"; MimeKit.MimeMessage message = CreateMyMessage (); message.WriteTo (fileName); 
Давайте будем гением компьютера.