Embutindo Imagens no envio de Emails

by Israel Aece 16. October 2005 13:39

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.

Tags:

.NET Framework

Comments

8/28/2009 6:55:13 PM #

fabiano

Ola Israel,

tentei seguir seu exemplo de envio de email do link
www.linhadecodigo.com.br/ArtigoImpressao.aspx
porem o que eu procuro é mandar o email pelo outlook

e só achei o  System.Diagnostics.Process.Start(StringCommand.ToString)
porem não consigo Attachar um arquivo qualquer.

teria um exemplo de como fazer este processo?
Grato.

Ps. Parabéns pelo Site

fabiano Brazil

8/29/2009 10:32:56 AM #

IsraelAece

Boas Fabiano,

Não entendi a sua dúvida. Poderia ser mais claro?

IsraelAece Brazil

11/15/2009 7:29:44 PM #

Márcio Teixeira


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!

Márcio Teixeira Spain

11/15/2009 9:08:48 PM #

Márcio Teixeira

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!

Márcio Teixeira Spain

Comments are closed

Powered by BlogEngine.NET 1.5.0.0
Theme by Mads Kristensen

Sobre

Meu nome é Israel Aece e sou especialista em tecnologias de desenvolvimento Microsoft, atuando como desenvolvedor de aplicações para o mercado financeiro utilizando a plataforma .NET. [ Mais ]

Twitter

Host