Gestion des pièces jointes TNEF dans les messages e‑mail
TNEF (Transport Neutral Encapsulation Format) est un format propriétaire utilisé par Microsoft Outlook pour encapsuler du contenu enrichi dans les pièces jointes – le plus souvent stocké sous le nom winmail.dat. L’API Aspose.Email vous permet de lire les messages e‑mail contenant des pièces jointes TNEF et de modifier le contenu de la pièce jointe. L’e‑mail peut ensuite être enregistré comme un e‑mail normal ou dans le même format, en préservant les pièces jointes TNEF. Cet article présente différents extraits de code pour travailler avec des messages contenant des pièces jointes TNEF. Cet article montre également comment créer des fichiers EML TNEF à partir de fichiers MSG Outlook.
Lire un message avec pièce jointe TNEF
L’extrait de code suivant montre comment lire un message en préservant les pièces jointes TNEF.
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Email();
MsgLoadOptions options = new MsgLoadOptions();
options.PreserveTnefAttachments = true;
MailMessage eml = MailMessage.Load(dataDir + "EmbeddedImage1.msg", options);
foreach (Attachment attachment in eml.Attachments)
{
Console.WriteLine(attachment.Name);
}
Lire un message sans pièce jointe TNEF
Le fragment de code suivant vous montre comment lire un message sans conserver les pièces jointes TNEF. En définissant PreserveTnefAttachments à false est le comportement par défaut : le conteneur TNEF est décodé et son contenu est exposé comme pièces jointes normales au lieu d’un unique fichier winmail.dat.
// The path to the File directory.
string dataDir = RunExamples.GetDataDir_Email();
MsgLoadOptions options = new MsgLoadOptions();
options.PreserveTnefAttachments = false;
MailMessage eml = MailMessage.Load(dataDir + "EmbeddedImage1.msg", options);
foreach (Attachment attachment in eml.Attachments)
{
Console.WriteLine(attachment.Name);
}
Chargement et enregistrement des pièces jointes TNEF
Avec Aspose.Email pour .NET, vous pouvez charger des pièces jointes TNEF directement dans un MapiAttachment objet en utilisant un chemin de fichier ou un flux, puis enregistrez l’objet au format TNEF. Cela permet de créer des fichiers winmail.dat ou de préserver le formatage spécifique à Outlook dans les flux de travail d’e‑mail.
L’API fournit les membres suivants dans le MapiAttachment classe:
Charger les pièces jointes TNEF
-
static MapiAttachment LoadFromTnef(string fileName) - Charge une pièce jointe TNEF depuis un fichier .dat.
-
static MapiAttachment LoadFromTnef(Stream stream) - Charge une pièce jointe TNEF depuis un flux (p. ex., MemoryStream ou flux de fichier).
Enregistrer les pièces jointes TNEF
-
void SaveToTnef(string filename) - Enregistre un MapiAttachment dans un fichier TNEF.
-
void SaveToTnef(Stream stream) - Enregistre un MapiAttachment vers un flux au format TNEF.
L’exemple de code ci‑dessous montre comment extraire une pièce jointe winmail.dat d’un message e‑mail, la préserver, puis la ré‑ajouter en tant que pièce jointe au message :
// message.eml contains a winmail.dat attachment, but by default, the attachment is not preserved.
var msg = MapiMessage.Load("message.eml");
// Save the attachment to TNEF format in a stream and load it back
var ms = new MemoryStream();
msg.Attachments[0].SaveToTnef(ms);
ms.Position = 0;
var fromTnefAttachment = MapiAttachment.LoadFromTnef(ms);
msg.Attachments.Add(fromTnefAttachment);
// The same can be done through a file
msg.Attachments[0].SaveToTnef("winmail.dat");
fromTnefAttachment = MapiAttachment.LoadFromTnef("winmail.dat");
msg.Attachments.Add(fromTnefAttachment);
Mettre à jour les ressources dans une pièce jointe TNEF
L’extrait de code suivant montre comment mettre à jour les ressources dans une pièce jointe TNEF et préserver le format TNEF.
public static void TestUpdateResources(string dataDir)
{
string fileName = dataDir + "tnefEML1.eml";
string imgFileName = dataDir + "Untitled.jpg";
string outFileName = dataDir + "UpdateTNEFAttachments_out.eml";
MailMessage originalMailMessage = MailMessage.Load(fileName);
UpdateResources(originalMailMessage, imgFileName);
EmlSaveOptions emlSo = new EmlSaveOptions(MailMessageSaveType.EmlFormat);
emlSo.FileCompatibilityMode = FileCompatibilityMode.PreserveTnefAttachments;
originalMailMessage.Save(outFileName, emlSo);
}
private static void UpdateResources(MailMessage msg, string imgFileName)
{
for (int i = 0; i < msg.Attachments.Count; i++)
{
if ((msg.Attachments[i].ContentType.MediaType == "image/png") || (msg.Attachments[i].ContentType.MediaType == "application/octet-stream" && Path.GetExtension(msg.Attachments[i].ContentType.Name) == ".jpg"))
{
msg.Attachments[i].ContentStream = new MemoryStream(File.ReadAllBytes(imgFileName));
}
else if ((msg.Attachments[i].ContentType.MediaType == "message/rfc822") || (msg.Attachments[i].ContentType.MediaType == "application/octet-stream" && Path.GetExtension(msg.Attachments[i].ContentType.Name) == ".msg"))
{
MemoryStream ms = new MemoryStream();
msg.Attachments[i].Save(ms);
ms.Position = 0;
MailMessage embeddedMessage = MailMessage.Load(ms);
UpdateResources(embeddedMessage, imgFileName);
MemoryStream msProcessedEmbedded = new MemoryStream();
embeddedMessage.Save(msProcessedEmbedded, SaveOptions.DefaultMsgUnicode);
msProcessedEmbedded.Position = 0;
msg.Attachments[i].ContentStream = msProcessedEmbedded;
}
}
foreach (LinkedResource att in msg.LinkedResources)
{
if (att.ContentType.MediaType == "image/png")
att.ContentStream = new MemoryStream(File.ReadAllBytes(imgFileName));
}
}
Ajouter une pièce jointe au message TNEF
L’extrait de code suivant montre comment ajouter de nouvelles pièces jointes au message principal contenant du TNEF.
string fileName = "MainMessage.eml";
string attachName = "s.png";
string outFileName = "test.eml";
MailMessage mailMessage = MailMessage.Load(fileName);
mailMessage.Attachments.Add(new Attachment(File.OpenRead(attachName), "s.png", "image/png"));
// The TNEF content of the original message is preserved via EmlSaveOptions
EmlSaveOptions emlSaveOptions = new EmlSaveOptions(MailMessageSaveType.EmlFormat)
{
FileCompatibilityMode = FileCompatibilityMode.PreserveTnefAttachments
};
mailMessage.Save(outFileName, emlSaveOptions);
Création d’un EML TNEF à partir d’un MSG
Les fichiers MSG Outlook contiennent parfois des informations telles que des tableaux et des styles de texte qui peuvent être altérés s’ils sont convertis en EML. Créer des messages TNEF à partir de ces fichiers MSG permet de conserver le formatage et même d’envoyer ces messages via les clients de messagerie tout en préservant le formatage. Le MailConversionOptions.ConvertAsTnef la propriété est utilisée pour y parvenir. L’extrait de code suivant montre comment créer un EML TNEF à partir d’un MSG.
MapiMessage mapiMsg = MapiMessage.FromFile(dataDir + "Message.msg");
MailConversionOptions mco = new MailConversionOptions();
mco.ConvertAsTnef = true;
MailMessage message = mapiMsg.ToMailMessage(mco);
Alternativement, un EML TNEF peut être produit en chargeant le fichier MSG avec le PreserveTnefAttachments option du MsgLoadOptions classe activée, puis sauvegarder le résultat en tant qu’EML.
// Loading the MSG with PreserveTnefAttachments will create the TNEF eml.
MsgLoadOptions options = new MsgLoadOptions();
options.PreserveTnefAttachments = true;
MailMessage eml = MailMessage.Load(msgFileName, options);
eml.Save(emlFileName, SaveOptions.DefaultEml);
MailMessageLoadOptions classe est obsolète. Utilisez les descendants spécifiques au format de la LoadOptions classe à la place — MsgLoadOptions, EmlLoadOptions, etc.
Identifier les messages au format TNEF
L’extrait de code suivant montre comment détecter si un message est au format TNEF.
MailMessage mail = MailMessage.Load(dataDir + "tnefEml1.eml");
bool isTnef = mail.OriginalIsTnef;
Console.WriteLine("Is input EML originally TNEF? {0}", isTnef.ToString());
Identifier les pièces jointes au format TNEF
Le Attachment.IsTnef la propriété permet de détecter si la pièce jointe du message est au format TNEF.
var eml = MailMessage.Load(fileName);
foreach (var attachment in eml.Attachments)
{
Console.WriteLine($"Is Attachment TNEF?: {attachment.IsTnef}");
}