Envio de email em C# (.NET): do SmtpClient ao MailKit
O envio de emails é uma das tarefas essenciais no desenvolvimento de aplicações web, serviços de notificação e sistemas corporativos. No ecossistema .NET, existem tanto ferramentas nativas quanto bibliotecas de terceiros que simplificam o trabalho com SMTP, SSL/TLS e cenários complexos. Neste artigo, abordaremos detalhadamente como enviar email em C#, usando o clássico SmtpClient e a biblioteca moderna MailKit.
1. SmtpClient nativo (System.Net.Mail)
A classe SmtpClient está disponível no .NET Framework e no .NET Core/5+ (com algumas limitações). Ela permite configurar rapidamente o envio de email através de qualquer servidor SMTP.
Exemplo básico de envio de email
using System.Net;using System.Net.Mail;
var smtpClient = new SmtpClient("smtp.gmail.com"){ Port = 587, Credentials = new NetworkCredential("your_email@gmail.com", "your_app_password"), EnableSsl = true};
var mailMessage = new MailMessage{ From = new MailAddress("your_email@gmail.com"), Subject = "Email de teste do C#", Body = "Olá! Esta mensagem foi enviada via SmtpClient.", IsBodyHtml = false};
mailMessage.To.Add("recipient@example.com");
try{ smtpClient.Send(mailMessage); Console.WriteLine("Email enviado com sucesso!");}catch (Exception ex){ Console.WriteLine($"Erro ao enviar: {ex.Message}");}Importante: Para o Gmail, será necessária uma senha de aplicativo, e não a senha comum. Para outros serviços (Yandex, Mail.ru), verifique as configurações de SMTP.
Envio de email HTML com anexo
var message = new MailMessage();message.From = new MailAddress("sender@example.com");message.To.Add("user@example.com");message.Subject = "Relatório mensal";message.IsBodyHtml = true;message.Body = "<h2>Relatório mensal</h2><p>O arquivo PDF está em anexo.</p>";
// Adicionando anexovar attachment = new Attachment(@"C:\\Reports\\report.pdf");message.Attachments.Add(attachment);
using (var client = new SmtpClient("smtp.example.com", 587)){ client.Credentials = new NetworkCredential("login", "password"); client.EnableSsl = true; client.Send(message);}Os anexos podem ser de qualquer tipo: imagens, documentos, arquivos compactados. Para enviar a partir da memória, use MemoryStream.
2. Envio assíncrono
Em aplicações modernas, é recomendável não bloquear a thread. Use SendMailAsync:
public async Task SendEmailAsync(){ using var client = new SmtpClient("smtp.example.com", 587); client.Credentials = new NetworkCredential("login", "password"); client.EnableSsl = true;
var message = new MailMessage("from@example.com", "to@example.com") { Subject = "Envio assíncrono", Body = "Este email foi enviado de forma assíncrona." };
await client.SendMailAsync(message); Console.WriteLine("Enviado de forma assíncrona!");}3. Problemas do SmtpClient e alternativas
Apesar da simplicidade, o SmtpClient possui desvantagens:
- API obsoleta (no .NET 5+ está marcado como obsoleto);
- Suporte fraco a protocolos modernos de autenticação (OAuth2);
- Falta de suporte nativo para S/MIME e cenários avançados.
Por isso, a Microsoft recomenda o uso de bibliotecas de terceiros, como o MailKit.
4. MailKit — biblioteca moderna para trabalhar com email
MailKit é uma biblioteca multiplataforma de código aberto. Ela suporta SMTP, POP3, IMAP, SSL/TLS, assincronismo, OAuth2 e muito mais.
Instalação via NuGet
\Também na biblioteca
Cliente HTTP para Java: visão geral das principais bibliotecas (Java 11, Apache, OkHttp, Retrofit)
EventKit para Swift: guia completo com exemplos práticos