Question

Comment sauvegarder l'objet MailMessage sur le disque? L'objet MailMessage ne pas exposer les méthodes Save ().

Je n'ai pas un problème si elle enregistre dans tous les formats, * .eml ou * .msg. Toute idée comment faire?

Était-ce utile?

La solution

Par souci de simplicité, je vais vous citer une explication d'un Connect article :

  

Vous pouvez réellement configurer le   Smtpclient pour envoyer des courriels au fichier   système à la place du réseau. Vous pouvez   faire en utilisant le programme   code suivant:

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

Vous pouvez également configurer cela dans votre   fichier de configuration d'application comme   ceci:

 <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 devriez   voir les fichiers électroniques sont ajoutés à la   répertoire spécifié. Vous pouvez ensuite   un processus distinct envoyer le   messages électroniques en mode batch.

Vous devriez être en mesure d'utiliser le constructeur vide au lieu de celui indiqué, car il ne sera pas l'envoyer de toute façon.

Autres conseils

Voici une méthode d'extension pour convertir un MailMessage à un flux contenant les données EML. Son évidemment un peu un hack car il utilise le système de fichiers, mais il 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);
        }

        if (Directory.Exists(tempFolder))
        {
            Directory.Delete(tempFolder, true);
        }
    }
}

Vous pouvez alors prendre le flux des thats retournés et faire ce que vous voulez avec elle, y compris l'enregistrement vers un autre emplacement sur le disque ou le stockage dans un champ de base de données, ou même envoyer pièce jointe.

Si vous utilisez Mailkit . Il suffit d'écrire le code ci-dessous

string fileName = "your filename full path";
MimeKit.MimeMessage message = CreateMyMessage ();
message.WriteTo(fileName);

Pour une raison ou une autre l'client.send a échoué (juste après un envoi réel en utilisant cette méthode), donc je branché en bon CDO ole et flux ADODB. Je devais aussi charger CDO.Message avec un template.eml avant de définir les valeurs .Message. Mais cela fonctionne.

Comme celle ci-dessus est C est ici un pour VB

    MyMessage.From = New Net.Mail.MailAddress(mEmailAddress)
    MyMessage.To.Add(mToAddress)
    MyMessage.Subject = mSubject
    MyMessage.Body = mBody

    Smtp.Host = "------"
    Smtp.Port = "2525"
    Smtp.Credentials = New NetworkCredential(------)

    Smtp.Send(MyMessage)        ' Actual Send

    Dim oldCDO As CDO.Message
    oldCDO = MyLoadEmlFromFile("template.eml")  ' just put from, to, subject blank. leave first line blank
    oldCDO.To = mToAddress
    oldCDO.From = mEmailAddress
    oldCDO.Subject = mSubject
    oldCDO.TextBody = mBody
    oldCDO.HTMLBody = mBody
    oldCDO.GetStream.Flush()
    oldCDO.GetStream.SaveToFile(yourPath)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top