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?
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?
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.
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 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.