Membedakan antara Lampiran Inline dan Reguler
Contents
[
Hide
]
Pesan email dapat berisi gambar inline serta lampiran. Menggunakan MailMessage, lampiran inline dapat diekstrak dari LinkedResourceCollection koleksi, sementara lampiran reguler dapat diakses dan diekstrak dengan AttachmentCollection koleksi. Namun, ini berbeda ketika pesan dimuat menggunakan MapiMessage, karena semua gambar inline dan lampiran reguler dapat diakses pengguna dalam satu MapiAttachmentCollection. Oleh karena itu, sebuah metode yang dapat membedakan antara lampiran inline dan reguler ketika MapiMessage digunakan jika diperlukan.
Artikel ini menjelaskan cara membedakan lampiran inline dari yang reguler menggunakan MapiMessage. Saat memutuskan, tipe badan dari MapiMessage dipertimbangkan sebagai berikut:
- Badan teks biasa: Pesan email dengan tipe badan teks biasa tidak perlu diperiksa, karena semua lampiran dalam pesan tersebut selalu merupakan lampiran reguler.
- Badan HTML: Untuk pesan dengan badan HTML, lampiran tidak hanya harus berisi properti PR_ATTACH_FLAGS (0x37140003), tetapi nilainya harus sama dengan 0x00000004 untuk lampiran inline. Jika kondisi ini terpenuhi, selanjutnya bergantung pada tag PR_ATTACH_CONTENT_LOCATION dan PR_ATTACH_CONTENT_ID untuk menentukan sifat lampiran. Namun, jika tidak ada tag PR_ATTACH_FLAGS MAPI, lampiran dicek dengan properti PR_ATTACH_DISPOSITION (0x3716001F atau 0x3716001E) untuk menentukan tipe lampiran.
- Badan RTF: Jika badan adalah RTF, maka semua lampiran OLE adalah lampiran inline. Nilai PR_ATTACH_METHOD untuk semua lampiran OLE sama dengan 0x00000006.
Contoh kode berikut menunjukkan cara membedakan secara programatik antara lampiran inline dan reguler. Fungsi isInlineAttachment menerima lampiran dan MapiMessage sebagai parameter input dan mengembalikan true jika lampiran tersebut adalah lampiran inline.
public static boolean isInlineAttachment(MapiAttachment att, MapiMessage msg) {
if (msg.getBodyType() == BodyContentType.PlainText)
// ignore indications for plain text messages
return false;
else if (msg.getBodyType() == BodyContentType.Html) {
// check the PidTagAttachFlags property
Long attachFlagsValue = att.getPropertyLong(MapiPropertyTag.PR_ATTACH_FLAGS);
if (attachFlagsValue != null && (attachFlagsValue > 3 || attachFlagsValue < 1)) {
// check PidTagAttachContentId property
String contentId = att.getProperties().containsKey(MapiPropertyTag.PR_ATTACH_CONTENT_ID)
? att.getPropertyString(MapiPropertyTag.PR_ATTACH_CONTENT_ID)
: att.getPropertyString(MapiPropertyTag.PR_ATTACH_CONTENT_ID_W);
if (contentId != null && !contentId.isEmpty() && msg.getBodyHtml().contains("cid:" + contentId)) {
return true;
}
// check PidTagAttachContentLocation property
String contentLocation = att.getProperties().containsKey(MapiPropertyTag.PR_ATTACH_CONTENT_LOCATION)
? att.getPropertyString(MapiPropertyTag.PR_ATTACH_CONTENT_LOCATION)
: att.getPropertyString(MapiPropertyTag.PR_ATTACH_CONTENT_LOCATION_W);
if (contentLocation != null && !contentLocation.isEmpty() && msg.getBodyHtml().contains(contentLocation)) {
return true;
}
}
return "inline".equals(att.getPropertyString(0x3716001F)) || "inline".equals(att.getPropertyString(0x3716001E));
} else if (msg.getBodyType() == BodyContentType.Rtf) {
// If the body is RTF, then all OLE attachments are inline attachments.
// OLE attachments have 0x00000006 for the value of the PidTagAttachMethod property
Long attachMethod = att.getPropertyLong(MapiPropertyTag.PR_ATTACH_METHOD);
return attachMethod != null && attachMethod == 0x00000006;
} else {
throw new ArgumentOutOfRangeException();
}
}
Potongan kode ini menggunakan fungsi isInlineAttachment() untuk mengevaluasi lampiran.
Java
String fileName = ("Sample.msg");
MapiMessage message = MapiMessage.fromFile(fileName);
MapiAttachmentCollection attachments = message.getAttachments();
for (int i = 0; i < attachments.size(); i++) {
MapiAttachment attachment = (MapiAttachment) attachments.get(i);
if (isInlineAttachment(attachment, message)) {
System.out.println(attachment.getLongFileName() + " is inline attachment");
} else {
System.out.println(attachment.getLongFileName() + " is regular attachment");
}
}