Comment économiser l'objet MailMessage sur le disque comme * .eml ou fichier * .msg
-
13-09-2019 - |
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?
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)