Làm việc với Tệp đính kèm và Đối tượng Nhúng

Quản lý Tệp đính kèm Email

Tệp đính kèm email là một tệp được gửi cùng với tin nhắn email. Tệp có thể được gửi như một tin nhắn riêng biệt cũng như là một phần của tin nhắn mà nó được đính kèm. Attachment lớp được sử dụng với MailMessage lớp. Tất cả tin nhắn bao gồm phần thân. Ngoài phần thân, bạn có thể muốn gửi các tệp bổ sung. Những tệp này được gửi dưới dạng đính kèm và được đại diện bằng một thể hiện của Attachment lớp. Bạn có thể gửi bất kỳ số lượng tệp đính kèm nào nhưng kích thước của tệp đính kèm bị giới hạn bởi máy chủ mail. Gmail, ví dụ, không hỗ trợ tệp lớn hơn 10MB.

Thêm Tệp Đính Kèm

Để đính kèm một tệp vào email, vui lòng thực hiện các bước sau:

  1. Tạo một đối tượng của MailMessage lớp.
  2. Tạo một đối tượng của Attachment lớp.
  3. Tải tệp đính kèm vào Attachment thể hiện.
  4. Thêm Attachment thể hiện vào MailMessage thể hiện.

Đoạn mã dưới đây cho bạn thấy cách thêm một tệp đính kèm vào email.

// Create an instance of MailMessage class
MailMessage message = new MailMessage();
message.setFrom(new MailAddress("sender@from.com"));
message.getTo().add("receiver@to.com");
message.setSubject("This is message");
message.setBody("This is body");

// Load an attachment
Attachment attachment = new Attachment("1.txt");

// Add Multiple Attachment in instance of MailMessage class and Save message to disk
message.getAttachments().addItem(attachment);
message.addAttachment(new Attachment("1.jpg"));
message.addAttachment(new Attachment("1.doc"));
message.addAttachment(new Attachment("1.rar"));
message.addAttachment(new Attachment("1.pdf"));
message.save("AddAttachments.eml");

Ở trên, chúng tôi đã mô tả cách thêm tệp đính kèm vào tin nhắn email của bạn với Aspose.Email. Tiếp theo là cách loại bỏ tệp đính kèm và hiển thị thông tin về chúng trên màn hình.

Xóa một Tệp Đính Kèm

Để loại bỏ một tệp đính kèm, hãy thực hiện các bước dưới đây:

  • Tạo một thể hiện của Attachment lớp.
  • Tải tệp đính kèm trong thể hiện của Attachment lớp.
  • Thêm tệp đính kèm vào thể hiện của MailMessage lớp.
  • Xóa các tệp đính kèm khỏi thể hiện của Attachment lớp sử dụng MailMessage đối tượng lớp.

Đoạn mã dưới đây cho bạn thấy cách loại bỏ một tệp đính kèm.

// Create an instance of MailMessage class
MailMessage eml = new MailMessage();
eml.setFrom(new MailAddress("sender@from.com"));
eml.getTo().add("receiver@to.com");

// Load an attachment
Attachment attachment = new Attachment("1.txt");
eml.getAttachments().addItem(attachment);

// Remove attachment from your MailMessage
eml.getAttachments().removeItem(attachment);

Hiển thị Tên Tệp Đính Kèm

Để hiển thị tên tệp đính kèm, thực hiện các bước sau:

  1. Lặp qua các tệp đính kèm trong tin nhắn email và
    1. Lưu từng tệp đính kèm.
    2. Hiển thị tên mỗi tệp đính kèm trên màn hình.

Đoạn mã dưới đây cho bạn thấy cách hiển thị tên tệp đính kèm trên màn hình.

MailMessage eml = MailMessage.load("Attachments.eml");

for (Attachment attachment : eml.getAttachments()) {
    // Display the attachment file name
    System.out.println(attachment.getName());
}

Trích xuất Tệp Đính Kèm Email

Chủ đề này giải thích cách trích xuất một tệp đính kèm từ một tệp email. Tệp đính kèm email là một tệp được gửi kèm theo một tin nhắn email. Tệp có thể được gửi như một tin nhắn riêng biệt cũng như là một phần của tin nhắn mà nó được đính kèm. Tất cả các tin nhắn email đều có tùy chọn để gửi các tệp bổ sung. Các tệp này được gửi dưới dạng tệp đính kèm và được biểu thị như các thể hiện của Attachment lớp. Attachment lớp được sử dụng với MailMessage lớp để làm việc với các tệp đính kèm. Để trích xuất các tệp đính kèm từ một tin nhắn email, hãy thực hiện các bước sau:

  • Tạo một đối tượng của MailMessage lớp.
  • Tải một tệp email vào MailMessage thể hiện.
  • Tạo một đối tượng của Attachment lớp và sử dụng nó trong một vòng lặp để trích xuất tất cả các tệp đính kèm.
  • Lưu tệp đính kèm và hiển thị nó trên màn hình.

|Tệp đính kèm đã được trích xuất trong email| | :- | |todo:image_alt_text| Đoạn mã dưới đây cho bạn thấy cách Trích xuất Tệp Đính Kèm Email.

MailMessage eml = MailMessage.load("Message.eml", new MsgLoadOptions());

for (Attachment attachment : eml.getAttachments()) {
    attachment.save("MessageEmbedded_out.eml");
    System.out.println(attachment.getName());
}

Lấy Content-Description từ Tệp Đính Kèm

API Aspose.Email cung cấp khả năng đọc Content-Description của tệp đính kèm từ tiêu đề tệp đính kèm. Đoạn mã dưới đây cho bạn thấy cách lấy mô tả nội dung từ tệp đính kèm.

MailMessage eml = MailMessage.load("EmailWithAttachEmbedded.eml");
System.out.println(eml.getAttachments().get_Item(0).getHeaders().get_Item("Content-Description"));

Xác định xem Tệp Đính Kèm có phải là Tin Nhắn Nhúng hay không

Đoạn mã dưới đây minh họa cách xác định liệu tệp đính kèm có phải là tin nhắn nhúng hay không.

MailMessage eml = MailMessage.load("EmailWithAttachEmbedded.eml");

System.out.println(eml.getAttachments().get_Item(0).isEmbeddedMessage()
        ? "Attachment is an embedded message."
        : "Attachment isn't an embedded message.");

Xác định Tệp Đính Kèm Định Dạng TNEF

Cái Attachment.isTnef thuộc tính của Aspose.Email Java API cho biết liệu tệp đính kèm tin nhắn có phải là tin nhắn định dạng TNEF hay không.

Đoạn mã dưới đây minh họa cách xác định xem một tệp đính kèm có định dạng TNEF hay không:

MailMessage eml = MailMessage.load(fileName);

for (Attachment attachment : eml.getAttachments()) {
    System.out.println("Is Attachment TNEF?: " + attachment.isTnef());
}

Tải và Lưu Tệp Đính Kèm TNEF

Aspose.Email cho Java cung cấp các phương thức trong MapiAttachment lớp để thực hiện các thao tác sau:

Tải từ TNEF

  • static MapiAttachment loadFromTnef(String fileName) – Tải một tệp đính kèm từ tệp TNEF.

  • static MapiAttachment loadFromTnef(InputStream stream) – Tải một tệp đính kèm từ luồng TNEF.

Lưu dưới dạng TNEF

  • void saveToTnef(String fileName) – Lưu một tệp đính kèm vào tệp TNEF.

  • void saveToTnef(OutputStream stream) – Lưu một tệp đính kèm vào luồng TNEF.

Mẫu mã sau đây minh họa cách trích xuất một tệp đính kèm TNEF từ một tin nhắn, lưu nó vào luồng hoặc tệp, và sau đó tải lại vào tin nhắn như một MapiAttachment:

// Load message containing a TNEF attachment (winmail.dat)
MapiMessage msg = MapiMessage.load("message.eml");

// Save the first attachment to a TNEF stream
ByteArrayOutputStream bos = new ByteArrayOutputStream();
msg.getAttachments().get(0).saveToTnef(bos);

// Load attachment back from the TNEF stream
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
MapiAttachment fromtnefAttachment = MapiAttachment.loadFromTnef(bis);
msg.getAttachments().addMapiAttachment(fromtnefAttachment);

// Load TNEF attachment directly from a file
fromtnefAttachment = MapiAttachment.loadFromTnef("winmail.dat");
msg.getAttachments().addMapiAttachment(fromtnefAttachment);

Trích xuất URI của Tệp Đính Kèm nếu Tệp Đính Kèm là URI-attachment

Đoạn mã dưới đây minh họa cách trích xuất URI của Tệp Đính Kèm.

MailMessage eml = MailMessage.load("fileName");

Attachment attachment = eml.getAttachments().get_Item(0);
if (attachment.isUri()) {
    InputStream inputStream = attachment.getContentStream();
    String uri = new String(IOUtils.toByteArray(inputStream), Charset.forName("utf-8"));
    System.out.println("Attachment URI: " + uri);
}

Thêm Tệp Đính Kèm Tham Chiếu

Một tệp đính kèm tham chiếu là một lựa chọn thay thế cho tệp đính kèm tệp cục bộ. Trong một số trường hợp, tệp đính kèm tham chiếu có thể là ưu tiên, ví dụ, nếu bạn muốn quản lý quyền truy cập của nó. Các lớp dưới đây được sử dụng để quản lý và thao tác các tin nhắn email và các tệp đính kèm của chúng:

Mẫu mã sau đây minh họa cách tải một tin nhắn email từ tệp, tạo một tệp đính kèm tham chiếu với các thuộc tính cụ thể, và thêm tệp đính kèm vào tin nhắn email:

MailMessage eml = MailMessage.load("fileName");

ReferenceAttachment refAttach = new ReferenceAttachment("https://[attach_uri]")
refAttach.setName("Document.docx");
refAttach.setProviderType(AttachmentProviderType.OneDrivePro);
refAttach.setPermissionType(AttachmentPermissionType.AnyoneCanEdit);

eml.getAttachments().addItem(refAttach);

Làm việc với các đối tượng nhúng

Một đối tượng nhúng là một đối tượng được tạo bằng một ứng dụng và được chèn vào trong một tài liệu hoặc tệp được tạo bởi một ứng dụng khác. Ví dụ, một bảng tính Microsoft Excel có thể được nhúng vào báo cáo Microsoft Word, hoặc một tệp video có thể được nhúng vào bài thuyết trình Microsoft PowerPoint. Khi một tệp được nhúng, thay vì chèn hoặc dán vào tài liệu khác, nó giữ nguyên định dạng gốc. Tài liệu nhúng có thể được mở trong ứng dụng gốc và được chỉnh sửa.

Nhúng các đối tượng vào Email

Cái LinkedResource lớp được sử dụng với  MailMessage lớp để nhúng các đối tượng vào tin nhắn email của bạn. Để thêm một đối tượng nhúng, hãy làm theo các bước sau

  1. Tạo một đối tượng của MailMessage lớp.
  2. Xác định các giá trị từ, đến và chủ đề trong MailMessage thể hiện.
  3. Tạo một đối tượng của AlternateView lớp.
  4. Tạo một đối tượng của LinkedResource lớp.
  5. Tải một đối tượng nhúng vào LinkedResourceCollection.
  6. Thêm đối tượng nhúng đã tải vào MailMessage đối tượng lớp.
  7. Thêm AlternateView thể hiện tới MailMessage đối tượng lớp.

Các đoạn mã dưới đây tạo ra một tin nhắn email với cả phần thân văn bản thuần và HTML và một hình ảnh được nhúng vào HTML

|Hình ảnh nhúng vào email| | :- | |todo:image_alt_text| Bạn có thể gửi bất kỳ số lượng đối tượng nhúng nào. Kích thước của tệp đính kèm bị giới hạn bởi máy chủ thư. Gmail, chẳng hạn, không hỗ trợ tệp lớn hơn 10MB. Các đoạn mã dưới đây minh họa cách nhúng các đối tượng vào Email.

// Create an instance of the MailMessage class and Set the addresses and Set the content
MailMessage mail = new MailMessage();
mail.setFrom(new MailAddress("sender@from.com"));
mail.getTo().add("receiver@to.com");
mail.setSubject("This is an email");

// Create the plain text part It is viewable by those clients that don't support HTML
AlternateView plainView = AlternateView.createAlternateViewFromString("This is my plain text content", null, "text/plain");

// Create the HTML part.To embed images, we need to use the prefix 'cid' in the img src value. 
// The cid value will map to the Content-Id of a Linked resource. 
// Thus <img src='cid:barcode'> will map to a LinkedResource with a ContentId of //'barcode'.
AlternateView htmlView = AlternateView.createAlternateViewFromString("Here is an embedded image.<img src=cid:barcode>", null, "text/html");

// Create the LinkedResource (embedded image) and Add the LinkedResource to the appropriate view
LinkedResource barcode = new LinkedResource("1.jpg", MediaTypeNames.Image.JPEG);
barcode.setContentId("barcode");

mail.getLinkedResources().addItem(barcode);
mail.getAlternateViews().addItem(plainView);
mail.getAlternateViews().addItem(htmlView);
mail.save("EmbeddedImage_out.msg", SaveOptions.getDefaultMsgUnicode());

Loại bỏ các đối tượng nhúng khỏi Email

LinkedResourceCollection được truy cập qua MailMessage.LinkedResources thuộc tính. The LinkedResourceCollection bộ sưu tập cung cấp một phương thức để hoàn toàn loại bỏ các đối tượng nhúng được thêm vào tin nhắn email. Sử dụng phiên bản quá tải của LinkedResourceCollection.removeAt phương thức để loại bỏ mọi dấu vết của một đối tượng nhúng khỏi tin nhắn email.

Mã mẫu dưới đây cho thấy cách loại bỏ các đối tượng nhúng khỏi một tin nhắn email.

// Load the test message with Linked Resources
MailMessage msg = MailMessage.load("EmlWithLinkedResources.eml");

// Remove a LinkedResource
msg.getLinkedResources().removeAt(0, true);

// Now clear the Alternate View for linked Resources
msg.getAlternateViews().get_Item(0).getLinkedResources().clear(true);

Trích xuất các đối tượng nhúng

Chủ đề này giải thích cách trích xuất các đối tượng nhúng từ một tệp email. Đối tượng nhúng là một đối tượng được tạo bằng một ứng dụng và được chèn vào trong một tài liệu hoặc tệp được tạo bởi một ứng dụng khác. Ví dụ, một bảng tính Microsoft Excel có thể được nhúng vào báo cáo Microsoft Word, hoặc một tệp video có thể được nhúng vào bài thuyết trình Microsoft PowerPoint. Khi một tệp được nhúng, thay vì chèn hoặc dán vào tài liệu khác, nó giữ nguyên định dạng gốc. Tài liệu nhúng có thể được mở trong ứng dụng gốc và được chỉnh sửa. Để trích xuất một đối tượng nhúng từ một tin nhắn email, hãy thực hiện các bước sau:

  1. Tạo một đối tượng của MailMessage lớp.
  2. Tải tệp email trong MailMessage thể hiện.
  3. Tạo một vòng lặp và tạo một thể hiện của Attachment lớp trong đó.
  4. Lưu tệp đính kèm và hiển thị nó trên màn hình.
  5. Xác định địa chỉ người gửi và người nhận trong MailMessage thể hiện.
  6. Gửi email bằng cách sử dụng SmtpClient lớp.

Đoạn mã dưới đây trích xuất các đối tượng nhúng từ một email.

|Các đối tượng nhúng đã trích xuất trong email| | :- | |todo:image_alt_text| Đoạn mã sau cho bạn cách trích xuất các đối tượng nhúng.

MailMessage mailMsg = MailMessage.load("Message.msg", new MsgLoadOptions());

for (Attachment attachment : mailMsg.getAttachments()) {
    attachment.save("MessageEmbedded_out.msg");
    System.out.println(attachment.getName());
}

Xác định và Trích xuất tệp đính kèm nhúng từ MSG định dạng RTF

Đoạn mã dưới đây có thể được sử dụng cho các tin nhắn được định dạng dưới dạng RTF để phân biệt và trích xuất các tệp đính kèm là Inline hoặc hiển thị dưới dạng Icon trong phần thân tin nhắn. Đoạn mã sau cho bạn cách xác định và trích xuất tệp đính kèm nhúng từ MSG được định dạng dưới dạng RTF.

public static void extractInlineAttachments() {
    MapiMessage message = MapiMessage.load("MSG file with RTF Formatting.msg");
    for (MapiAttachment attachment : message.getAttachments()) {

        if (isAttachmentInline(attachment)) {
            try {
                saveAttachment(attachment, UUID.randomUUID().toString());
            } catch (Exception ex) {
                System.err.println(ex);
            }
        }
    }
}

static boolean isAttachmentInline(MapiAttachment attachment) {
    for (MapiProperty property : attachment.getObjectData().getProperties().get_Values()) {
        if ("\u0003ObjInfo".equals(property.getName())) {
            byte[] data = property.getData();
            int odtPersist1 = data[1] << 8 | data[0];
            return (odtPersist1 & 0x40) == 0;
        }
    }
    return false;
}

static void saveAttachment(MapiAttachment attachment, String fileName) throws IOException {
    for (MapiProperty property : attachment.getObjectData().getProperties().get_Values()) {
        if ("Package".equals(property.getName())) {
            try (FileOutputStream fs = new FileOutputStream(fileName)) {
                fs.write(property.getData(), 0, property.getData().length);
            }
        }
    }
}

Lấy Tệp đính kèm từ Email đã ký

Email đã ký chứa một tệp đính kèm smime.p7m duy nhất. Điều này có nghĩa là email được mã hoá bằng SMIME. Định dạng tệp smime.p7m là chữ ký số. Để xem nội dung của email này, sử dụng RemoveSignature phương thức. Phương thức trả về một MailMessage đối tượng không có chữ ký số.

MailMessage signedEml = MailMessage.load("signed.eml");

if (signedEml.isSigned()) {
    for (int i = 0; i < signedEml.getAttachments().size(); i++) {
        System.out.println("Signed email attachment" + i + ": " + signedEml.getAttachments().get_Item(i).getName());
    }

    // The email is signed. Remove a signature.
    MailMessage eml = signedEml.removeSignature();

    System.out.println("Signature removed.");

    for (int i = 0; i < eml.getAttachments().size(); i++) {
        System.out.println("Email attachment" + i + ": " + eml.getAttachments().get_Item(i).getName());
    }
}

Làm việc với Content-Type và Content-Disposition

API Aspose.Email cung cấp khả năng làm việc với tệp đính kèm Content-TypeContent-Disposition từ tiêu đề tệp đính kèm. Đoạn mã sau cho bạn cách lấy và thay đổi mô tả nội dung từ tệp đính kèm.

Hiển thị các tham số Content-Type và Content-Disposition

Đoạn mã sau đây cho bạn cách hiển thị các tham số của Content-Type và Content-Disposition trên màn hình:

void run(MailMessage message) {
    // Attachments
    for (Attachment attachment : message.getAttachments()) {
        ContentDisposition contentDisposition = attachment.getContentDisposition();
        printContentDisposition(contentDisposition);
        ContentType contentType = attachment.getContentType();
        printContentType(contentType);
    }
    // Linked Resources
    for (LinkedResource attachment : message.getLinkedResources()) {
        ContentDisposition contentDisposition = attachment.getContentDisposition();
        printContentDisposition(contentDisposition);
        ContentType contentType = attachment.getContentType();
        printContentType(contentType);
    }
}

void printContentType(ContentType contentType) {
    System.out.println("media-type: " + contentType.getMediaType());
    System.out.println("charset: " + contentType.getCharSet());
    System.out.println("name: " + contentType.getName());
}

void printContentDisposition(ContentDisposition contentDisposition) {
    System.out.println("disposition-type: " + contentDisposition.getDispositionType());
    System.out.println("is-inline: " + contentDisposition.getInline());
    System.out.println("filename: " + contentDisposition.getFileName());
    System.out.println("creation-date: " + contentDisposition.getCreationDate());
    System.out.println("modification-date: " + contentDisposition.getModificationDate());
    System.out.println("read-date: " + contentDisposition.getReadDate());
    System.out.println("size: " + contentDisposition.getSize());
}

Sử dụng các tham số Content-Type và Content-Disposition với Tệp đính kèm

Đoạn mã sau đây cho bạn thấy cách sử dụng các tham số Content-Type và Content-Disposition với một tệp đính kèm:

MailMessage eml = MailMessage.load(fileName);

Attachment attachment = new Attachment(pdfFileName, new ContentType("application/octet-stream"));
attachment.getContentDisposition().setDispositionType("attachment");
attachment.getContentDisposition().setFileName(fileName);

eml.addAttachment(attachment);