Praca z załącznikami i obiektami osadzonymi
Zarządzanie załącznikami e‑mail
Załącznik e‑mail to plik wysyłany wraz z wiadomością e‑mail. Plik może być wysłany jako oddzielna wiadomość, jak i jako część wiadomości, do której jest dołączony. Attachment klasy używanej z MailMessage klasa. Wszystkie wiadomości zawierają ciało. Oprócz ciała możesz chcieć wysłać dodatkowe pliki. Są one wysyłane jako załączniki i reprezentowane jako instancja Attachment klasa. Można wysłać dowolną liczbę załączników, ale ich rozmiar jest ograniczony przez serwer poczty. Gmail, na przykład, nie obsługuje plików większych niż 10 MB.
Wypróbuj!
Dodawaj lub usuń załączniki e‑mail online przy użyciu darmowego Aspose.Email Editor App.
Dodawanie załącznika
Aby dołączyć załącznik do e‑maila, wykonaj następujące kroki:
- Utwórz instancję MailMessage klasa.
- Utwórz instancję Attachment klasa.
- Załaduj załącznik do Attachment instancję.
- Dodaj Attachment instancję do MailMessage instancję.
Poniższy fragment kodu pokazuje, jak dodać załącznik do e‑maila.
// 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");
Powyżej opisaliśmy, jak dodać załączniki do wiadomości e‑mail za pomocą Aspose.Email. Poniżej pokazujemy, jak usuwać załączniki i wyświetlać informacje o nich na ekranie.
Usuwanie załącznika
Aby usunąć załącznik, wykonaj poniższe kroki:
- Utwórz instancję Attachment klasa.
- Załaduj załącznik w instancji Attachment klasa.
- Dodaj załącznik do instancji MailMessage klasa.
- Usuń załączniki z instancji Attachment klasę przy użyciu MailMessage instancję klasy.
Poniższy fragment kodu pokazuje, jak usunąć załącznik.
// 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);
Wyświetlanie nazwy pliku załącznika
Aby wyświetlić nazwę pliku załącznika, wykonaj następujące kroki:
- Iteruj po załącznikach w wiadomości e‑mail i
- Zapisz każdy załącznik.
- Wyświetl nazwę każdego załącznika na ekranie.
Poniższy fragment kodu pokazuje, jak wyświetlić nazwę pliku załącznika na ekranie.
MailMessage eml = MailMessage.load("Attachments.eml");
for (Attachment attachment : eml.getAttachments()) {
// Display the attachment file name
System.out.println(attachment.getName());
}
Wyodrębnianie załączników e‑mail
Ten temat wyjaśnia, jak wyodrębnić załącznik z pliku e‑mail. Załącznik e‑mail to plik wysyłany wraz z wiadomością e‑mail. Plik może być wysłany jako oddzielna wiadomość, jak i jako część wiadomości, do której jest dołączony. Wszystkie wiadomości e‑mail zawierają opcję wysyłania dodatkowych plików. Są one wysyłane jako załączniki i reprezentowane jako instancje Attachment klasa. Ta Attachment klasy używanej z MailMessage klasa do pracy z załącznikami. Aby wyodrębnić załączniki z wiadomości e‑mail, wykonaj następujące kroki:
- Utwórz instancję MailMessage klasa.
- Załaduj plik e‑mail do MailMessage instancję.
- Utwórz instancję Attachment klasę i użyj jej w pętli, aby wyodrębnić wszystkie załączniki.
- Zapisz załącznik i wyświetl go na ekranie.
|Wyodrębnione załączniki w e‑mailu| | :- | |
| Poniższy fragment kodu pokazuje, jak wyodrębnić załączniki e‑mail.
MailMessage eml = MailMessage.load("Message.eml", new MsgLoadOptions());
for (Attachment attachment : eml.getAttachments()) {
attachment.save("MessageEmbedded_out.eml");
System.out.println(attachment.getName());
}
Pobieranie Content-Description z załącznika
API Aspose.Email umożliwia odczytanie Content-Description załącznika z nagłówka załącznika. Poniższy fragment kodu pokazuje, jak pobrać opis treści z załącznika.
MailMessage eml = MailMessage.load("EmailWithAttachEmbedded.eml");
System.out.println(eml.getAttachments().get_Item(0).getHeaders().get_Item("Content-Description"));
Określanie, czy załącznik jest wiadomością osadzoną
Poniższy fragment kodu demonstruje, jak określić, czy załącznik jest wiadomością osadzoną, czy nie.
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.");
Określanie załączników w formacie TNEF
Ten Attachment.isTnef właściwość API Aspose.Email Java wskazuje, czy załącznik wiadomości jest sformatowany jako TNEF.
Poniższy fragment kodu demonstruje, jak określić, czy załącznik jest w formacie TNEF:
MailMessage eml = MailMessage.load(fileName);
for (Attachment attachment : eml.getAttachments()) {
System.out.println("Is Attachment TNEF?: " + attachment.isTnef());
}
Ładowanie i zapisywanie załączników TNEF
Aspose.Email for Java udostępnia metody w MapiAttachment klasa wykonująca następujące operacje:
Wczytaj z TNEF
-
static MapiAttachment loadFromTnef(String fileName)– Ładuje załącznik z pliku TNEF. -
static MapiAttachment loadFromTnef(InputStream stream)– Ładuje załącznik ze strumienia TNEF.
Zapisz jako TNEF
-
void saveToTnef(String fileName)– Zapisuje załącznik do pliku TNEF. -
void saveToTnef(OutputStream stream)– Zapisuje załącznik do strumienia TNEF.
Poniższy przykład kodu demonstruje, jak wyodrębnić załącznik TNEF z wiadomości, zapisać go do strumienia lub pliku, a następnie wczytać go ponownie do wiadomości 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);
Wyodrębnianie URI załącznika, jeśli załącznik jest URI‑załącznikiem
Poniższy fragment kodu demonstruje, jak wyekstrahować URI załącznika.
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);
}
Dodawanie załączników referencyjnych
Załącznik referencyjny jest alternatywą dla lokalnego załącznika pliku. W niektórych przypadkach załączniki referencyjne mogą być bardziej wskazane, np. gdy chcesz zarządzać ich dostępem. Poniższe klasy służą do zarządzania i manipulacji wiadomościami e‑mail oraz ich załącznikami:
- ReferenceAttachment - Reprezentuje załącznik referencyjny.
- AttachmentPermissionType - Dane typu uprawnień powiązane z załącznikiem referencyjnym w sieci.
- AttachmentProviderType - Typ usługi sieciowej manipulującej załącznikiem.
Poniższy przykład kodu demonstruje, jak załadować wiadomość e‑mail z pliku, utworzyć załącznik referencyjny o określonych właściwościach i dodać załącznik do wiadomości e‑mail:
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);
Praca z osadzonymi obiektami
Osadzony obiekt to obiekt utworzony w jednej aplikacji i dołączony do dokumentu lub pliku utworzonego w innej aplikacji. Na przykład arkusz kalkulacyjny Microsoft Excel może być osadzony w raporcie Microsoft Word, a plik wideo może być osadzony w prezentacji Microsoft PowerPoint. Gdy plik jest osadzony, zamiast wstawiany lub wklejany do innego dokumentu, zachowuje swój pierwotny format. Osadzony dokument może być otwarty w pierwotnej aplikacji i modyfikowany.
Osadzanie obiektów w e‑mailu
Ten LinkedResource klasy używanej z MailMessage klasa do osadzania obiektów w wiadomościach e‑mail. Aby dodać osadzony obiekt, wykonaj następujące kroki
- Utwórz instancję MailMessage klasa.
- Określ wartości od, do i tematu w MailMessage instancję.
- Utwórz instancję AlternateView klasa.
- Utwórz instancję LinkedResource klasa.
- Załaduj osadzony obiekt do LinkedResourceCollection.
- Dodaj załadowany osadzony obiekt do MailMessage instancję klasy.
- Dodaj AlternateView instancję do MailMessage instancję klasy.
Poniższe fragmenty kodu generują wiadomość e‑mail z zarówno tekstem prostym, jak i ciałem HTML oraz obrazem osadzonym w HTML
|Obraz osadzony w e‑mailu| | :- | |
| Możesz wysłać dowolną liczbę osadzonych obiektów. Rozmiar załącznika jest ograniczony przez serwer pocztowy. Gmail, na przykład, nie obsługuje plików większych niż 10 MB. Poniższe fragmenty kodu pokazują, jak osadzić obiekty w 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());
Usuwanie osadzonych obiektów z e‑maila
LinkedResourceCollection dostępna poprzez MailMessage.LinkedResources właściwości. LinkedResourceCollection kolekcja udostępnia metodę całkowitego usunięcia osadzonych obiektów dodanych do wiadomości e‑mail. Użyj przeciążonej wersji LinkedResourceCollection.removeAt metoda usuwająca wszystkie ślady osadzonego obiektu z wiadomości e‑mail.
Poniższy przykładowy kod pokazuje, jak usunąć osadzone obiekty z wiadomości e‑mail.
// 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);
Wyodrębnianie osadzonych obiektów
Ten temat wyjaśnia, jak wyodrębnić osadzone obiekty z pliku e‑mail. Osadzony obiekt to obiekt utworzony w jednej aplikacji i dołączony do dokumentu lub pliku utworzonego w innej aplikacji. Na przykład arkusz kalkulacyjny Microsoft Excel może być osadzony w raporcie Microsoft Word, a plik wideo może być osadzony w prezentacji Microsoft PowerPoint. Gdy plik jest osadzony, zamiast wstawiany lub wklejany do innego dokumentu, zachowuje swój pierwotny format. Osadzony dokument może być otwarty w pierwotnej aplikacji i modyfikowany. Aby wyodrębnić osadzony obiekt z wiadomości e‑mail, wykonaj następujące kroki:
- Utwórz instancję MailMessage klasa.
- Załaduj plik e-mail w MailMessage instancję.
- Utwórz pętlę i utwórz instancję Attachment klasa w niej.
- Zapisz załącznik i wyświetl go na ekranie.
- Określ adres nadawcy i odbiorcy w MailMessage instancję.
- Wyślij e-mail używając SmtpClient klasa.
Poniższy fragment kodu wyodrębnia osadzone obiekty z e‑maila.
|Wyodrębnione osadzone obiekty w e‑mailu| | :- | |
| Poniższy fragment kodu pokazuje, jak wyodrębnić osadzone obiekty.
MailMessage mailMsg = MailMessage.load("Message.msg", new MsgLoadOptions());
for (Attachment attachment : mailMsg.getAttachments()) {
attachment.save("MessageEmbedded_out.msg");
System.out.println(attachment.getName());
}
Identyfikacja i wyodrębnienie osadzonego załącznika z pliku MSG sformatowanego jako RTF
Poniższy kod może być użyty do wiadomości sformatowanych jako RTF, aby rozróżnić i wyodrębnić załączniki, które są Inline lub pojawiają się jako ikona w treści wiadomości. Poniższy fragment kodu pokazuje, jak zidentyfikować i wyodrębnić osadzony załącznik z pliku MSG sformatowanego 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);
}
}
}
}
Pobieranie załączników z podpisanego e‑maila
Podpisane e‑maile zawierają pojedynczy załącznik smime.p7m. Oznacza to, że wiadomość jest szyfrowana przez SMIME. Format pliku smime.p7m jest podpisem cyfrowym. Aby zobaczyć zawartość tego e‑maila, użyj RemoveSignature metoda. Metoda zwraca MailMessage obiekt bez podpisu cyfrowego.
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());
}
}
Praca z parametrami Content-Type i Content-Disposition
API Aspose.Email zapewnia możliwość pracy z załącznikiem Content-Type i Content-Disposition z nagłówka załącznika. Poniższy fragment kodu pokazuje, jak pobrać i zmienić opis treści załącznika.
Wyświetlanie parametrów Content-Type i Content-Disposition
Poniższy fragment kodu pokazuje, jak wyświetlić parametry Content-Type i Content-Disposition na ekranie:
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());
}
Używanie parametrów Content-Type i Content-Disposition z załącznikami
Poniższy fragment kodu pokazuje, jak używać parametrów Content-Type i Content-Disposition z załącznikiem:
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);