Сохранить System.Net.mail.MailMessage как .msg файл
Я создаю приложение, в котором я обязан создать MailMessage (System.Net.mail.MailMessage) и сохранить его на диске как .msg extention not.eml
Ниже приведен метод, который я использую для сохранения MailMessage как файла .msg:
public static void Save(MailMessage Message, string FileName)
{
Assembly assembly = typeof(SmtpClient).Assembly;
Type _mailWriterType =
assembly.GetType("System.Net.Mail.MailWriter");
using (FileStream _fileStream =
new FileStream(FileName, FileMode.Create))
{
// Get reflection info for MailWriter contructor
ConstructorInfo _mailWriterContructor =
_mailWriterType.GetConstructor(
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new Type[] { typeof(Stream) },
null);
// Construct MailWriter object with our FileStream
object _mailWriter =
_mailWriterContructor.Invoke(new object[] { _fileStream });
// Get reflection info for Send() method on MailMessage
MethodInfo _sendMethod =
typeof(MailMessage).GetMethod(
"Send",
BindingFlags.Instance | BindingFlags.NonPublic);
// Call method passing in MailWriter
_sendMethod.Invoke(
Message,
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new object[] { _mailWriter, true },
null);
// Finally get reflection info for Close() method on our MailWriter
MethodInfo _closeMethod =
_mailWriter.GetType().GetMethod(
"Close",
BindingFlags.Instance | BindingFlags.NonPublic);
// Call close method
_closeMethod.Invoke(
_mailWriter,
BindingFlags.Instance | BindingFlags.NonPublic,
null,
new object[] { },
null);
}
}
Но сохраненный файл msg не открывается, а ниже - ошибка:
"Невозможно открыть файл xyz.msg.Файл файла может не существовать, у вас может не быть разрешения на его открытие или он может быть открыт другой программой..."
Мой вопрос: Как сохранить System.Net.mail.MailMessage как файл msg?
Ответы
Ответ 1
Здесь Райан предлагает простой и удобный способ сделать это без каких-либо усилий.
Фактически вы можете настроить SmtpClient для отправки писем в файл вместо сети. Вы можете сделать это программно, используя следующий код:
SmtpClient client = new SmtpClient("mysmtphost");
client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
client.PickupDirectoryLocation = @"C:\somedirectory";
client.Send(message);
Вы также можете установить это в своем файле конфигурации приложения следующим образом:
<configuration>
<system.net>
<mailSettings>
<smtp deliveryMethod="SpecifiedPickupDirectory">
<specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" />
</smtp>
</mailSettings>
</system.net>
</configuration>
Ответ 2
Если вы ссылаетесь на формат файла MS Outlook, проверьте спецификацию формата MSG, опубликованную Microsoft. Следующий ответ на аналогичный вопрос также может помочь.
Ответ 3
Если вы ссылаетесь на файл Outlook.msg, это невозможно сделать изначально в .NET.
Файл .msg Outlook представляет собой сложный документ, поэтому вам нужно сохранить его в этом формате и не забудьте поместить все соответствующие свойства в их точное местоположение.
Вам нужно либо написать свой собственный, использовать сторонний, либо возможный внешний вид Outlook.
К сожалению,
Dave
Ответ 4
Проверьте этот короткий пример, который использует библиотеку Outlook Interop Создание файла сообщений Outlook с С#. Это не совсем то, о чем вы просили, но есть способ скопировать значения из одного в другое вручную.
Ответ 5
Статья поддержки Microsoft KB:
INFO: Сохранить сообщение в составном файле MSG
Ответ 6
Сообщение об ошибке, данное Outlook, связано с расширением .msg. Я использую тот же метод для сохранения объектов MailMessage на диск и обнаружил, что файл будет открыт только в Outlook с расширением .eml.