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?

  1. Rápido y sin necesidad de compilar

  2. Feedback inmediato

  3. Fácil de modificar parámetros

  4. 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

  1. 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>
    
    1. Manejo de Errores
  • Log detallado

  • Mensajes de error específicos

  • Reintentos en caso de fallo

  1. Seguridad
  • No hardcodear credenciales

  • Usar SSL cuando sea posible

  • Sanitizar entradas HTML

Herramientas Útiles

  1. Telnet para pruebas básicas:

     telnet your.smtp.server 25
    
  2. 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

0
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

Hubert Garcia Gordon
Hubert Garcia Gordon