Керування вкладеннями повідомлень
Обробка вкладень в Outlook
Створення та збереження Outlook повідомлень (MSG) файлів пояснює, як створювати та зберігати повідомлення, а також створювати MSG‑файли з вкладеннями. У цій статті розглядається, як керувати вкладеннями Microsoft Outlook за допомогою Aspose.Email. Вкладення з файлу повідомлення отримуються і зберігаються на диск за допомогою MapiMessage клас Вкладення властивість. Цей Вкладення властивість є колекцією типу MapiAttachmentCollection клас.
Перевірка типу вкладення (вбудоване чи звичайне)
Вбудовані та звичайні вкладення виконують різні функції. Вбудовані вкладення візуально інтегруються у повідомлення електронної пошти і зазвичай є зображеннями або медіа‑файлами. Натомість звичайні вкладення — це окремі файли, приєднані до листа, які можуть включати різні типи файлів. The MapiAttachment.IsInline властивість MapiAttachment клас отримує значення, що вказує, чи є вкладення вбудованим чи звичайним.
Наступний приклад коду витягує та відображає інформацію про кожне вкладення у завантаженому MapiMessage, включаючи їхні назви для відображення та чи є вони вбудованими (inline) або ні.
var message = MapiMessage.Load(fileName);
foreach (var attach in message.Attachments)
{
Console.WriteLine($"{attach.DisplayName} : {attach.IsInline}");
}
Перевірка типу вкладення (IsReference)
The MapiAttachment клас включає IsReference властивість, яка дозволяє розробникам ідентифікувати референсні вкладення у повідомленні. За допомогою наступного прикладу коду можна перевірити, чи є вкладення референсним:
foreach (var attachment in msg.Attachments)
{
if (attachment.IsReference)
{
// Process reference attachment
}
}
Зберегти прикріплення з MSG файлів
Щоб зберегти прикріплення з MSG файлу:
- Ітеруйте через MapiAttachmentCollection колекцію та отримайте окремі прикріплення.
- Щоб зберегти вкладення, викличте метод Save() класу MapiAttachment.
Наступний фрагмент коду показує, як зберегти вкладення на локальний диск.
// Create an instance of MapiMessage from file
MapiMessage message = MapiMessage.FromFile(dataDir + fileName);
// Iterate through the attachments collection
foreach (MapiAttachment attachment in message.Attachments)
{
// Save the individual attachment
attachment.Save(dataDir + attachment.FileName);
}
Витягнути вкладення з MSG‑файлів у форматі RTF
Для повідомлень у форматі RTF можна використати наступний код, щоб розрізнити та витягнути вкладення, які є або вбудованими (Inline), або відображаються як іконка у тілі повідомлення. Наступний фрагмент коду показує, як ідентифікувати та витягти вбудоване вкладення з MSG, сформованого у форматі RTF.
var eml = MapiMessage.Load("MSG file with RTF Formatting.msg");
foreach (var attachment in eml.Attachments)
{
if (IsAttachmentInline(attachment))
{
try
{
SaveAttachment(attachment, Guid.NewGuid().ToString());
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
static bool IsAttachmentInline(MapiAttachment attachment)
{
foreach (var property in attachment.ObjectData.Properties.Values)
{
if (property.Name == "\x0003ObjInfo")
{
var odtPersist1 = BitConverter.ToUInt16(property.Data, 0);
return (odtPersist1 & (1 << (7 - 1))) == 0;
}
}
return false;
}
static void SaveAttachment(MapiAttachment attachment, string fileName)
{
foreach (var property in attachment.ObjectData.Properties.Values)
{
if (property.Name == "Package")
{
using var fs = new FileStream(fileName, FileMode.Create, FileAccess.Write);
fs.Write(property.Data, 0, property.Data.Length);
}
}
}
Отримати вбудовані поштові повідомлення‑вкладення
Вбудовані OLE‑вкладення також з’являються у MapiMessage Колекція класу Attachment. Наступний приклад коду розбирає файл повідомлення на предмет вбудованих вкладень повідомлень та зберігає його на диск. The MapiMessage Статичний метод класу FromProperties() може створити нове повідомлення з вбудованого вкладення. Наступний фрагмент коду показує, як отримати вкладення вбудованих поштових повідомлень.
// Create a MapiMessage object from the individual attachment
MapiMessage getAttachment = MapiMessage.FromProperties(attachment.ObjectData.Properties);
// Convert the embedded message to a MailMessage and save it to disk
MailMessage mailMessage = getAttachment.ToMailMessage(new MailConversionOptions());
mailMessage.Save(dataDir + @"NestedMailMessageAttachments_out.eml", SaveOptions.DefaultEml);
Видалити прикріплення
Бібліотека Aspose Outlook забезпечує можливість видаляти вкладення з файлів Microsoft Outlook Message (.msg):
- Викличте метод RemoveAttachments(). Він приймає шлях до файлу повідомлення як параметр. Реалізовано як публічний статичний метод, тому не потрібно створювати екземпляр об’єкта.
Наступний код показує, як видалити вкладення.
MapiMessage.RemoveAttachments(dataDir + "AttachmentsToRemove_out.msg");
Ви також можете викликати the MapiMessage статичний метод класу DestroyAttachments(). Працює швидше, ніж RemoveAttachments(), оскільки метод RemoveAttachments() розбирає файл повідомлення.
MapiMessage.DestroyAttachments(dataDir + "AttachmentsToDestroy_out.msg");
Додати MSG прикріплення
Повідомлення Outlook може містити інші повідомлення Microsoft Outlook у вигляді вкладень, будь то звичайні або вбудовані повідомлення. The MapiAttachmentCollection надає перевантажені члени класу Додати метод для створення Outlook‑повідомлень з обома типами вкладень:
Add(string name, byte[] data)– додає звичайне вкладення з масиву байтів.Add(string name, MapiMessage message)– додає інше повідомлення Outlook як вбудоване повідомлення.
Наступний код показує, як додати обидва типи вкладень до повідомлення.
MapiMessage message = new MapiMessage("from@test.com", "to@test.com", "Subj", "This is a message body");
// Add a regular attachment from a byte array
message.Attachments.Add("note.txt", File.ReadAllBytes(dataDir + "note.txt"));
// Add another Outlook message as an embedded message
MapiMessage attachMsg = MapiMessage.FromFile(dataDir + "Message.msg");
message.Attachments.Add("Weekly report.msg", attachMsg);
message.Save(dataDir + "WithAttachments_out.msg");
Спробуйте!
Додавати або видаляти електронні вкладення за допомогою безкоштовного Aspose.Email Editor App.
Додати референсні вкладення до MapiMessages
The ReferenceAttachmentOptions клас спрощує додавання референсних вкладень, інкапсулюючи всі необхідні властивості в одному об’єкті.
Параметри ReferenceAttachmentOptions:
- sharedLink: Повністю кваліфіковане спільне посилання на вкладення, надане веб‑сервісом, що розміщує файл.
- url: Розташування файлу або URL ресурсу.
- providerName: Назва провайдера референсних вкладень (наприклад, Google Drive, Dropbox).
- Приклад: Додавання референсного вкладення за допомогою ReferenceAttachmentOptions
var options = new ReferenceAttachmentOptions(
"https://drive.google.com/file/d/1HJ-M3F2qq1oRrTZ2GZhUdErJNy2CT3DF/",
"https://drive.google.com/drive/my-drive",
"GoogleDrive");
// Add reference attachment
msg.Attachments.Add("Document.pdf", options);
Вбудовування повідомлень як прикріплень
Наступний фрагмент коду показує, як вбудувати MSG‑файл як вкладення в повідомлення.
MapiMessage message = new MapiMessage("from@test.com", "to@test.com", "Subj", "This is a message body");
MapiMessage attachMsg = MapiMessage.FromFile(dataDir + "Message.msg");
message.Attachments.Add("Weekly report.msg", attachMsg);
message.Save(dataDir + "WithEmbeddedMsg_out.msg");
Читання вбудованих повідомлень з прикріплень
Нижче наведений фрагмент коду показує, як читати вбудовані повідомлення з прикріплень.
var message = MapiMessage.FromFile(fileName);
if (message.Attachments[0].ObjectData.IsOutlookMessage)
{
var getData = message.Attachments[0].ObjectData.ToMapiMessage();
}
Вставка та заміна вкладення
Aspose.Email API надає можливість вставляти вкладення у вказаний індекс батьківського повідомлення. Він також забезпечує можливість заміняти вміст вкладення іншим повідомлення‑вкладенням.
Спробуйте!
Запустіть ReplaceAttach простий проєкт програми, і спробуйте можливості Aspose.Email для заміни вкладень у дії.
Вставка прикріплень у певних місцях
API Aspose.Email забезпечує можливість вставити MSG‑вкладення до батьківського MSG за допомогою методу Insert колекції MapiAttachmentCollection MapiAttachmentCollection Insert(int index, string name, MapiMessage msg). Наступний фрагмент коду показує, як вставити вкладення у конкретне місце.
var message = MapiMessage.FromFile(fileName);
var memoryStream = new MemoryStream();
message.Attachments[2].Save(memoryStream);
var getData = MapiMessage.FromStream(memoryStream);
message.Attachments.Insert(1, "new 11", getData);
Замінити вміст прикріплення
Це можна використати для заміни вбудованого вмісту вкладень новим за допомогою методу Replace. Однак це не можна застосовувати для вставлення вкладення з PR_ATTACH_NUM = 4 (наприклад) у колекцію, у якої collection.Count = 2. Наступний фрагмент коду показує, як замінити вміст вкладення.
var message = MapiMessage.FromFile(fileName);
var memoryStream = new MemoryStream();
message.Attachments[2].Save(memoryStream);
var getData = MapiMessage.FromStream(memoryStream);
message.Attachments.Replace(1, "new 1", getData);
Перейменування вкладень у MapiMessage
Можливо редагувати значення властивості DisplayName у вкладеннях MapiMessage.
var msg = MapiMessage.Load(fileName);
msg.Attachments[0].DisplayName = "New display name 1";
msg.Attachments[1].DisplayName = "New display name 2";
Зберегти вкладення з цифрово підписаних повідомлень
Aspose.Email API надає можливість отримати або встановити значення, що вказує, чи буде декодовано чисто підписане повідомлення.
Витягнути вбудовані OLE‑об’єкти з oledata.mso
Інколи вбудовані OLE‑дані представляються як oledata.mso вкладення у MapiAttachment і їх потрібно витягнути вручну. Ці oledata.mso файли у форматі Microsoft Compound Document File (MCDF), і підтримка таких файлів виходить за межі Aspose.Email. Однак Aspose.Email можна використовувати разом з іншими open‑source бібліотеками, такими як OpenMCDF, для читання вмісту цих файлів і збереження їх на диск. Aspose.Email забезпечує InlineAttachmentExtractor клас для перелічення пакетів MSO, що містяться у бінарних даних oledata.mso, яку можна передати бібліотеці читання складених файлів для витягнення вмісту.
Коли тип тіла повідомлення — HTML (не RTF) і в повідомленні є OLE‑об’єкти, MapiPropertyTag.PR_ATTACH_DATA_OBJ властивість відсутня. У цьому випадку інформація про OLE‑об’єкти міститься у oledata.mso.
Щоб витягнути вміст за допомогою Aspose.Email та OpenMCDF:
- Перелічити пакети MSO з бінарних даних
oledata.msoвкладення. - Для кожного OLE‑елемента прочитати складений файл.
- Прочитати потік з назвою
CONTENTS. - Зберегти вміст у
FileStream.
// The path to the File directory
string dataDir = RunExamples.GetDataDir_Email();
MapiMessage msg = MapiMessage.FromFile(dataDir + "double.msg");
foreach (MapiAttachment mapiAttachment in msg.Attachments)
{
if (mapiAttachment.LongFileName == "oledata.mso")
{
IDictionary<string, byte[]> oledata = InlineAttachmentExtractor.EnumerateMsoPackage(new MemoryStream(mapiAttachment.BinaryData));
int index = 0;
foreach (var oleItem in oledata)
{
// Using the OpenMCDF library
CompoundFile cf = new CompoundFile(new MemoryStream(oleItem.Value));
CFStream contents = cf.RootStorage.GetStream("CONTENTS");
using (FileStream fs = File.OpenWrite(index + ".pdf"))
{
byte[] data = contents.GetData();
fs.Write(data, 0, data.Length);
fs.Flush();
fs.Close();
}
index++;
}
}
}