Обработка на TNEF прикачени файлове в имейл съобщения
TNEF (Transport Neutral Encapsulation Format) е собствен формат, използван от Microsoft Outlook за инкапсулиране на богато съдържание в прикачени файлове – най-често съхраняван като winmail.dat. API‑то Aspose.Email позволява да четете имейл съобщения, които имат TNEF прикачени файлове, и да модифицирате съдържанието на прикачения файл. След това имейлът може да бъде запазен като обикновен имейл или в същия формат, запазвайки TNEF прикачените файлове. Тази статия показва различни примерни кодове за работа със съобщения, съдържащи TNEF прикачени файлове. Тя също така показва как да създавате TNEF EML файлове от Outlook MSG файлове.
Прочетете съобщение с TNEF прикачен файл
Следният фрагмент от код показва как да прочетете съобщение, запазвайки 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);
}
Прочетете съобщение без TNEF прикачен файл
Следният кодов фрагмент показва как да прочетете съобщение без запазване на TNEF прикачени файлове. Настройването на PreserveTnefAttachments на false е поведението по подразбиране: TNEF контейнерът се декодира и съдържанието му се излага като редовни прикачени файлове вместо един файл 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);
}
Зареждане и записване на TNEF прикачвания
С Aspose.Email за .NET можете директно да заредите TNEF прикачени файлове в MapiAttachment обекта, като се използва път до файл или поток, и след това запазва обекта във формат TNEF. Това позволява създаването на winmail.dat файлове или запазването на специфичното за Outlook форматиране в имейл работни процеси.
API‑то предоставя следните членове в MapiAttachment клас:
Зареждане на TNEF прикачени файлове
-
static MapiAttachment LoadFromTnef(string fileName) - Зарежда TNEF прикачен файл от .dat файл.
-
static MapiAttachment LoadFromTnef(Stream stream) - Зарежда TNEF прикачен файл от поток (например MemoryStream или файл поток).
Записване на TNEF прикачени файлове
-
void SaveToTnef(string filename) - Записва MapiAttachment във файл TNEF.
-
void SaveToTnef(Stream stream) - Записва MapiAttachment в поток във формат TNEF.
Примерният код по-долу демонстрира как да извлечете winmail.dat прикачен файл от имейл съобщение, да го запазите и отново да го добавите като прикачен файл към съобщението:
// 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);
Актуализиране на ресурси в TNEF прикачен файл
Следният фрагмент от код показва как да актуализирате ресурси в TNEF прикачен файл и да запазите 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));
}
}
Добавяне на прикачен файл към TNEF съобщение
Следният фрагмент от код показва как да добавите нови прикачени файлове към главното съобщение, съдържащо 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);
Създаване на TNEF EML от MSG
Outlook MSG файловете понякога съдържат информация като таблици и текстови стилове, които могат да бъдат нарушени при конвертиране към EML. Създаването на TNEF съобщения от такива MSG файлове позволява запазването на форматирането и дори изпращането на тези съобщения чрез имейл клиентите, като се запазва форматирането. The MailConversionOptions.ConvertAsTnef свойството се използва за постигане на това. Следният фрагмент от код показва как да създадете TNEF EML от MSG.
MapiMessage mapiMsg = MapiMessage.FromFile(dataDir + "Message.msg");
MailConversionOptions mco = new MailConversionOptions();
mco.ConvertAsTnef = true;
MailMessage message = mapiMsg.ToMailMessage(mco);
Алтернативно, TNEF EML може да се произведе чрез зареждане на MSG файла с PreserveTnefAttachments опция от MsgLoadOptions клас, включен, и след това се запазва резултатът като 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 класът е остарял. Използвайте наследниците, специфични за формата, на LoadOptions клас вместо — MsgLoadOptions, EmlLoadOptions, и така нататък.
Идентифициране на съобщения във формат TNEF
Следният фрагмент от код показва как да откриете дали съобщението е TNEF.
MailMessage mail = MailMessage.Load(dataDir + "tnefEml1.eml");
bool isTnef = mail.OriginalIsTnef;
Console.WriteLine("Is input EML originally TNEF? {0}", isTnef.ToString());
Идентифициране на прикачени файлове във формат TNEF
Този Attachment.IsTnef свойството позволява да се открие дали прикаченият файл към съобщението е във формат TNEF.
var eml = MailMessage.Load(fileName);
foreach (var attachment in eml.Attachments)
{
Console.WriteLine($"Is Attachment TNEF?: {attachment.IsTnef}");
}