Enviando E-mail com o .NET
Hoje vou escrever sobre como criar e enviar um e-mail utilizando o .NET. Vamos direto ao assunto.
Criando um objeto MailMessage
No .NET você precisa instanciar a classe MailMessage para criar o seu e-mail. Para instanciá-la você deve incluir o namespace System.Net.Mail que provê uma série de features para este contexto.
No exemplo abaixo você verá como instanciar a classe MailMessage já configurando o remetente, destinatário, Assunto e o conteúdo.
MailMessage email = new MailMessage(remente@servidor.com, destinatario@servidor.com, “Assunto”, “Conteúdo”);
Você também pode utilizar o construtor padrão e configurar as propriedades posteriormente. Perceba que eu utilizei a classe MailAdress para adicionar o destinatário e o remetente.
MailMessage email = new MailMessage();
email.From = new MailAddress(“remente@servidor.com“, “Remetente”);
email.To.Add(new MailAddress(“destinatario@servidor.com“, “Destinatário”));
email.Subject = “Assunto”;
email.Body = “Conteúdo”;
email.Priority = MailPriority.Normal;
Anexando arquivos ao e-mail
Para anexar um arquivo qualquer no seu e-mail o seu objeto de e-mail criado e adicione um objeto “Attachment” contento o caminho para o arquivo.
email.Attachments.Add(new Attachment(@”C:\Pasta\arquivo.txt”));
Você também pode utilizar as configurações do “Attachment” para anexar arquivos do tipo MIME direto da memória. mas para isso você precisa ter carregado um objeto “Stream” contendo o seu arquivo.
Stream arq= new FileStream(@”C:\ebook.pdf”, FileMode.Open, FileAccess.Read);
email.Attachments.Add(new Attachment(arq, “livro.pdf”, MediaTypeNames.Application.Pdf));
E-mail com formato HTML
A classe MailMessage também permite que você crie o corpo do e-mail como html ao invés de um simples texto. Segue abaixo o exemplo.
email.Body = “<html><body>Este conteúdo é um html</body></html>”;
email.IsBodyHtml = true;
Alguns leitores de e-mail podem não ler e-mails quando o corpo do mesmo está configurado como html. Para isso você utiliza a classe AlternateView. Basta você criar uma visualização html e uma para um texto simples. Abaixo eu demonstro como fazer isso.
AlternateView visualizacaoHtml= AlternateView.CreateAlternateViewFromString(“Meu conteúdo html”, null, MediaTypeNames.Text.Html);
AlternateView visualizacaoTexto= AlternateView.CreateAlternateViewFromString(“Meu texto simples”, null, MediaTypeNames.Text.Plain);
email.AlternateViews.Add(visualizacaoHtml);
email.AlternateViews.Add(visualizacaoTexto);
E se você quiser incluir uma imagem dentro do conteúdo html que não seja um anexo utilize a classe LinkedResource. Preste atenção no src da imagem no conteúdo html e na propriedade ContentID do objeto LinkedResource.
AlternateView visualizacaoHtml = AlternateView.CreateAlternateViewFromString(“<html><body><img src=\”cid:Foto\”></body></html>”, null, MediaTypeNames.Text.Html);
LinkedResource recursoLinkado = new LinkedResource(“fotoSalva.jpg”, MediaTypeNames.Image.Jpeg);
recursoLinkado.ContentId = “Foto”;
visualizacaoHtml.LinkedResources.Add(recursoLinkado);
Enviando o e-mail criado
Para enviar o e-mail criado você irá utilizar uma classe chamada SmtpClient que também esta no namespace System.Net.Mail. Você apenas precisa ter o endereço do seu servidor SMTP, o resto o .Net fará pra você.
SmtpClient clienteSmtp = new SmtpClient(“smtp.servidor.com”);
clienteSmtp.Send(m);
Para habilitar envio com ssl utilize a propriedade EnableSsl.
clienteSmtp.EnableSsl = true;
Para configurar o envio de e-mail utilizando as credenciais default habilite a propriedade UseDefaultCredentials.
clienteSmtp.UseDefaultCredentials = true;
Para definir uma nova credencial adicione o namespace “System.Net” e configure a propriedade Credentials com um objeto NetworkCredential.
clienteSmtp.Credentials = new NetworkCredential(“usuário”, “senha”);
Você também pode utilizar a credencial que esta no cache do usuário.
clienteSmtp.Credentials = CredentialCache.DefaultNetworkCredentials;
Para configurar um TimeOut para o envio de e-mail utilize a propriedade Timeout.
clienteSmtp.Timeout = 10;
Enviando o e-mail de modo assíncrono
Como o envio de e-mail geralmente é um processo lento, pode acontecer de sua aplicação ficar esperando o envio para poder continuar o processamento. Podemos evitar isso utilizando o envio assíncrono. Para utilizar o envio assíncrono, você precisa associar um método (que tenha os parâmetros object e AsyncCompletedEventArgs) ao evento SendCompleted e enviar o e-mail utilizando o método SendAsync.
clienteSmtp.SendCompleted +=new SendCompletedEventHandler(EnvioCompleto);
clienteSmtp.SendAsync(m);
static void EnvioCompleto(object sender, AsyncCompletedEventArgs e)
{ }
Para cancelar o envio de e-mail assíncrono basta chamar o método SendAsyncCancel
clienteSmtp.SendAsyncCancel;
É isso ai pessoal, espero que este artigo ajude vocês implementarem o envio de e-mail em suas aplicações.
Francisco Gonçalves
Excelente! Muito boa explicação, resolvi o problema de envio de e-mail com texto e imagens!