Rozróżnianie załączników inline i standardowych
Contents
[
Hide
]
Wiadomości e‑mail mogą zawierać obrazy inline oraz załączniki. Używając MailMessage, załączniki inline mogą być wyodrębnione z LinkedResourceCollection kolekcji, podczas gdy standardowe załączniki mogą być dostępne i wyodrębnione z wiadomości AttachmentCollection kolekcji. Jednak jest inaczej, gdy wiadomość jest ładowana przy użyciu MapiMessage, ponieważ wszystkie obrazy inline i standardowe załączniki są dostępne dla użytkownika w tym samym MapiAttachmentCollection. Zatem metoda, która może rozróżnić załącznik inline od standardowego, gdy MapiMessage jest używany, jeśli potrzebny.
Ten artykuł wyjaśnia, jak rozróżnić załączniki inline od standardowych przy użyciu MapiMessage. Decydując, typ treści MapiMessage jest brane pod uwagę następująco:
- Treść zwykłego tekstu: Wiadomości e‑mail z treścią w formacie zwykłego tekstu nie muszą być sprawdzane, ponieważ wszystkie załączniki w takich wiadomościach są zawsze standardowymi załącznikami.
- Treść HTML: Dla wiadomości z treścią HTML załącznik powinien nie tylko zawierać właściwość PR_ATTACH_FLAGS (0x37140003), ale jego wartość powinna wynosić 0x00000004 dla załączników inline. Jeśli ten warunek jest spełniony, dalsze określenie rodzaju załącznika zależy od tagów PR_ATTACH_CONTENT_LOCATION i PR_ATTACH_CONTENT_ID. Jednak w przypadku braku tagu PR_ATTACH_FLAGS MAPI, załącznik jest sprawdzany pod kątem właściwości PR_ATTACH_DISPOSITION (0x3716001F lub 0x3716001E), aby określić typ załącznika.
- Treść RTF: Jeśli treść jest w formacie RTF, wszystkie załączniki OLE są załącznikami inline. Wartość PR_ATTACH_METHOD dla wszystkich załączników OLE wynosi 0x00000006.
Poniższy przykład kodu demonstruje programowe rozróżnianie załączników inline i standardowych. Funkcja isInlineAttachment przyjmuje jako parametry wejściowe załącznik i MapiMessage oraz zwraca true, jeśli załącznik jest typu 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();
}
}
Ten fragment kodu używa funkcji isInlineAttachment() do oceny załączników.
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");
}
}