Embutindo Imagens no envio de Emails


Finalmente a versão 2.0 do .NET Framework já traz intrinsicamente um recurso que nas versões anteriores somente conseguíamos com a utilização de componentes de terceiros; trata-se da opção de agora podermos embutir dentro do email imagens que farão parte do conteúdo do mesmo.

Nas versões anteriores, se não quiséssemos utilizar componentes de terceiros, tínhamos que disponibilizar em algum lugar, geralmente imagens, que iriam fazer parte do conteúdo do email e, através do acesso via HTTP, a exibíamos. O ponto negativo disso é que depende de uma conexão ativa com a internet para que o usuário consiga visualizar essas imagens.

Felizmente na versão 2.0, temos duas principais classes para trabalharmos com isso. São elas: AlternateView e LinkedResource. A primeira especifica diferentes cópias do conteúdo do email, ou seja, voce define o email com o formato e tags HTML e, se o leitor de emails do destinatário não suportar HTML, voce pode fornecer através desta classe, uma versão em Plain Text do mesmo conteúdo. Já a segunda classe, representa um recurso externo que será embutido dentro do conteúdo do email que, na maioria dos casos, é uma imagem. Depois desta classe criada, o adicionamos na coleção de LinkedResources do objeto AlternateView.

O código abaixo mostra-nos como devemos proceder para conseguirmos enviar um email com uma imagem embutida no corpo do mesmo:

     using System.Net.Mail;
     using System.Net.Mime;

     MailMessage mail = new MailMessage(“israel@projetando.net“, “israel@projetando.net“);
     mail.Subject = “Testando Imagens Embutidas”;
     string body = @”<img src=””cid:Imagem1″” /><br><br>Embutindo Imagens no Email.”;

     AlternateView view = 
          AlternateView.CreateAlternateViewFromString(body, null, MediaTypeNames.Text.Html);

     LinkedResource resource = new LinkedResource(Server.MapPath(“Logo.gif”));
     resource.ContentId = “Imagem1”;
     view.LinkedResources.Add(resource);

     mail.AlternateViews.Add(view);
     mail.IsBodyHtml = true;
     new SmtpClient(“mail.servidor.com.br”).Send(mail);

Como podemos analisar no código acima, criamos uma classe do tipo MailMessage, como já fazíamos nas versões anteriores. Dentro do conteúdo do email (body), definimos a tag img e o atributo src que corresponderá a imagem no local que desejarmos. Através do cdi especificamos que o conteúdo será “substituído” pelo conteúdo que mais tarde vamos vir a embutir. Através do método CreateAlternateViewFromString, onde passamos o corpo da mensagem e o tipo que ela irá ser (no caso HTML), devolvemos uma instancia da classe AlternateView baseada nesses mesmos parametros.

Depois disso, criamos um objeto do tipo LinkedResource, onde vamos definir a imagem (ou recurso) que vamos embutir. É importante dizer que a propriedade ContentId deve ser exatamente o mesmo ID que definimos no cid do corpo da mensagem. Agora basta adicionarmos o objeto na coleção de LinkedResources do objeto AlternateView e, este por sua vez, adicionamos na coleção de Views do objeto MailMessage.

Finalmente, através de uma instancia do objeto SmtpClient, utilizamos o método Send para enviar o email. A Imagem abaixo mostra o email já dentro do Microsoft Outlook. Reparem que a imagem é embutida no local que definimos dentro do código HTML do corpo da mensagem e que também que não existem arquivos anexados ao email.

Anúncios

2 comentários sobre “Embutindo Imagens no envio de Emails

  1. Olá Israel,

    Meu nome é Marcio, estou começando em asp.net…
    Parabens pelo trabalho, ja tirei muitas duvidas em sua pagia kkk Obrigado!

    Agora a duvida que tenho…
    Estou tentando enviar email com Imagem "incorporada", quando envio com nomes estaticos da certo, porem se eu tenho um grupo de nomes de arquivos, em um Array por exemplo nao da certo, vc sabe pq?

    Antes de enviar o corpo eu troco todas as TAGs <IMG src="… por <image src=’cid:…

    Ja tentei de muitas formas, esta foi a principal:

    Dim CuerpoHtml As AlternateView = AlternateView.CreateAlternateViewFromString(strCuerpoDe, Nothing, "text/html")

    If Not Images Is Nothing Then

    For i As Integer = 0 To Images.Length – 1

    Dim LRimagen As New LinkedResource(strCarpetaTMP & "Images/" & Images(i).ToString)
    LRimagen.ContentId = Images(i).ToString

    CuerpoHtml.LinkedResources.Add(LRimagen)
    Next

    End If

    ElEmail.AlternateViews.Add(CuerpoHtml)

    ———————————————————————-
    ATE ASSIM EU JA TENTEI kkkkkk

    If Not Images Is Nothing Then

    Dim LRimagen() As LinkedResource
    Dim CuerpoHtml() As AlternateView

    For i As Integer = 0 To Images.Length – 1

    ReDim Preserve LRimagen(i)
    ReDim Preserve CuerpoHtml(i)

    CuerpoHtml(i) = AlternateView.CreateAlternateViewFromString(strCuerpoDe, Nothing, "text/html")

    LRimagen(i) = New LinkedResource(strCarpetaTMP & "Images/" & Images(i).ToString)
    LRimagen(i).ContentId = Images(i).ToString ‘Images(i).ToString

    CuerpoHtml(i).LinkedResources.Add(LRimagen(i))

    ElEmail.AlternateViews.Add(CuerpoHtml(i))
    Next

    End If
    —————————————————–

    Mesmo assim nao deu certo!

    Existe alguma outra forma de fazer?

    De ante mao ja agradeço!

    • Ja encontrei o Problema Israel, no final foi uma falta de atencao minha, criei a Propriedade(Array) da Classe e esqueci de passar os valores kkkk

      *Quem quiser Criar uma lista de imagens no corpo do Email, o 1 codigo de minha duvida funciona perfeitamente…

      Mais uma vez OBRIGADO Israel, Abraço!

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s