Práce s přílohami a vloženými objekty
Správa e‑mailových příloh
Příloha e‑mailu je soubor, který je odeslán společně se zprávou e‑mail. Soubor může být odeslán jako samostatná zpráva i jako část zprávy, ke které je připojen. Attachment třída se používá s MailMessage třída. Všechny zprávy obsahují tělo. K tělu můžete chtít poslat i další soubory. Ty jsou odeslány jako přílohy a jsou reprezentovány jako instance třídy Attachment třída. Můžete odeslat libovolný počet příloh, ale velikost přílohy je omezena poštovním serverem. Gmail například nepodporuje soubory větší než 10 MB.
Vyzkoušejte to!
Přidávejte nebo odebírejte e‑mailové přílohy online zdarma pomocí Aspose.Email Editor App.
Přidání přílohy
Pro připojení přílohy k e‑mailu postupujte podle následujících kroků:
- Vytvořte instanci MailMessage třída.
- Vytvořte instanci Attachment třída.
- Načtěte přílohu do Attachment instance.
- Přidejte Attachment instanci do MailMessage instance.
Následující úryvek kódu ukazuje, jak přidat přílohu k e‑mailu.
// 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");
Výše jsme popsal, jak přidat přílohy k vaší e‑mailové zprávě pomocí Aspose.Email. Následující ukázka demonstruje, jak odebrat přílohy a zobrazit informace o nich na obrazovce.
Odebrání přílohy
Pro odebrání přílohy postupujte podle níže uvedených kroků:
- Vytvořte instanci Attachment třída.
- Načtěte přílohu v instanci Attachment třída.
- Přidejte přílohu do instance MailMessage třída.
- Odeberte přílohy z instance Attachment třídu pomocí MailMessage instance třídy.
Následující úryvek kódu ukazuje, jak odebrat přílohu.
// 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);
Zobrazení názvu souboru přílohy
Pro zobrazení názvu souboru přílohy postupujte podle následujících kroků:
- Projděte smyčkou přílohy v e‑mailové zprávě a
- Uložte každou přílohu.
- Zobrazte název každé přílohy na obrazovce.
Následující úryvek kódu ukazuje, jak zobrazit název souboru přílohy na obrazovce.
MailMessage eml = MailMessage.load("Attachments.eml");
for (Attachment attachment : eml.getAttachments()) {
// Display the attachment file name
System.out.println(attachment.getName());
}
Extrahování e‑mailových příloh
Tato kapitola vysvětluje, jak extrahovat přílohu ze souboru e‑mailu. E‑mailová příloha je soubor, který je odeslán spolu s e‑mailovou zprávou. Soubor může být odeslán jako samostatná zpráva i jako součást zprávy, ke které je připojen. Všechny e‑mailové zprávy mají možnost odeslat další soubory. Ty jsou odesílány jako přílohy a jsou reprezentovány jako instance Attachment třída. The Attachment třída se používá s MailMessage třídy pro práci s přílohami. Pro extrahování příloh z e‑mailové zprávy postupujte podle následujících kroků:
- Vytvořte instanci MailMessage třída.
- Načtěte soubor e‑mailu do MailMessage instance.
- Vytvořte instanci Attachment třídu a použijte ji ve smyčce k extrahování všech příloh.
- Uložte přílohu a zobrazte ji na obrazovce.
|Extrahované přílohy v e‑mailu| | :- | |
| Následující úryvek kódu ukazuje, jak Extrahovat e‑mailové přílohy.
MailMessage eml = MailMessage.load("Message.eml", new MsgLoadOptions());
for (Attachment attachment : eml.getAttachments()) {
attachment.save("MessageEmbedded_out.eml");
System.out.println(attachment.getName());
}
Získání Content-Description z přílohy
Aspose.Email API poskytuje možnost číst Content-Description přílohy z hlavičky přílohy. Následující úryvek kódu ukazuje, jak získat popis obsahu z přílohy.
MailMessage eml = MailMessage.load("EmailWithAttachEmbedded.eml");
System.out.println(eml.getAttachments().get_Item(0).getHeaders().get_Item("Content-Description"));
Určení, zda je příloha vložená zpráva
Následující úryvek kódu demonstruje, jak určit, zda je příloha vložená zpráva či nikoli.
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.");
Určení TNEF formátovaných příloh
The Attachment.isTnef vlastnost rozhraní Aspose.Email Java API naznačuje, zda je příloha zprávy ve formátu TNEF.
Následující úryvek kódu demonstruje, jak určit, zda je příloha ve formátu TNEF:
MailMessage eml = MailMessage.load(fileName);
for (Attachment attachment : eml.getAttachments()) {
System.out.println("Is Attachment TNEF?: " + attachment.isTnef());
}
Načíst a uložit TNEF přílohy
Aspose.Email pro Java poskytuje metody v MapiAttachment třída pro provedení následujících operací:
Načíst z TNEF
-
static MapiAttachment loadFromTnef(String fileName)– Načte přílohu z TNEF souboru. -
static MapiAttachment loadFromTnef(InputStream stream)– Načte přílohu z TNEF proudu.
Uložit do TNEF
-
void saveToTnef(String fileName)– Uloží přílohu do TNEF souboru. -
void saveToTnef(OutputStream stream)– Uloží přílohu do TNEF proudu.
Následující ukázkový kód demonstruje, jak extrahovat TNEF přílohu ze zprávy, uložit ji do proudu nebo souboru a poté ji načíst zpět do zprávy jako 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);
Extrahování URI přílohy, pokud je příloha URI‑příloha
Následující úryvek kódu demonstruje, jak extrahovat URI přílohy.
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);
}
Přidávání referenčních příloh
Referenční příloha je alternativou k lokální souborové příloze. V některých případech mohou být referenční přílohy výhodnější, například když chcete spravovat jejich přístup. Níže uvedené třídy slouží k správě a manipulaci s e‑mailovými zprávami a jejich přílohami:
- ReferenceAttachment - Představuje referenční přílohu.
- AttachmentPermissionType - Data typu oprávnění spojená s referenční přílohou webu.
- AttachmentProviderType - Typ webové služby manipulující s přílohou.
Následující ukázkový kód demonstruje, jak načíst e‑mailovou zprávu ze souboru, vytvořit referenční přílohu s konkrétními vlastnostmi a přidat tuto přílohu k e‑mailové zprávě:
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);
Práce s vloženými objekty
Vložený objekt je objekt vytvořený v jedné aplikaci a vložený do dokumentu nebo souboru vytvořeného v jiné aplikaci. Například tabulku Microsoft Excel lze vložit do zprávy Microsoft Word nebo video soubor lze vložit do prezentace Microsoft PowerPoint. Když je soubor vložen, zachovává svůj původní formát místo aby byl vložen nebo vložen do jiného dokumentu. Vložený dokument lze otevřít v původní aplikaci a upravit jej.
Vkládání objektů do e‑mailu
The LinkedResource třída se používá s MailMessage třída pro vkládání objektů do vašich e‑mailových zpráv. Pro přidání vloženého objektu postupujte podle následujících kroků
- Vytvořte instanci MailMessage třída.
- Zadejte hodnoty From, To a Subject v MailMessage instance.
- Vytvořte instanci AlternateView třída.
- Vytvořte instanci LinkedResource třída.
- Načtěte vložený objekt do LinkedResourceCollection.
- Přidejte načtený vložený objekt do MailMessage instance třídy.
- Přidejte AlternateView instanci do MailMessage instance třídy.
Níže uvedené úryvky kódu vytvoří e‑mailovou zprávu s jak prostým textem, tak HTML tělem a obrázkem vloženým do HTML
|Obrázek vložený do e‑mailu| | :- | |
| Můžete odeslat libovolný počet vložených objektů. Velikost přílohy je omezena poštovním serverem. Gmail například nepodporuje soubory větší než 10 MB. Níže uvedené úryvky kódu demonstrují, jak vložit objekty do e‑mailu.
// 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());
Odstraňování vložených objektů z e‑mailu
LinkedResourceCollection přístupná přes MailMessage.LinkedResources vlastnost. Ta LinkedResourceCollection kolekce poskytuje metodu k úplnému odebrání vložených objektů přidaných do e‑mailové zprávy. Použijte přetíženou verzi LinkedResourceCollection.removeAt metoda k odstranění všech stop vloženého objektu z e‑mailové zprávy.
Ukázkový kód níže ukazuje, jak odebrat vložené objekty z e‑mailové zprávy.
// 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);
Extrahování vložených objektů
Tato kapitola vysvětluje, jak extrahovat vložené objekty ze souboru e‑mailu. Vložený objekt je objekt vytvořený v jedné aplikaci a vložený do dokumentu nebo souboru vytvořeného v jiné aplikaci. Například tabulku Microsoft Excel lze vložit do zprávy Microsoft Word nebo video soubor lze vložit do prezentace Microsoft PowerPoint. Když je soubor vložen, místo aby byl vložen nebo vložen do jiného dokumentu, zachovává svůj původní formát. Vložený dokument lze otevřít v původní aplikaci a upravit jej. Pro extrahování vloženého objektu z e‑mailové zprávy postupujte podle následujících kroků:
- Vytvořte instanci MailMessage třída.
- Načtěte soubor e‑mailu v MailMessage instance.
- Vytvořte smyčku a vytvořte instanci Attachment třída v ní.
- Uložte přílohu a zobrazte ji na obrazovce.
- Zadejte adresu odesílatele a příjemce v MailMessage instance.
- Odeslat e‑mail pomocí SmtpClient třída.
Níže uvedený úryvek kódu extrahuje vložené objekty z e‑mailu.
|Extrahované vložené objekty v e‑mailu| | :- | |
| Následující úryvek kódu ukazuje, jak extrahovat vložené objekty.
MailMessage mailMsg = MailMessage.load("Message.msg", new MsgLoadOptions());
for (Attachment attachment : mailMsg.getAttachments()) {
attachment.save("MessageEmbedded_out.msg");
System.out.println(attachment.getName());
}
Identifikace a extrakce vložené přílohy z MSG formátovaného jako RTF
Následující kód lze použít pro zprávy formátované jako RTF k rozlišení a extrakci příloh, které jsou buď vložené inline, nebo se objevují jako ikona v těle zprávy. Následující úryvek kódu ukazuje, jak identifikovat a extrahovat vloženou přílohu z MSG formátovaného jako 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);
}
}
}
}
Získání příloh z podepsaného e‑mailu
Podepsané e‑maily obsahují jedinou přílohu smime.p7m. To znamená, že e‑mail je šifrován pomocí SMIME. Formát souboru smime.p7m představuje digitální podpis. Pro zobrazení obsahu tohoto e‑mailu použijte RemoveSignature metoda. Metoda vrací MailMessage objekt bez digitálního podpisu.
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());
}
}
Práce s Content-Type a Content-Disposition
Aspose.Email API poskytuje možnost pracovat s přílohou Content-Type a Content-Disposition z hlavičky přílohy. Následující úryvek kódu ukazuje, jak získat a změnit popis obsahu z přílohy.
Zobrazení parametrů Content-Type a Content-Disposition
Následující úryvek kódu ukazuje, jak zobrazit parametry Content-Type a Content-Disposition na obrazovce:
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());
}
Použití parametrů Content-Type a Content-Disposition s přílohami
Následující úryvek kódu ukazuje, jak použít parametry Content-Type a Content-Disposition s přílohou:
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);