Gerenciar Anexos de Email e Objetos Incorporados em C#

Gerenciar Anexos de Email

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.

Adicionar um Anexo

Para adicionar 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
var eml = new MailMessage
{
    From = "sender@from.com",
    To = "receiver@to.com",
    Subject = "This is message",
    Body = "This is body"
};

// Load an attachment
var attachment = new Attachment("1.txt");

// Add Multiple Attachment in instance of MailMessage class and Save message to disk
eml.Attachments.Add(attachment);

eml.AddAttachment(new Attachment("1.jpg"));
eml.AddAttachment(new Attachment("1.doc"));
eml.AddAttachment(new Attachment("1.rar"));
eml.AddAttachment(new Attachment("1.pdf"));
eml.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.

Adicionar um Anexo de Referência

Um anexo de referência é um tipo de anexo que inclui um link ou uma referência a um arquivo ou item, em vez de incluir o próprio arquivo ou item na mensagem de e‑mail. Quando os destinatários do e‑mail clicam no anexo de referência, eles poderão acessar o arquivo vinculado se tiverem as permissões apropriadas. Ao usar um anexo de referência, você pode enviar uma mensagem de e‑mail menor e garantir que todos tenham acesso à versão mais atualizada do arquivo ou item.

O trecho de código abaixo mostra como adicionar um anexo de referência a um e‑mail. O código realiza as seguintes etapas:

  1. Carrega o arquivo de mensagem de e‑mail usando o MailMessage.Load() método.
  2. Cria um novo objeto ReferenceAttachment chamado refAttach, passando a URL do anexo "https://[attach_uri]" como parâmetro para o seu construtor.
  3. Define o nome do anexo para "Document.docx" usando o Nome propriedade do objeto refAttach.
  4. Define o tipo de provedor do anexo como AttachmentProviderType.OneDrivePro usando o ProviderType propriedade do objeto refAttach.
  5. Define o tipo de permissão do anexo como AttachmentPermissionType.AnyoneCanEdit usando o PermissionType propriedade do objeto refAttach.
  6. Adiciona o objeto refAttach ao Anexos coleção do objeto eml usando o Add() método.
var eml = MailMessage.Load("fileName");

var refAttach = new ReferenceAttachment("https://[attach_uri]")
{
    Name = "Document.docx",
    ProviderType = AttachmentProviderType.OneDrivePro,
    PermissionType = AttachmentPermissionType.AnyoneCanEdit
};

eml.Attachments.Add(refAttach);

Remover 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
var eml = new MailMessage {From = "sender@sender.com", To = "receiver@gmail.com"};

// Load an attachment
var attachment = new Attachment("1.txt");
eml.Attachments.Add(attachment);

// Remove attachment from your MailMessage
eml.Attachments.Remove(attachment);

Exibir Nome do Arquivo do Anexo

Para exibir o nome de um arquivo de anexo, siga estes passos:

  1. Percorra os anexos na mensagem de e‑mail e salve 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.

var eml = MailMessage.Load("Attachments.eml");

foreach (var attachment in eml.Attachments)
{
    // Display the the attachment file name
    Console.WriteLine(attachment.Name);
}

Extrair Anexos de Email

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.

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

foreach (var attachment in eml.Attachments)
{
    attachment.Save("MessageEmbedded_out.eml");
    Console.WriteLine(attachment.Name);
}

Recuperar Content-Description do Anexo

A API Aspose.Email fornece a capacidade de ler a Content-Description de um 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.

var eml = MailMessage.Load("EmailWithAttachEmbedded.eml");
Console.WriteLine(eml.Attachments[0].Headers["Content-Description"]);

Identificar Mensagens Incorporadas

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

var eml = MailMessage.Load("EmailWithAttachEmbedded.eml");

Console.WriteLine(eml.Attachments[0].IsEmbeddedMessage
    ? "Attachment is an embedded message."
    : "Attachment isn't an embedded message.");

Recuperar Anexos de Emails Assinados

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.

var signedEml = MailMessage.Load("signed.eml");
        
if (signedEml.IsSigned)
{
    for (var i = 0; i < signedEml.Attachments.Count; i++)
    {
        Console.WriteLine($@"Signed email attachment{i}: {signedEml.Attachments[i].Name}");
    }
    
    // The email is signed. Remove a signature.
    var eml = signedEml.RemoveSignature();
    
    Console.WriteLine(@"Signature removed.");

    for (var i = 0; i < eml.Attachments.Count; i++)
    {
        Console.WriteLine($@"Email attachment{i}: {eml.Attachments[i].Name}");
    }
}

Manipulação de Imagens Inline

Adicionar Imagem Inline ao Corpo do Email

O LinkedResource classe é usada com o MailMessage classe para incorporar objetos na sua mensagem de e‑mail. Para adicionar um objeto incorporado, siga estes passos

  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.

var eml = new MailMessage
{
    From = "AndrewIrwin@from.com",
    To = "SusanMarc@to.com",
    Subject = "This is an email"
};

// Create the plain text part It is viewable by those clients that don't support HTML
var 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'.
var 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
var barcode = new LinkedResource("1.jpg", MediaTypeNames.Image.Jpeg)
{
    ContentId = "barcode"
};

eml.LinkedResources.Add(barcode);
eml.AlternateViews.Add(plainView);
eml.AlternateViews.Add(htmlView);

eml.Save("EmbeddedImage_out.msg", SaveOptions.DefaultMsgUnicode);

Remover Imagem Inline do Corpo do Email

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
var eml = MailMessage.Load("EmlWithLinkedResources.eml");

//Remove a LinkedResource
eml.LinkedResources.RemoveAt(0, true);

//Now clear the Alternate View for linked Resources
eml.AlternateViews[0].LinkedResources.Clear(true);

Manipulação de Objetos Incorporados

Um objeto incorporado é um objeto criado com um aplicativo e incluído 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, em vez de inserido ou colado em outro documento, ele mantém seu formato original. O documento incorporado pode ser aberto no aplicativo original e modificado.

Extrair Objetos Incorporados

Este tópico explica como extrair objetos incorporados de um arquivo de e‑mail. O documento incorporado pode ser aberto no aplicativo original e ser modificado. Para extrair um objeto incorporado de uma mensagem de e‑mail, siga estes passos:

  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.

var eml = MailMessage.Load("Message.msg", new MsgLoadOptions());

foreach (var attachment in eml.Attachments)
{
    attachment.Save("MessageEmbedded_out.msg");
    Console.WriteLine(attachment.Name);
}

Extrair Imagens Vinculadas em Emails HTML

Extrair recursos de imagens vinculadas externamente do corpo HTML e incorporá‑los na saída HTML com Aspose.Email para .NET. Defina HtmlSaveOptions.ExtractHTMLBodyResourcesAsAttachments para True, e imagens vinculadas e outros recursos no corpo HTML serão extraídos e incorporados. Isso ajuda a preservar a aparência original das mensagens com conteúdo vinculado. O exemplo de código a seguir demonstra como carregar uma mensagem de e‑mail, extrair seus recursos HTML externos como anexos, opcionalmente tratar eventos de renderização de recursos e, então, salvar a mensagem como um arquivo HTML usando Aspose.Email para .NET.

// Load the email message
var mailMessage = MailMessage.Load("input.eml");

// Set options to extract external HTML resources
var options = new HtmlSaveOptions();
options.ExtractHTMLBodyResourcesAsAttachments = true;

// Optional: Handle resource rendering events
options.ResourceHtmlRendering += (sender, e) =>
{
    Console.WriteLine(e.PathToResourceFile + " " + ((Attachment)sender).ContentId);
};

// Save the HTML representation of the email
mailMessage.Save("output.html", options);