Obsługa załączników TNEF w wiadomościach e‑mail
TNEF (Transport Neutral Encapsulation Format) jest własnościowym formatem używanym przez Microsoft Outlook do enkapsulacji bogatej zawartości w załącznikach — najczęściej zapisywanym jako winmail.dat. API Aspose.Email umożliwia odczyt wiadomości e‑mail, które mają załączniki TNEF i modyfikowanie zawartości załącznika. E‑mail może następnie zostać zapisany jako zwykły e‑mail lub w tym samym formacie, zachowując załączniki TNEF. Ten artykuł pokazuje różne przykłady kodu pracy z wiadomościami zawierającymi załączniki TNEF. Artykuł także pokazuje, jak tworzyć pliki TNEF EML z plików Outlook MSG.
Odczytaj wiadomość z załącznikiem TNEF
Poniższy fragment kodu pokazuje, jak odczytać wiadomość zachowując załączniki 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);
}
Odczytaj wiadomość bez załącznika TNEF
Poniższy fragment kodu pokazuje, jak odczytać wiadomość bez zachowywania załączników TNEF. Ustawienie PreserveTnefAttachments na false jest zachowaniem domyślnym: kontener TNEF jest dekodowany, a jego zawartość jest udostępniana jako zwykłe załączniki zamiast jednego pliku 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);
}
Ładowanie i zapisywanie załączników TNEF
Za pomocą Aspose.Email dla .NET można wczytać załączniki TNEF bezpośrednio do MapiAttachment obiekt przy użyciu ścieżki pliku lub strumienia, a następnie zapisuje obiekt w formacie TNEF. Umożliwia to tworzenie plików winmail.dat lub zachowanie formatowania specyficznego dla Outlook w przepływach pracy e‑mail.
API udostępnia następujące elementy w MapiAttachment klasa:
Załaduj załączniki TNEF
-
statyczny MapiAttachment LoadFromTnef(string fileName) - Ładuje załącznik TNEF z pliku .dat.
-
statyczny MapiAttachment LoadFromTnef(Stream stream) - Ładuje załącznik TNEF ze strumienia (np. MemoryStream lub strumień pliku).
Zapisz załączniki TNEF
-
void SaveToTnef(string filename) - Zapisuje MapiAttachment do pliku TNEF.
-
void SaveToTnef(Stream stream) - Zapisuje MapiAttachment do strumienia w formacie TNEF.
Poniższy przykład kodu demonstruje, jak wyodrębnić załącznik winmail.dat z wiadomości e‑mail, zachować go i ponownie dodać jako załącznik do wiadomości:
// 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);
Zaktualizuj zasoby w załączniku TNEF
Poniższy fragment kodu pokazuje, jak zaktualizować zasoby w załączniku TNEF i zachować 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));
}
}
Dodaj załącznik do wiadomości TNEF
Poniższy fragment kodu pokazuje, jak dodać nowe załączniki do głównej wiadomości zawierającej 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);
Tworzenie TNEF EML z MSG
Pliki Outlook MSG czasami zawierają informacje, takie jak tabele i style tekstu, które mogą zostać zaburzone przy konwersji do EML. Tworzenie wiadomości TNEF z takich plików MSG pozwala zachować formatowanie i nawet wysłać takie wiadomości za pośrednictwem klientów poczty, zachowując formatowanie. The MailConversionOptions.ConvertAsTnef właściwość jest używana do osiągnięcia tego. Poniższy fragment kodu pokazuje, jak utworzyć TNEF EML z MSG.
MapiMessage mapiMsg = MapiMessage.FromFile(dataDir + "Message.msg");
MailConversionOptions mco = new MailConversionOptions();
mco.ConvertAsTnef = true;
MailMessage message = mapiMsg.ToMailMessage(mco);
Alternatywnie, plik TNEF EML może być utworzony poprzez wczytanie pliku MSG przy użyciu PreserveTnefAttachments opcja MsgLoadOptions klasa włączona, a następnie zapisanie wyniku jako 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 klasa jest przestarzała. Użyj specyficznych dla formatu potomków LoadOptions klasa zamiast — MsgLoadOptions, EmlLoadOptions, i tak dalej.
Zidentyfikuj wiadomości w formacie TNEF
Poniższy fragment kodu pokazuje, jak wykryć, czy wiadomość jest TNEF.
MailMessage mail = MailMessage.Load(dataDir + "tnefEml1.eml");
bool isTnef = mail.OriginalIsTnef;
Console.WriteLine("Is input EML originally TNEF? {0}", isTnef.ToString());
Zidentyfikuj załączniki w formacie TNEF
Ten Attachment.IsTnef właściwość umożliwia wykrycie, czy załącznik wiadomości jest sformatowany jako TNEF.
var eml = MailMessage.Load(fileName);
foreach (var attachment in eml.Attachments)
{
Console.WriteLine($"Is Attachment TNEF?: {attachment.IsTnef}");
}