Сохранить 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>

Ответ 3

Если вы ссылаетесь на файл Outlook.msg, это невозможно сделать изначально в .NET.

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

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

К сожалению,

Dave

Ответ 4

Проверьте этот короткий пример, который использует библиотеку Outlook Interop Создание файла сообщений Outlook с С#. Это не совсем то, о чем вы просили, но есть способ скопировать значения из одного в другое вручную.

Ответ 6

Сообщение об ошибке, данное Outlook, связано с расширением .msg. Я использую тот же метод для сохранения объектов MailMessage на диск и обнаружил, что файл будет открыт только в Outlook с расширением .eml.