100 votes

Comment enregistrer un objet MailMessage sur le disque en tant que fichier * .eml ou * .msg

Comment enregistrer un objet MailMessage sur le disque? L'objet MailMessage n'expose aucune méthode Save ().

Je n'ai pas de problème s'il enregistre dans n'importe quel format, * .eml ou * .msg. Une idée comment faire ça?

135voto

Ryan Versaw Points 3682

Pour des raisons de simplicité, je vais juste citer une explication à partir d'un élément de connexion:

Vous pouvez réellement configurer l' SmtpClient pour envoyer des e-mails dans le fichier système au lieu de le réseau. Vous pouvez le faire par programmation à l'aide de la code suivant:

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

Vous pouvez également le configurer dans votre fichier de configuration d'application comme ce:

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

Après l'envoi de l'e-mail, vous devez voir e-mail, les fichiers sont ajoutés à la répertoire que vous avez spécifié. Vous pouvez ensuite avoir un processus distinct d'envoyer l' e-mail des messages en mode batch.

Vous devriez être en mesure d'utiliser le constructeur vide à la place de celle qui figure, comme il ne sera pas envoyer de toute façon.

31voto

saille Points 3585

Voici une méthode d'extension permettant de convertir un message MailMessage en un flux contenant les données EML. C'est évidemment un peu un bidouillage car il utilise le système de fichiers, mais cela fonctionne.

 public static void SaveMailMessage(this MailMessage msg, string filePath)
{
    using (var fs = new FileStream(filePath, FileMode.Create))
    {
        msg.ToEMLStream(fs);
    }
}

/// <summary>
/// Converts a MailMessage to an EML file stream.
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
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);
        }
    }
}
 

Vous pouvez ensuite prendre le flux renvoyé et le faire à votre guise, y compris l’enregistrement dans un autre emplacement sur le disque, le stockage dans un champ de base de données, ou même l’envoi d’un e-mail en pièce jointe.

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