Envio de Email em C# (.NET): guia completo sobre System.Net.Mail
No desenvolvimento moderno na plataforma .NET, a tarefa de enviar e-mails é resolvida pela biblioteca padrão System.Net.Mail. Esta ferramenta integrada não requer a instalação de pacotes NuGet adicionais e fornece uma API flexível para criar e enviar mensagens de correio através de um servidor SMTP. Neste artigo, analisaremos detalhadamente todos os componentes principais da biblioteca, veremos exemplos de código, tratamento de erros e melhores práticas.
Classes principais da biblioteca
A biblioteca System.Net.Mail inclui três classes principais:
SmtpClient— responsável pela conexão ao servidor SMTP e envio de mensagens.MailMessage— representa o próprio e-mail: assunto, corpo, remetente, destinatários, anexos.Attachment— permite adicionar arquivos ao e-mail.
Exemplo básico de envio de Email
Vamos considerar o cenário mais simples: envio de um e-mail de texto através do servidor SMTP do Gmail. Observe que para trabalhar com o Gmail, será necessária uma senha de aplicativo (App Password) devido à autenticação de dois fatores.
using System;using System.Net;using System.Net.Mail;
class Program{ static void Main() { var fromAddress = new MailAddress("your@gmail.com", "Seu Nome"); var toAddress = new MailAddress("recipient@example.com", "Destinatário"); const string fromPassword = "sua_senha_de_aplicativo"; const string subject = "E-mail de teste do .NET"; const string body = "Olá! Este e-mail foi enviado usando C#.";
var smtp = new SmtpClient { Host = "smtp.gmail.com", Port = 587, EnableSsl = true, DeliveryMethod = SmtpDeliveryMethod.Network, UseDefaultCredentials = false, Credentials = new NetworkCredential(fromAddress.Address, fromPassword) };
using (var message = new MailMessage(fromAddress, toAddress) { Subject = subject, Body = body }) { smtp.Send(message); }
Console.WriteLine("E-mail enviado!"); }}Envio de e-mails HTML com anexos
Frequentemente, é necessário enviar um e-mail em formato HTML com arquivos anexados. Para isso, defina a propriedade IsBodyHtml = true e use a coleção Attachments.
using (var message = new MailMessage(fromAddress, toAddress)){ message.Subject = "Relatório do mês"; message.IsBodyHtml = true; message.Body = "<h2>Olá!</h2><p>Seu relatório está em anexo.</p>";
// Adiciona anexo var attachment = new Attachment(@"C:\\reports\\report.pdf"); message.Attachments.Add(attachment);
smtp.Send(message);}Envio assíncrono (async/await)
Para envio não bloqueante em aplicações modernas, use SendMailAsync. Isso é especialmente importante em aplicações web (ASP.NET Core) e programas desktop com interface de usuário.
public async Task SendEmailAsync(){ using (var message = new MailMessage(fromAddress, toAddress) { Subject = "Envio assíncrono", Body = "E-mail enviado de forma assíncrona" }) { await smtp.SendMailAsync(message); }}Tratamento de exceções
Ao trabalhar com servidores de correio, podem ocorrer erros: credenciais inválidas, timeouts, problemas com DNS. Sempre envolva o envio em um bloco try-catch.
try{ smtp.Send(message); Console.WriteLine("Enviado com sucesso.");}catch (SmtpException ex){ Console.WriteLine($"Erro SMTP: {ex.StatusCode} - {ex.Message}");}catch (Exception ex){ Console.WriteLine($"Erro geral: {ex.Message}");