11 votes

enregistrer System.Net.mail.MailMessage en tant que fichier .msg

Je construis une application où je suis obligé de créer un MailMessage (System.Net.mail.MailMessage) et de le sauvegarder sur le disque en tant qu'extension .msg et non .eml.

Voici la méthode que j'utilise pour enregistrer un MailMessage dans un fichier .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);
        }
    }

Mais le fichier msg enregistré ne s'ouvre pas et l'erreur est la suivante : "Impossible d'ouvrir le fichier xyz.msg.Le fichier peut ne pas exister, vous n'avez peut-être pas la permission de l'ouvrir ou il peut être ouvert par un autre programme...."

Ma question est la suivante : Comment enregistrer System.Net.mail.MailMessage en tant que fichier msg ?

4voto

ArsenMkrt Points 24447

Ici Ryan propose un moyen simple et efficace de le faire sans aucun effort.

Vous pouvez en fait configurer le SmtpClient pour envoyer des e-mails au fichier système de fichiers au lieu du réseau. Vous pouvez le faire de manière programmatique en utilisant le code suivant :

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

Vous pouvez également le configurer dans le fichier de configuration de votre application comme suit :

 <configuration>
     <system.net>
         <mailSettings>
             <smtp deliveryMethod="SpecifiedPickupDirectory">
                 <specifiedPickupDirectory pickupDirectoryLocation="C:\somedirectory" />
             </smtp>
         </mailSettings>
     </system.net>
 </configuration>

3voto

Martin Vobr Points 3443

Si vous faites référence au format de fichier MSG d'Outlook, vérifiez l'onglet Spécification du format MSG publiée par Microsoft . Suite à la réponse à question similaire pourrait aussi aider.

2voto

dave wanta Points 4177

Si vous faites référence au fichier .msg d'Outlook, cela ne peut pas être fait de manière native dans .NET.

Le fichier .msg d'Outlook est un document composé. Vous devez donc l'enregistrer dans ce format et veiller à placer toutes les propriétés appropriées à leur emplacement exact.

Vous devez soit écrire le vôtre, soit utiliser une tierce partie, soit éventuellement utiliser l'interopérabilité d'Outlook.

Désolé,

Dave

2voto

Michał Powaga Points 8949

Regardez ce court exemple qui utilise la bibliothèque Outlook Interop. Créer un fichier de messages Outlook avec C# . Ce n'est pas exactement ce que vous avez demandé mais il y a un moyen de copie d'une valeur à l'autre - manuellement.

1voto

dex black Points 379

Article de la KB du support Microsoft : INFO : Enregistrer le message dans un fichier composé MSG

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X