сохранить System.Net.mail.MailMessage как MSG-файл - PullRequest
11 голосов
/ 11 марта 2010

Я создаю приложение, в котором я обязан создать MailMessage (System.Net.mail.MailMessage) и сохранить его на диске как расширение .msg, а не .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);
        }
    }

Но сохраненный файл сообщений не открывается, и ниже приведена ошибка: "Не удается открыть файл xyz.msg. Файл может не существовать, у вас может не быть разрешения на его открытие или он может быть открыт другой программой ...."

Мой вопрос: Как сохранить System.Net.mail.MailMessage как файл msg?

Ответы [ 6 ]

4 голосов
/ 11 марта 2010

Здесь Райан предлагает простой и отличный способ сделать это без каких-либо усилий.

Вы можете настроить 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 голосов
/ 21 сентября 2010

Если вы ссылаетесь на формат файла Outlook MSG, проверьте спецификацию формата MSG, опубликованную Microsoft . Следующий ответ на похожий вопрос также может помочь.

2 голосов
/ 14 ноября 2011

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

2 голосов
/ 11 марта 2010

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

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

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

К сожалению,

Dave

1 голос
/ 14 ноября 2011
0 голосов
/ 21 сентября 2011

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

...