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

Zapisz załączniki 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);

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}");
}