Pruebas de Envío de Correos SMTP: De PowerShell a C#
Introducción
Cuando desarrollamos aplicaciones que involucran envío de correos electrónicos, es crucial probar la configuración SMTP antes de subir a producción. En este artículo, te mostraré cómo usar PowerShell para validar tu configuración SMTP y luego implementarla en C#.
¿Por qué Probar Primero en PowerShell?
Rápido y sin necesidad de compilar
Feedback inmediato
Fácil de modificar parámetros
Diagnóstico detallado
Paso 1: Verificar Conectividad Básica
Antes de intentar enviar correos, verifica la conectividad básica con el servidor SMTP:
Test-NetConnection -ComputerName "your.smtp.server" -Port 25
Si obtienes TcpTestSucceeded : True
, significa que el servidor es accesible.
Paso 2: Script PowerShell para Pruebas
# Configuración
$EmailFrom = "sender@yourdomain.com"
$EmailTo = "recipient@yourdomain.com"
$Subject = "SMTP Test Email"
$Body = @"
<p>This is a test email.</p>
<p>Testing SMTP configuration.</p>
"@
$SMTPServer = "your.smtp.server"
$SMTPPort = "25"
$Username = "your_username"
$Password = "your_password"
# Crear credenciales
$secpasswd = ConvertTo-SecureString $Password -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($Username, $secpasswd)
# Probar conexión
Write-Host "Testing SMTP connection..." -ForegroundColor Yellow
$testConnection = Test-NetConnection -ComputerName $SMTPServer -Port $SMTPPort
if ($testConnection.TcpTestSucceeded) {
Write-Host "TCP Connection successful!" -ForegroundColor Green
try {
Write-Host "`nSending email..." -ForegroundColor Yellow
Send-MailMessage -From $EmailFrom `
-To $EmailTo `
-Subject $Subject `
-Body $Body `
-BodyAsHtml `
-SmtpServer $SMTPServer `
-Port $SMTPPort `
-Credential $mycreds `
-Verbose
Write-Host "`nEmail sent successfully!" -ForegroundColor Green
}
catch {
Write-Host "`nError sending email:" -ForegroundColor Red
Write-Host $_.Exception.Message -ForegroundColor Red
}
}
else {
Write-Host "Could not connect to SMTP server" -ForegroundColor Red
}
Paso 3: Implementación en C
Una vez que la prueba en PowerShell es exitosa, aquí está cómo implementarlo en C#:
public async Task SendEmailAsync(string to, string subject, string body)
{
try
{
using (var message = new MailMessage())
{
// Configuración del mensaje
message.From = new MailAddress("sender@yourdomain.com", "Sender Name");
message.To.Add(new MailAddress(to.Trim()));
message.Subject = subject;
message.Body = body;
message.IsBodyHtml = true;
// Configuración del cliente SMTP
using (var smtp = new SmtpClient())
{
smtp.Host = "your.smtp.server";
smtp.Port = 25;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential("your_username", "your_password");
// Log antes de enviar
Logger.Info($"Attempting to send email to {to}");
try
{
await smtp.SendMailAsync(message);
Logger.Info($"Email sent successfully to {to}");
}
catch (SmtpException smtpEx)
{
Logger.Error($"SMTP Error: {smtpEx.StatusCode} - {smtpEx.Message}");
throw;
}
}
}
}
catch (Exception ex)
{
Logger.Error($"General error sending email to {to}: {ex.Message}");
throw;
}
}
Problemas Comunes y Soluciones
1. Errores de Relay
Si recibes "Unable to relay", verifica:
Autenticación correcta
Permisos del servidor SMTP
IP en lista blanca
2. Problemas de SSL/TLS
Para habilitar SSL:
# PowerShell
Send-MailMessage -UseSsl -Port 587 ...
# C#
smtp.EnableSsl = true;
smtp.Port = 587;
3. Correos no Recibidos
Verifica:
Carpeta de spam
Filtros de correo
Logs del servidor SMTP
Políticas de seguridad
Mejores Prácticas
Configuración en Archivo
<!-- Web.config --> <system.net> <mailSettings> <smtp> <network host="your.smtp.server" port="25" userName="your_username" password="your_password" /> </smtp> </mailSettings> </system.net>
- Manejo de Errores
Log detallado
Mensajes de error específicos
Reintentos en caso de fallo
- Seguridad
No hardcodear credenciales
Usar SSL cuando sea posible
Sanitizar entradas HTML
Herramientas Útiles
Telnet para pruebas básicas:
telnet your.smtp.server 25
MailKit como alternativa moderna a System.Net.Mail
using MailKit.Net.Smtp; using MimeKit;
Conclusión
Probar la configuración SMTP con PowerShell antes de implementarla en C# puede ahorrarte mucho tiempo de debugging. Utiliza este enfoque para validar rápidamente tu configuración y luego implementa la solución probada en tu aplicación.
Recursos Adicionales
Subscribe to my newsletter
Read articles from Hubert Garcia Gordon directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by