Hantera TNEF‑bilagor i e‑mailmeddelanden
TNEF (Transport Neutral Encapsulation Format) är ett proprietärt format som används av Microsoft Outlook för att kapsla in rikt innehåll i bilagor – oftast lagrat som winmail.dat. Aspose.Email‑API:n låter dig läsa e‑mailmeddelanden som har TNEF‑bilagor och ändra innehållet i bilagan. E‑mailet kan sedan sparas som ett vanligt e‑mail eller i samma format, med bevarade TNEF‑bilagor. Denna artikel visar olika kodexempel för att arbeta med meddelanden som innehåller TNEF‑bilagor. Artikeln visar också hur man skapar TNEF‑EML‑filer från Outlook‑MSG‑filer.
Läs ett meddelande med TNEF‑bilaga
Följande kodsnutt visar hur du läser ett meddelande och bevarar TNEF‑bilagor.
// 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);
}
Läs ett meddelande utan TNEF‑bilaga
Följande kodavsnitt visar hur du läser ett meddelande utan att bevara TNEF‑bilagor. Inställning av PreserveTnefAttachments till false är standardbeteendet: TNEF‑behållaren avkodas och dess innehåll exponeras som vanliga bilagor istället för en enda winmail.dat‑fil.
// 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);
}
Läs in och spara TNEF‑bilagor
Med Aspose.Email för .NET kan du ladda TNEF‑bilagor direkt in i en MapiAttachment objekt med en filsökväg eller ström, och sedan spara objektet i TNEF-format. Detta möjliggör skapandet av winmail.dat-filer eller bevarande av Outlook‑specifik formatering i e‑mail‑arbetsflöden.
API:n tillhandahåller följande medlemmar i MapiAttachment klass:
Ladda TNEF‑bilagor
-
static MapiAttachment LoadFromTnef(string fileName) - Laddar en TNEF‑bilaga från en .dat-fil.
-
static MapiAttachment LoadFromTnef(Stream stream) - Laddar en TNEF‑bilaga från en ström (t.ex. MemoryStream eller filström).
Spara TNEF‑bilagor
-
void SaveToTnef(string filename) - Sparar en MapiAttachment till en TNEF-fil.
-
void SaveToTnef(Stream stream) - Sparar en MapiAttachment till en ström i TNEF-format.
Kodexemplet nedan demonstrerar hur man extraherar en winmail.dat‑bilaga från ett e‑mailmeddelande, bevarar den och lägger till den igen som en bilaga i meddelandet:
// 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);
Uppdatera resurser i TNEF‑bilaga
Följande kodsnutt visar hur du uppdaterar resurser i en TNEF‑bilaga och bevarar TNEF‑formatet.
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));
}
}
Lägg till bilaga i TNEF‑meddelande
Följande kodsnutt visar hur du lägger till nya bilagor till huvudmeddelandet som innehåller 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);
Skapa TNEF‑EML från MSG
Outlook‑MSG-filer innehåller ibland information som tabeller och textstilar som kan bli störda om de konverteras till EML. Att skapa TNEF‑meddelanden från sådana MSG-filer gör det möjligt att behålla formateringen och till och med skicka sådana meddelanden via e‑mailklienter med bevarad formatering. MailConversionOptions.ConvertAsTnef egenskapen används för att uppnå detta. Följande kodsnutt visar hur du skapar TNEF‑EML från MSG.
MapiMessage mapiMsg = MapiMessage.FromFile(dataDir + "Message.msg");
MailConversionOptions mco = new MailConversionOptions();
mco.ConvertAsTnef = true;
MailMessage message = mapiMsg.ToMailMessage(mco);
Alternativt kan en TNEF‑EML skapas genom att ladda MSG‑filen med PreserveTnefAttachments alternativ för MsgLoadOptions klass aktiverad, och sedan sparar du resultatet som 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 klass är föråldrad. Använd format‑specifika avknopplingar av LoadOptions klass istället — MsgLoadOptions, EmlLoadOptions, och så vidare.
Identifiera TNEF‑formatmeddelanden
Följande kodsnutt visar hur du upptäcker om ett meddelande är TNEF.
MailMessage mail = MailMessage.Load(dataDir + "tnefEml1.eml");
bool isTnef = mail.OriginalIsTnef;
Console.WriteLine("Is input EML originally TNEF? {0}", isTnef.ToString());
Identifiera TNEF‑formatbilagor
Den Attachment.IsTnef egenskapen möjliggör att upptäcka om meddelandets bilaga är ett TNEF‑formatmeddelande.
var eml = MailMessage.Load(fileName);
foreach (var attachment in eml.Attachments)
{
Console.WriteLine($"Is Attachment TNEF?: {attachment.IsTnef}");
}