Arbeiten mit Anhängen und eingebetteten Objekten

Verwalten von E‑Mail‑Anhängen

Ein E‑Mail-Anhang ist eine Datei, die zusammen mit einer E‑Mail‑Nachricht gesendet wird. Die Datei kann sowohl als separate Nachricht als auch als Teil der Nachricht, an die sie angehängt ist, gesendet werden. Der Attachment Klasse wird verwendet mit der MailMessage Klasse. Alle Nachrichten enthalten einen Body. Zusätzlich zum Body möchten Sie möglicherweise weitere Dateien senden. Diese werden als Anhänge gesendet und als Instanz von Attachment Klasse. Sie können beliebig viele Anhänge senden, jedoch ist die Größe der Anhänge durch den Mail‑Server begrenzt. Gmail unterstützt beispielsweise keine Dateien größer als 10 MB.

Hinzufügen von Attachments

Um ein Attachment an eine E‑Mail anzuhängen, befolgen Sie bitte diese Schritte:

  1. Erstellen Sie eine Instanz von dem MailMessage Klasse.
  2. Erstellen Sie eine Instanz von dem Attachment Klasse.
  3. Laden Sie das Attachment in das Attachment Instanz.
  4. Fügen Sie das Attachment Instanz in das MailMessage Instanz.

Das folgende Code‑Snippet zeigt, wie ein Attachment zu einer E‑Mail hinzugefügt wird.

// 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");

Oben haben wir beschrieben, wie Sie mit Aspose.Email Attachments zu Ihrer E‑Mail‑Nachricht hinzufügen. Im Folgenden wird gezeigt, wie Attachments entfernt und Informationen über sie auf dem Bildschirm angezeigt werden.

Entfernen eines Attachments

Um ein Attachment zu entfernen, folgen Sie den unten angegebenen Schritten:

  • Erstellen Sie eine Instanz von Attachment Klasse.
  • Laden Sie das Attachment in die Instanz von Attachment Klasse.
  • Fügen Sie das Attachment zur Instanz von MailMessage Klasse.
  • Entfernen Sie die Attachments aus der Instanz von Attachment Klasse unter Verwendung des MailMessage Klasseninstanz.

Das folgende Code‑Snippet zeigt, wie ein Attachment entfernt wird.

// 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);

Anzeigen des Attachment‑Dateinamens

Um den Dateinamen des Attachments anzuzeigen, gehen Sie wie folgt vor:

  1. Durchlaufen Sie die Attachments in der E‑Mail‑Nachricht und
    1. Speichern Sie jedes Attachment.
    2. Zeigen Sie jeden Attachment‑Namen auf dem Bildschirm an.

Das folgende Code‑Snippet zeigt, wie der Dateiname eines Attachments auf dem Bildschirm angezeigt wird.

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

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

Extrahieren von E‑Mail‑Attachments

Dieses Thema erklärt, wie ein Attachment aus einer E‑Mail‑Datei extrahiert wird. Ein E‑Mail‑Attachment ist eine Datei, die zusammen mit einer E‑Mail‑Nachricht gesendet wird. Die Datei kann sowohl als separate Nachricht als auch als Teil der Nachricht, an die sie angehängt ist, gesendet werden. Alle E‑Mail‑Nachrichten bieten die Möglichkeit, weitere Dateien zu senden. Diese werden als Attachments gesendet und als Instanzen von Attachment Klasse. Die Attachment Klasse wird verwendet mit der MailMessage Klasse, um mit Attachments zu arbeiten. Um Attachments aus einer E‑Mail‑Nachricht zu extrahieren, gehen Sie wie folgt vor:

  • Erstellen Sie eine Instanz von dem MailMessage Klasse.
  • Laden Sie eine E‑Mail‑Datei in das MailMessage Instanz.
  • Erstellen Sie eine Instanz von dem Attachment Klasse und verwenden Sie sie in einer Schleife, um alle Attachments zu extrahieren.
  • Speichern Sie das Attachment und zeigen Sie es auf dem Bildschirm an.

|Extrahierte Attachments in E‑Mail| | :- | |todo:image_alt_text| Das folgende Code‑Snippet zeigt, wie E‑Mail‑Attachments extrahiert werden.

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

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

Abrufen der Content‑Description aus einem Attachment

Die Aspose.Email‑API bietet die Möglichkeit, die Content‑Description eines Attachments aus dem Header zu lesen. Das folgende Code‑Snippet zeigt, wie die Inhaltsbeschreibung aus dem Attachment abgerufen wird.

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

Bestimmen, ob ein Attachment eine eingebettete Nachricht ist

Das folgende Code‑Snippet zeigt, wie ermittelt wird, ob das Attachment eine eingebettete Nachricht ist oder nicht.

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.");

Bestimmen von TNEF‑formatierten Attachments

Die Attachment.isTnef Eigenschaft der Aspose.Email Java API gibt an, ob das Nachrichten‑Attachment im TNEF‑Format vorliegt.

Das folgende Code‑Snippet zeigt, wie ermittelt wird, ob ein Attachment im TNEF‑Format vorliegt:

MailMessage eml = MailMessage.load(fileName);

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

Laden und Speichern von TNEF‑Attachments

Aspose.Email für Java bietet Methoden im MapiAttachment Klasse, um die folgenden Vorgänge auszuführen:

Aus TNEF laden

  • static MapiAttachment loadFromTnef(String fileName) – Lädt einen Anhang aus einer TNEF-Datei.

  • static MapiAttachment loadFromTnef(InputStream stream) – Lädt einen Anhang aus einem TNEF-Stream.

In TNEF speichern

  • void saveToTnef(String fileName) – Speichert einen Anhang in eine TNEF-Datei.

  • void saveToTnef(OutputStream stream) – Speichert einen Anhang in einen TNEF-Stream.

Das folgende Code‑Beispiel zeigt, wie ein TNEF‑Attachment aus einer Nachricht extrahiert, in einen Stream oder eine Datei gespeichert und anschließend wieder in die Nachricht geladen wird als 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);

Extrahieren der Attachment‑URI, wenn das Attachment eine URI‑Attachment ist

Das folgende Code‑Snippet zeigt, wie die Attachment‑URI extrahiert wird.

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);
}

Hinzufügen von Referenz‑Attachments

Ein Referenz‑Attachment ist eine Alternative zum lokalen Dateianhang. In einigen Fällen können Referenz‑Attachments vorzuziehen sein, zum Beispiel wenn Sie den Zugriff verwalten möchten. Die nachfolgenden Klassen werden zum Verwalten und Manipulieren von E‑Mail‑Nachrichten und deren Anhängen verwendet:

Das folgende Code‑Beispiel zeigt, wie eine E‑Mail‑Nachricht aus einer Datei geladen, ein Referenz‑Attachment mit bestimmten Eigenschaften erstellt und das Attachment zur E‑Mail‑Nachricht hinzugefügt wird:

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);

Arbeiten mit eingebetteten Objekten

Ein eingebettetes Objekt ist ein Objekt, das mit einer Anwendung erstellt und in ein Dokument oder eine Datei eingefügt wurde, die von einer anderen Anwendung erstellt wurde. Beispielsweise kann eine Microsoft‑Excel‑Tabelle in einen Microsoft‑Word‑Report eingebettet werden, oder eine Videodatei kann in eine Microsoft‑PowerPoint‑Präsentation eingebettet werden. Wenn eine Datei eingebettet wird, anstatt sie in ein anderes Dokument einzufügen oder einzukopieren, behält sie ihr ursprüngliches Format bei. Das eingebettete Dokument kann in der ursprünglichen Anwendung geöffnet und bearbeitet werden.

Einbetten von Objekten in eine E‑Mail

Die LinkedResource Klasse wird verwendet mit der MailMessage Klasse, um Objekte in Ihren E‑Mail‑Nachrichten einzubetten. Um ein eingebettetes Objekt hinzuzufügen, gehen Sie wie folgt vor

  1. Erstellen Sie eine Instanz von dem MailMessage Klasse.
  2. Geben Sie die Werte für Absender, Empfänger und Betreff in MailMessage Instanz.
  3. Erstellen Sie eine Instanz von dem AlternateView Klasse.
  4. Erstellen Sie eine Instanz von dem LinkedResource Klasse.
  5. Laden Sie ein eingebettetes Objekt in das LinkedResourceCollection.
  6. Fügen Sie das geladene eingebettete Objekt in das MailMessage Klasseninstanz.
  7. Fügen Sie das AlternateView Instanz zu dem MailMessage Klasseninstanz.

Die untenstehenden Code‑Snippets erzeugen eine E‑Mail‑Nachricht mit sowohl Klartext‑ als auch HTML‑Body und einem Bild, das in das HTML eingebettet ist

|Bild in E‑Mail eingebettet| | :- | |todo:image_alt_text| Sie können beliebig viele eingebettete Objekte senden. Die Größe des Anhangs ist durch den Mail-Server begrenzt. Gmail unterstützt beispielsweise keine Dateigrößen über 10 MB. Die untenstehenden Code‑Snippets zeigen, wie Objekte in eine E‑Mail eingebettet werden.

// 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());

Entfernen eingebetteter Objekte aus einer E‑Mail

LinkedResourceCollection zugegriffen über MailMessage.LinkedResources Eigenschaft. Die LinkedResourceCollection Die Sammlung bietet eine Methode, um eingebettete Objekte, die einer E‑Mail‑Nachricht hinzugefügt wurden, vollständig zu entfernen. Verwenden Sie die überladene Version von LinkedResourceCollection.removeAt Methode, um alle Spuren eines eingebetteten Objekts aus einer E‑Mail‑Nachricht zu entfernen.

Der untenstehende Beispielcode zeigt, wie eingebettete Objekte aus einer E‑Mail‑Nachricht entfernt werden können.

// 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);

Extrahieren eingebetteter Objekte

Dieses Thema erklärt, wie eingebettete Objekte aus einer E‑Mail‑Datei extrahiert werden können. Ein eingebettetes Objekt ist ein Objekt, das mit einer Anwendung erstellt und in ein Dokument oder eine Datei eingefügt wurde, die von einer anderen Anwendung erstellt wurde. Beispielsweise kann eine Microsoft‑Excel‑Tabelle in einen Microsoft‑Word‑Bericht eingebettet werden, oder eine Videodatei kann in eine Microsoft‑PowerPoint‑Präsentation eingebettet werden. Wenn eine Datei eingebettet wird, anstatt sie in ein anderes Dokument einzufügen oder einzukopieren, behält sie ihr ursprüngliches Format bei. Das eingebettete Dokument kann in der ursprünglichen Anwendung geöffnet und bearbeitet werden. Um ein eingebettetes Objekt aus einer E‑Mail‑Nachricht zu extrahieren, gehen Sie wie folgt vor:

  1. Erstellen Sie eine Instanz von dem MailMessage Klasse.
  2. Laden Sie eine E‑Mail‑Datei in das MailMessage Instanz.
  3. Erstellen Sie eine Schleife und erstellen Sie eine Instanz von Attachment Klasse darin.
  4. Speichern Sie den Anhang und zeigen Sie ihn auf dem Bildschirm an.
  5. Geben Sie die Absender- und Empfängeradresse im MailMessage Instanz.
  6. E-Mail senden mit dem SmtpClient Klasse.

Das nachstehende Code‑Snippet extrahiert eingebettete Objekte aus einer E‑Mail.

|Extrahierte eingebettete Objekte in E‑Mail| | :- | |todo:image_alt_text| Das folgende Code‑Snippet zeigt, wie man eingebettete Objekte extrahiert.

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

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

Identifizieren und Extrahieren eines eingebetteten Anhangs aus einer MSG im RTF-Format

Der folgende Code kann für Nachrichten im RTF-Format verwendet werden, um Anhänge zu unterscheiden und zu extrahieren, die entweder Inline sind oder als Symbol im Nachrichtenkörper erscheinen. Das nachstehende Code‑Snippet zeigt, wie Sie einen eingebetteten Anhang aus einer MSG‑Datei im RTF-Format identifizieren und extrahieren.

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);
            }
        }
    }
}

Abrufen von Anhängen aus signierter E‑Mail

Signierte E‑Mails enthalten einen einzelnen smime.p7m‑Anhang. Das bedeutet, dass die E‑Mail mit SMIME verschlüsselt ist. Das Dateiformat smime.p7m ist die digitale Signatur. Um den Inhalt dieser E‑Mail zu sehen, verwenden Sie die RemoveSignature Methode. Die Methode gibt ein MailMessage Objekt ohne digitale Signatur.

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());
    }
}

Arbeiten mit Content-Type und Content-Disposition

Aspose.Email API bietet die Möglichkeit, mit dem Anhang zu arbeiten Content-Type und Content-Disposition aus dem Anhang-Header. Das folgende Code‑Snippet zeigt, wie man die Inhaltsbeschreibung des Anhangs abruft und ändert.

Anzeige der Content-Type- und Content-Disposition-Parameter

Das folgende Code‑Snippet zeigt, wie Sie die Parameter von Content-Type und Content-Disposition auf dem Bildschirm anzeigen:

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());
}

Verwendung von Content-Type- und Content-Disposition-Parametern mit Anhängen

Das folgende Code‑Snippet zeigt, wie Sie die Parameter Content-Type und Content-Disposition mit einem Anhang verwenden:

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);