Quản lý Tệp Đính Kèm Tin Nhắn
Xử Lý Tệp Đính Kèm trong Outlook
Tạo và Lưu Tệp Tin nhắn Outlook (MSG) giải thích cách tạo và lưu tin nhắn, cũng như cách tạo các tệp MSG có đính kèm. Bài viết này giải thích cách quản lý các tệp đính kèm Microsoft Outlook với Aspose.Email. Các tệp đính kèm từ một tệp tin nhắn được truy cập và lưu vào đĩa bằng cách sử dụng MapiMessage lớp Tệp Đính Kèm thuộc tính. The Tệp Đính Kèm thuộc tính là một tập hợp kiểu MapiAttachmentCollection lớp.
Kiểm Tra Loại Tệp Đính Kèm (Nội Tuyến hoặc Thông Thường)
Các tệp đính kèm nội tuyến và thông thường phục vụ các mục đích khác nhau. Các tệp đính kèm nội tuyến được tích hợp trực quan vào tin nhắn email và thường là hình ảnh hoặc tệp media. Trong khi đó, các tệp đính kèm thông thường là các tệp riêng biệt được đính kèm vào email và có thể bao gồm nhiều loại tệp khác nhau. The MapiAttachment.IsInline thuộc tính của MapiAttachment lớp nhận giá trị cho biết đính kèm là nội tuyến hay thông thường.
Mẫu mã dưới đây trích xuất và hiển thị thông tin về mỗi tệp đính kèm trong MapiMessage đã tải, bao gồm tên hiển thị của chúng và việc chúng có phải là tệp đính kèm nội tuyến hay không.
var message = MapiMessage.Load(fileName);
foreach (var attach in message.Attachments)
{
Console.WriteLine($"{attach.DisplayName} : {attach.IsInline}");
}
Kiểm Tra Loại Tệp Đính Kèm (IsReference)
Cái MapiAttachment lớp bao gồm IsReference thuộc tính cho phép các nhà phát triển xác định các tệp đính kèm tham chiếu trong một tin nhắn. Với mẫu mã dưới đây, bạn có thể kiểm tra xem một tệp đính kèm có phải là tệp đính kèm tham chiếu hay không:
foreach (var attachment in msg.Attachments)
{
if (attachment.IsReference)
{
// Process reference attachment
}
}
Lưu Đính kèm từ Tệp MSG
Để lưu các đính kèm từ tệp MSG:
- Lặp qua MapiAttachmentCollection bộ sưu tập và lấy các đính kèm riêng lẻ.
- Để lưu các tệp đính kèm, gọi phương thức Save() của lớp MapiAttachment.
Đoạn mã dưới đây cho bạn thấy cách lưu các tệp đính kèm vào ổ đĩa cục bộ.
// 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);
}
Trích Xuất Tệp Đính Kèm từ Các Tệp MSG Định Dạng RTF
Đối với các tin nhắn được định dạng dưới dạng RTF, mã dưới đây có thể được sử dụng để phân biệt và trích xuất các tệp đính kèm là Nội Tuyến hoặc xuất hiện dưới dạng Biểu tượng trong phần thân tin nhắn. Đoạn mã dưới đây cho bạn thấy cách Xác định và Trích xuất một tệp đính kèm nhúng từ MSG được định dạng 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);
}
}
}
Lấy Các Tệp Đính Kèm Tin Nhắn Thư Lồng Nhau
Các tệp đính kèm OLE nhúng cũng xuất hiện trong MapiMessage lớp bộ sưu tập Attachment. Ví dụ mã dưới đây phân tích một tệp tin nhắn để tìm các tệp đính kèm tin nhắn nhúng và lưu nó vào đĩa. The MapiMessage phương thức tĩnh FromProperties() của lớp có thể tạo một tin nhắn mới từ tệp đính kèm nhúng. Đoạn mã dưới đây cho bạn thấy cách lấy các tệp đính kèm tin nhắn thư lồng nhau.
// 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);
Xóa Đính kèm
Thư viện Aspose Outlook cung cấp chức năng xóa tệp đính kèm khỏi các tệp Microsoft Outlook Message (.msg):
- Gọi phương thức RemoveAttachments(). Nó nhận đường dẫn của tệp tin tin nhắn làm tham số. Phương thức này được triển khai dưới dạng public static, vì vậy bạn không cần khởi tạo đối tượng.
Đoạn mã sau cho bạn cách xóa các tệp đính kèm.
MapiMessage.RemoveAttachments(dataDir + "AttachmentsToRemove_out.msg");
Bạn cũng có thể gọi MapiMessage phương thức tĩnh của lớp DestroyAttachments(). Nó nhanh hơn RemoveAttachments(), vì phương thức RemoveAttachments() phân tích tệp tin nhắn.
MapiMessage.DestroyAttachments(dataDir + "AttachmentsToDestroy_out.msg");
Thêm Đính kèm MSG
Một tin nhắn Outlook có thể chứa các tin nhắn Microsoft Outlook khác trong dạng tệp đính kèm, bao gồm dạng thông thường hoặc nhúng. The MapiAttachmentCollection cung cấp các thành viên nạp chồng của Thêm phương thức để tạo tin nhắn Outlook với cả hai loại tệp đính kèm:
Add(string name, byte[] data)– thêm một tệp đính kèm thường từ một mảng byte.Add(string name, MapiMessage message)– thêm một tin nhắn Outlook khác như một tin nhắn nhúng.
Đoạn mã sau cho bạn cách thêm cả hai loại tệp đính kèm vào một tin nhắn.
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");
Try it out!
Thêm hoặc xóa các tệp đính kèm email với phiên bản miễn phí Aspose.Email Editor App.
Thêm Tệp Đính Kèm Tham Chiếu vào MapiMessages
Cái ReferenceAttachmentOptions lớp đơn giản hoá việc thêm tệp đính kèm tham chiếu bằng cách bao gói tất cả các thuộc tính cần thiết trong một đối tượng duy nhất.
Các Tham Số của ReferenceAttachmentOptions:
- sharedLink: Liên kết chia sẻ đầy đủ cho tệp đính kèm được cung cấp bởi dịch vụ web lưu trữ tệp.
- url: Vị trí tệp hoặc URL tài nguyên.
- providerName: Tên của nhà cung cấp tệp đính kèm tham chiếu (ví dụ: Google Drive, Dropbox).
- Ví dụ: Thêm Tệp Đính Kèm Tham Chiếu với 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);
Nhúng Tin nhắn làm Đính kèm
Đoạn mã dưới đây cho bạn thấy cách nhúng một tệp đính kèm MSG vào một tin nhắn.
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");
Đọc Tin nhắn Nhúng từ Đính kèm
Đoạn mã dưới đây cho bạn thấy cách đọc các tin nhắn nhúng từ đính kèm.
var message = MapiMessage.FromFile(fileName);
if (message.Attachments[0].ObjectData.IsOutlookMessage)
{
var getData = message.Attachments[0].ObjectData.ToMapiMessage();
}
Chèn và Thay Thế Tệp Đính Kèm
Aspose.Email API cung cấp khả năng chèn đính kèm tại chỉ số cụ thể trong tin nhắn cha. Nó cũng cung cấp tiện ích để thay thế nội dung của một đính kèm bằng đính kèm của tin nhắn khác.
Try it out!
Chạy ReplaceAttach dự án ứng dụng đơn giản, và thử các khả năng của Aspose.Email để thay thế tệp đính kèm trong thực tế.
Chèn Đính kèm vào Vị trí Cụ thể
API Aspose.Email cung cấp khả năng chèn một tệp đính kèm MSG vào một MSG cha bằng cách sử dụng phương thức Insert của MapiAttachmentCollection MapiAttachmentCollection Insert(int index, string name, MapiMessage msg). Đoạn mã dưới đây cho bạn thấy cách chèn một tệp đính kèm vào vị trí cụ thể.
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);
Thay thế Nội dung Đính kèm
Điều này có thể được sử dụng để thay thế nội dung tệp đính kèm nhúng bằng các nội dung mới bằng phương thức Replace. Tuy nhiên, không thể dùng để chèn tệp đính kèm với PR_ATTACH_NUM = 4 (ví dụ) vào bộ sưu tập khi collection.Count = 2. Đoạn mã dưới đây cho bạn thấy cách thay thế nội dung tệp đính kèm.
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);
Đổi Tên Tệp Đính Kèm trong MapiMessage
Bạn có thể chỉnh sửa giá trị thuộc tính DisplayName trong các tệp đính kèm MapiMessage.
var msg = MapiMessage.Load(fileName);
msg.Attachments[0].DisplayName = "New display name 1";
msg.Attachments[1].DisplayName = "New display name 2";
Lưu Tệp Đính Kèm từ Các Tin Nhắn Đã Ký Số
Aspose.Email API cung cấp khả năng lấy hoặc đặt giá trị cho biết liệu tin nhắn được ký rõ sẽ được giải mã hay không.
Trích xuất các đối tượng OLE nhúng từ oledata.mso
Đôi khi dữ liệu OLE nhúng được biểu thị dưới dạng một oledata.mso đính kèm trong một MapiAttachment và cần phải được trích xuất thủ công. Những oledata.mso các tệp ở định dạng Microsoft Compound Document File (MCDF), và hỗ trợ cho các tệp như vậy nằm ngoài phạm vi của Aspose.Email. Tuy nhiên, Aspose.Email có thể được sử dụng kết hợp với các thư viện mã nguồn mở khác, chẳng hạn như OpenMCDF, để đọc nội dung các tệp này và lưu chúng lên đĩa. Aspose.Email cung cấp InlineAttachmentExtractor lớp để duyệt các gói MSO có trong dữ liệu nhị phân của oledata.mso, có thể sau đó được chuyển cho thư viện đọc tệp hợp chất để trích xuất nội dung.
Khi loại nội dung tin nhắn là HTML (không phải RTF) và có các đối tượng OLE trong tin nhắn, MapiPropertyTag.PR_ATTACH_DATA_OBJ thuộc tính không tồn tại. Trong trường hợp này, thông tin về các đối tượng OLE nằm trong oledata.mso.
Để trích xuất nội dung bằng Aspose.Email và OpenMCDF:
- Duyệt các gói MSO từ dữ liệu nhị phân của
oledata.msođính kèm. - Đối với mỗi mục OLE, đọc tệp hợp chất.
- Đọc stream có tên
CONTENTS. - Lưu nội dung vào một
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++;
}
}
}