Trabalhando com Anexos e Objetos Incorporados

Gerenciando Anexos de E‑mail

Um anexo de e‑mail é um arquivo enviado junto com uma mensagem de e‑mail. O arquivo pode ser enviado como uma mensagem separada ou como parte da mensagem à qual está anexado. O Attachment classe é usada com o MailMessage classe. Todas as mensagens incluem um corpo. Além do corpo, você pode desejar enviar arquivos adicionais. Estes são enviados como anexos e são representados como uma instância de Attachment classe. Você pode enviar qualquer número de anexos, mas o tamanho do anexo é limitado pelo servidor de e‑mail. O Gmail, por exemplo, não suporta arquivos maiores que 10 MB.

Adicionando Anexo

Para anexar um anexo a um e‑mail, siga estas etapas:

  1. Crie uma instância do MailMessage classe.
  2. Crie uma instância do Attachment classe.
  3. Carregar anexo no Attachment instância.
  4. Adicionar o Attachment instância no MailMessage instância.

O trecho de código a seguir mostra como adicionar um anexo a um e‑mail.

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

Acima, descrevemos como adicionar anexos à sua mensagem de e‑mail com Aspose.Email. O que segue mostra como remover anexos e exibir informações sobre eles na tela.

Removendo um Anexo

Para remover um anexo, siga os passos abaixo:

O trecho de código a seguir mostra como remover um anexo.

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

Exibindo Nome de Arquivo do Anexo

Para exibir o nome do arquivo do anexo, siga estas etapas:

  1. Iterar pelos anexos na mensagem de e‑mail e
    1. Salvar cada anexo.
    2. Exibir o nome de cada anexo na tela.

O trecho de código a seguir mostra como exibir o nome de arquivo de um anexo na tela.

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

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

Extraindo Anexos de E‑mail

Este tópico explica como extrair um anexo de um arquivo de e‑mail. Um anexo de e‑mail é um arquivo enviado junto com uma mensagem de e‑mail. O arquivo pode ser enviado como uma mensagem separada ou como parte da mensagem à qual está anexado. Todas as mensagens de e‑mail incluem uma opção para enviar arquivos adicionais. Estes são enviados como anexos e são representados como instâncias do Attachment classe. O Attachment classe é usada com o MailMessage classe para trabalhar com anexos. Para extrair anexos de uma mensagem de e‑mail, siga estas etapas:

  • Crie uma instância do MailMessage classe.
  • Carregue um arquivo de e‑mail na MailMessage instância.
  • Crie uma instância do Attachment classe e usá‑la em um loop para extrair todos os anexos.
  • Salvar o anexo e exibi‑lo na tela.

|Extracted attachments in email| | :- | |todo:image_alt_text| O trecho de código a seguir mostra como Extrair Anexos de 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());
}

Recuperando Content‑Description do Anexo

A API Aspose.Email fornece a capacidade de ler o Content‑Description do anexo a partir do cabeçalho do anexo. O trecho de código a seguir mostra como recuperar a descrição do conteúdo do anexo.

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

Determinar se um Anexo é uma Mensagem Incorporada

O trecho de código a seguir demonstra como determinar se o anexo é uma mensagem incorporada ou não.

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

Determinar Anexos Formatados como TNEF

O Attachment.isTnef propriedade da API Aspose.Email para Java indica se o anexo da mensagem está formatado como TNEF.

O trecho de código a seguir demonstra como determinar se um anexo está formatado como TNEF:

MailMessage eml = MailMessage.load(fileName);

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

Carregar e Salvar Anexos TNEF

Aspose.Email for Java fornece métodos no MapiAttachment classe para executar as seguintes operações:

Carregar de TNEF

  • static MapiAttachment loadFromTnef(String fileName) – Carrega um anexo de um arquivo TNEF.

  • static MapiAttachment loadFromTnef(InputStream stream) – Carrega um anexo de um fluxo TNEF.

Salvar como TNEF

  • void saveToTnef(String fileName) – Salva um anexo em um arquivo TNEF.

  • void saveToTnef(OutputStream stream) – Salva um anexo em um fluxo TNEF.

O exemplo de código a seguir demonstra como extrair um anexo TNEF de uma mensagem, salvá‑lo em um fluxo ou arquivo e, em seguida, recarregá‑lo na mensagem como um 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);

Extraindo URI do Anexo se o Anexo for URI‑anexo

O trecho de código a seguir demonstra como extrair o URI do anexo.

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

Adicionando Anexos de Referência

Um anexo de referência é uma alternativa ao anexo de arquivo local. Em alguns casos, os anexos de referência podem ser preferíveis, por exemplo, se você quiser gerenciar seu acesso. As classes abaixo são usadas para gerenciar e manipular mensagens de e‑mail e seus anexos:

O exemplo de código a seguir demonstra como carregar uma mensagem de e‑mail a partir de um arquivo, criar um anexo de referência com propriedades específicas e adicionar o anexo à mensagem de 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);

Trabalhando com Objetos Incorporados

Um objeto incorporado é um objeto que foi criado com um aplicativo e inserido dentro de um documento ou arquivo criado por outro aplicativo. Por exemplo, uma planilha do Microsoft Excel pode ser incorporada em um relatório do Microsoft Word, ou um arquivo de vídeo pode ser incorporado em uma apresentação do Microsoft PowerPoint. Quando um arquivo é incorporado, ao invés de ser inserido ou colado em outro documento, ele mantém seu formato original. O documento incorporado pode ser aberto no aplicativo original e modificado.

Incorporando Objetos em um E‑mail

O LinkedResource classe é usada com o MailMessage classe para incorporar objetos nas suas mensagens de e‑mail. Para adicionar um objeto incorporado, siga estas etapas

  1. Crie uma instância do MailMessage classe.
  2. Especifique os valores de remetente, destinatário e assunto em MailMessage instância.
  3. Crie uma instância do AlternateView classe.
  4. Crie uma instância do LinkedResource classe.
  5. Carregar um objeto incorporado ao LinkedResourceCollection.
  6. Adicionar o objeto incorporado carregado ao MailMessage instância de classe.
  7. Adicionar o AlternateView instância para o MailMessage instância de classe.

Os trechos de código abaixo produzem uma mensagem de e‑mail com corpos em texto simples e HTML e uma imagem incorporada ao HTML

|Image embedded into email| | :- | |todo:image_alt_text| Você pode enviar qualquer número de objetos incorporados. O tamanho do anexo é limitado pelo servidor de e‑mail. O Gmail, por exemplo, não suporta arquivos maiores que 10 MB. Os trechos de código abaixo demonstram como incorporar objetos em um e‑mail.

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

Removendo Objetos Incorporados do E‑mail

LinkedResourceCollection acessado via MailMessage.LinkedResources propriedade. O LinkedResourceCollection a coleção fornece um método para remover completamente objetos incorporados adicionados a uma mensagem de e‑mail. Use a versão sobrecarregada de LinkedResourceCollection.removeAt método para remover todas as evidências de um objeto incorporado de uma mensagem de e‑mail.

O código de exemplo abaixo mostra como remover objetos incorporados de uma mensagem de 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);

Extraindo Objetos Incorporados

Este tópico explica como extrair objetos incorporados de um arquivo de e‑mail. Um objeto incorporado é um objeto que foi criado com um aplicativo e inserido dentro de um documento ou arquivo criado por outro aplicativo. Por exemplo, uma planilha do Microsoft Excel pode ser incorporada em um relatório do Microsoft Word, ou um arquivo de vídeo pode ser incorporado em uma apresentação do Microsoft PowerPoint. Quando um arquivo é incorporado, ao invés de ser inserido ou colado em outro documento, ele mantém seu formato original. O documento incorporado pode ser aberto no aplicativo original e ser modificado. Para extrair um objeto incorporado de uma mensagem de e‑mail, siga estas etapas:

  1. Crie uma instância do MailMessage classe.
  2. Carregue um arquivo de e‑mail no MailMessage instância.
  3. Crie um loop e crie uma instância da Attachment classe nele.
  4. Salvar o anexo e exibi‑lo na tela.
  5. Especifique o endereço do remetente e do destinatário no MailMessage instância.
  6. Enviar e‑mail usando o SmtpClient classe.

O trecho de código abaixo extrai objetos incorporados de um e‑mail.

|Objetos incorporados extraídos no e‑mail| | :- | |todo:image_alt_text| O trecho de código a seguir mostra como extrair objetos incorporados.

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

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

Identificar e Extrair um anexo incorporado de MSG formatado como RTF

O código a seguir pode ser usado para mensagens formatadas como RTF para diferenciar e extrair anexos que são Inline ou aparecem como Ícone no corpo da mensagem. O trecho de código a seguir mostra como identificar e extrair um anexo incorporado de um MSG formatado como 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);
            }
        }
    }
}

Recuperando Anexos de E‑mail Assinado

E‑mails assinados contêm um único anexo smime.p7m. Isso significa que o e‑mail está criptografado por SMIME. O formato de arquivo smime.p7m é a assinatura digital. Para ver o conteúdo deste e‑mail, use o RemoveSignature método. O método retorna um MailMessage objeto sem assinatura digital.

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

Trabalhando com Content-Type e Content-Disposition

Aspose.Email API fornece a capacidade de trabalhar com o anexo Content-Type e Content-Disposition do cabeçalho do anexo. O trecho de código a seguir mostra como obter e alterar a descrição do conteúdo do anexo.

Exibindo os parâmetros Content-Type e Content-Disposition

O trecho de código a seguir mostra como exibir os parâmetros de Content-Type e Content-Disposition na tela:

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

Usando os parâmetros Content-Type e Content-Disposition com Anexos

O trecho de código a seguir mostra como usar os parâmetros Content-Type e Content-Disposition com um anexo:

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