Lavorare con Allegati e Oggetti Incorporati

Gestire gli Allegati Email

Un allegato email è un file che viene inviato insieme a un messaggio email. Il file può essere inviato come messaggio separato così come parte del messaggio a cui è allegato. Il Attachment classe è usata con il MailMessage classe. Tutti i messaggi includono un corpo. Oltre al corpo, potresti voler inviare file aggiuntivi. Questi vengono inviati come allegati e sono rappresentati come un’istanza del Attachment classe. È possibile inviare un numero qualsiasi di allegati ma la dimensione dell’allegato è limitata dal server di posta. Gmail, ad esempio, non supporta file di dimensioni superiori a 10 MB.

Aggiunta di allegato

Per allegare un allegato a un’email, segui questi passaggi:

  1. Crea un’istanza di MailMessage classe.
  2. Crea un’istanza di Attachment classe.
  3. Carica l’allegato nella Attachment istanza.
  4. Aggiungi il/la Attachment istanza nel MailMessage istanza.

Il seguente snippet di codice ti mostra come aggiungere un allegato a un’email.

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

Sopra, abbiamo descritto come aggiungere allegati al tuo messaggio email con Aspose.Email. Quanto segue mostra come rimuovere gli allegati e visualizzare le informazioni su di essi sullo schermo.

Rimozione di un allegato

Per rimuovere un allegato, segui i passaggi indicati di seguito:

  • Crea un’istanza di Attachment classe.
  • Carica l’allegato nell’istanza di Attachment classe.
  • Aggiungi l’allegato all’istanza di MailMessage classe.
  • Rimuovi gli allegati dall’istanza di Attachment classe utilizzando il MailMessage istanza di classe.

Il seguente snippet di codice ti mostra come rimuovere un allegato.

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

Visualizzazione del nome del file allegato

Per visualizzare il nome del file allegato, segui questi passaggi:

  1. Itera attraverso gli allegati nel messaggio email e
    1. Salva ogni allegato.
    2. Visualizza ogni nome di allegato sullo schermo.

Il seguente snippet di codice ti mostra come visualizzare il nome del file allegato sullo schermo.

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

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

Estrazione di allegati email

Questo argomento spiega come estrarre un allegato da un file email. Un allegato email è un file inviato insieme a un messaggio email. Il file può essere inviato come messaggio separato o come parte del messaggio a cui è allegato. Tutti i messaggi email includono un’opzione per inviare file aggiuntivi. Questi vengono inviati come allegati e sono rappresentati come istanze di Attachment classe. Il Attachment classe è usata con il MailMessage classe per lavorare con gli allegati. Per estrarre gli allegati da un messaggio email, segui questi passaggi:

  • Crea un’istanza di MailMessage classe.
  • Carica un file email nella MailMessage istanza.
  • Crea un’istanza di Attachment classe e usala in un ciclo per estrarre tutti gli allegati.
  • Salva l’allegato e visualizzalo sullo schermo.

|Allegati estratti nell’email| | :- | |todo:image_alt_text| Il seguente snippet di codice ti mostra come estrarre gli allegati email.

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

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

Recupero del Content-Description dall’allegato

L’API Aspose.Email fornisce la capacità di leggere il Content-Description dell’allegato dall’intestazione dell’allegato. Il seguente snippet di codice ti mostra come recuperare la descrizione del contenuto dall’allegato.

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

Determinare se un allegato è un messaggio incorporato

Il seguente snippet di codice dimostra come determinare se l’allegato è un messaggio incorporato o meno.

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

Determinare gli allegati formattati TNEF

Il Attachment.isTnef proprietà dell’API Aspose.Email Java indica se l’allegato del messaggio è un messaggio formattato TNEF.

Il seguente snippet di codice dimostra come determinare se un allegato è formattato TNEF:

MailMessage eml = MailMessage.load(fileName);

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

Caricamento e salvataggio di allegati TNEF

Aspose.Email per Java fornisce metodi in MapiAttachment classe per eseguire le seguenti operazioni:

Carica da TNEF

  • static MapiAttachment loadFromTnef(String fileName) – Carica un allegato da un file TNEF.

  • static MapiAttachment loadFromTnef(InputStream stream) – Carica un allegato da un flusso TNEF.

Salva in TNEF

  • void saveToTnef(String fileName) – Salva un allegato in un file TNEF.

  • void saveToTnef(OutputStream stream) – Salva un allegato in un flusso TNEF.

Il seguente esempio di codice dimostra come estrarre un allegato TNEF da un messaggio, salvarlo in uno stream o file, e poi ricaricarlo nel messaggio come un 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);

Estrazione dell’URI dell’allegato se l’allegato è un URI-allegato

Il seguente snippet di codice dimostra come estrarre l’URI dell’allegato.

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

Aggiunta di allegati di riferimento

Un allegato di riferimento è un’alternativa all’allegato file locale. In alcuni casi, gli allegati di riferimento possono essere preferibili, ad esempio se vuoi gestirne l’accesso. Le classi seguenti sono utilizzate per gestire e manipolare i messaggi email e i loro allegati:

Il seguente esempio di codice dimostra come caricare un messaggio email da un file, creare un allegato di riferimento con proprietà specifiche e aggiungere l’allegato al messaggio email:

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

Lavorare con oggetti incorporati

Un oggetto incorporato è un oggetto creato con un’applicazione e inserito all’interno di un documento o file creato da un’altra applicazione. Ad esempio, un foglio di calcolo Microsoft Excel può essere incorporato in un rapporto Microsoft Word, oppure un file video può essere incorporato in una presentazione Microsoft PowerPoint. Quando un file è incorporato, invece di essere inserito o incollato in un altro documento, mantiene il suo formato originale. Il documento incorporato può essere aperto nell’applicazione originale e modificato.

Incorporamento di oggetti in un’email

Il LinkedResource classe è usata con il MailMessage classe per incorporare oggetti nei tuoi messaggi email. Per aggiungere un oggetto incorporato, segui questi passaggi

  1. Crea un’istanza di MailMessage classe.
  2. Specifica i valori da, a e oggetto in MailMessage istanza.
  3. Crea un’istanza di AlternateView classe.
  4. Crea un’istanza di LinkedResource classe.
  5. Carica un oggetto incorporato nella LinkedResourceCollection.
  6. Aggiungi l’oggetto incorporato caricato nella MailMessage istanza di classe.
  7. Aggiungi il/la AlternateView istanza al MailMessage istanza di classe.

Gli snippet di codice seguenti producono un messaggio email con corpi di testo semplice e HTML e un’immagine incorporata nell’HTML

|Immagine incorporata nell’email| | :- | |todo:image_alt_text| Puoi inviare un numero qualsiasi di oggetti incorporati. La dimensione dell’allegato è limitata dal server di posta. Gmail, ad esempio, non supporta file di dimensioni superiori a 10 MB. Gli snippet di codice seguenti mostrano come incorporare oggetti in un’email.

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

Rimozione di oggetti incorporati dalle email

LinkedResourceCollection acceso tramite MailMessage.LinkedResources proprietà. Il LinkedResourceCollection la collezione fornisce un metodo per rimuovere completamente gli oggetti incorporati aggiunti a un messaggio email. Usa la versione sovraccaricata di LinkedResourceCollection.removeAt metodo per rimuovere tutte le tracce di un oggetto incorporato da un messaggio email.

Il codice di esempio seguente mostra come rimuovere oggetti incorporati da un messaggio email.

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

Estrazione di oggetti incorporati

Questo argomento spiega come estrarre oggetti incorporati da un file email. Un oggetto incorporato è un oggetto creato con un’applicazione e inserito all’interno di un documento o file creato da un’altra applicazione. Ad esempio, un foglio di calcolo Microsoft Excel può essere incorporato in un rapporto Microsoft Word, oppure un file video può essere incorporato in una presentazione Microsoft PowerPoint. Quando un file è incorporato, invece di essere inserito o incollato in un altro documento, mantiene il suo formato originale. Il documento incorporato può essere aperto nell’applicazione originale e modificato. Per estrarre un oggetto incorporato da un messaggio email, segui questi passaggi:

  1. Crea un’istanza di MailMessage classe.
  2. Carica un file email nel MailMessage istanza.
  3. Crea un ciclo e crea un’istanza della Attachment classe in esso.
  4. Salva l’allegato e visualizzalo sullo schermo.
  5. Specificare l’indirizzo del mittente e del destinatario nel MailMessage istanza.
  6. Invia email utilizzando il SmtpClient classe.

Il frammento di codice qui sotto estrae oggetti incorporati da un’email.

|Oggetti incorporati estratti nell’email| | :- | |todo:image_alt_text| Il seguente frammento di codice mostra come estrarre oggetti incorporati.

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

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

Identificare ed Estrarre un allegato incorporato da MSG formattato come RTF

Il codice seguente può essere usato per messaggi formattati come RTF per differenziare ed estrarre allegati che sono Inline o appaiono come Icona nel corpo del messaggio. Il frammento di codice mostra come identificare ed estrarre un allegato incorporato da MSG formattato come 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);
            }
        }
    }
}

Recuperare Allegati da Email Firmata

Le email firmate contengono un unico allegato smime.p7m. Ciò significa che l’email è crittografata tramite SMIME. Il formato file smime.p7m è la firma digitale. Per vedere il contenuto di questa email usa il RemoveSignature metodo. Il metodo restituisce un MailMessage oggetto senza firma digitale.

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

Lavorare con Content-Type e Content-Disposition

L’API Aspose.Email fornisce la capacità di lavorare con l’allegato Content-Type e Content-Disposition dall’intestazione dell’allegato. Il seguente frammento di codice mostra come ottenere e modificare la descrizione del contenuto dell’allegato.

Visualizzare i parametri Content-Type e Content-Disposition

Il seguente frammento di codice mostra come visualizzare i parametri di Content-Type e Content-Disposition sullo schermo:

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

Utilizzare i parametri Content-Type e Content-Disposition con gli Allegati

Il seguente frammento di codice mostra come usare i parametri Content-Type e Content-Disposition con un allegato:

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