Cómo enviar un correo electrónico usando Windows PowerShell

Windows PowerShell es mayormente conocido como un shell de línea de comandos utilizado para resolver algunas tareas de administración en Windows y en las apps que se ejecutan en este sistema operativo. Al mismo tiempo, es un lenguaje de scripting que permite confeccionar cmdlets -comandos ligeros para realizar funciones específicas-. Y hoy, hablaremos de Send-MailMessage, un cmdlet para enviar correos electrónicos desde PowerShell, así como de otras formas de manejarlo.

El script más sencillo para enviar un correo electrónico con PowerShell

Empecemos por lo más sencillo. Aquí tienes un script de una línea basado en el cmdlet Send-MailMessage que puedes utilizar ahora mismo para enviar un correo electrónico desde PowerShell utilizando el protocolo SMTP.

Send-MailMessage -To "<recipient’s email address>” -From "<sender’s email address>” -Subject "Your message subject” -Body "Some important plain text!” -Credential (Get-Credential) -SmtpServer "<smtp server>” -Port 587

Todo lo que necesitas es insertar la dirección de correo electrónico de un remitente y un destinatario, así como especificar el servidor SMTP que vas a utilizar. A continuación, copia y pega este script en tu PowerShell y pulsa enter.

<

Mailtrap nos ayudará a comprobar si funciona. Regístrate y ve a tu bandeja de entrada de la Demo. Busca las credenciales SMTP y retoca el script así:

Send-MailMessage -To "[email protected]” -From "[email protected]” -Subject "Hey, Jon” -Body "Some important plain text!” -Credential (Get-Credential) -SmtpServer "smtp.mailtrap.io” -Port 587

Aquí sólo hemos especificado el host SMTP. Las direcciones del destinatario y del remitente no son reales, como habrás adivinado. Y esa es una de las ventajas de usar un servidor SMTP falso. No tienes que lidiar con el correo electrónico real para probar el flujo de trabajo del correo electrónico. También puede utilizar un correo electrónico ficticio, pero puede ser una mala práctica de prueba. Aprenda por qué en nuestra publicación del blog Por qué el uso de correo electrónico ficticio para las pruebas simplemente no funciona.

Pruebe Mailtrap gratis

Una vez que copie y pegue este script en PowerShell y pulse enter, aparecerá una ventana solicitando las credenciales SMTP (nombre de usuario y contraseña). Rellénalas con las de Mailtrap y listo. Revisa tu bandeja de entrada de la Demo y encuentra tu mensaje.

¿Puedo enviar un email HTML o un email con adjuntos desde PowerShell a múltiples destinatarios?

¡Sí puedes! Send-MailMessage te permite inflar tu correo electrónico con los numerosos parámetros que incluyen el contenido HTML, la prioridad, etc. Además, puedes enviar emails a múltiples destinatarios especificándolos en el parámetro correspondiente. Esto es lo que puedes aprovechar:

Dirección de correo electrónico de un CCO destinatario o destinatarios

.

Parámetro Descripción
-To Dirección de correo electrónico de un destinatario o destinatarios
-Bcc
-Cc Dirección de correo electrónico de un destinatario o destinatarios CC
-From Dirección de correo electrónico del remitente
-Subject Asunto del correo electrónico
-Body Texto del cuerpo del correo electrónico
-BodyAsHtml Define que el texto del cuerpo del correo electrónico contiene HTML
-Attachments Nombres de los archivos a adjuntar y la ruta de acceso a los mismos
-Credential Autenticación para enviar el correo electrónico desde la cuenta
-SmtpServer Nombre del servidor SMTP
-Port Puerto del servidor SMTP
-DeliveryNotificationOption Se notificará al remitente o remitentes especificados en el parámetro Formulario sobre la entrega del correo electrónico. Aquí están las opciones:

  • None – las notificaciones están desactivadas (parámetro por defecto)
  • OnSuccess – notificación de una
  • OnFailure – notificación de una entrega fallida
  • Delay – notificación de una entrega retrasada
  • Never – no recibir nunca notificaciones
  • -Encoding La codificación para el cuerpo y el asunto
    -Priority Define el nivel de prioridad del mensaje. Las opciones válidas son:

  • Normal (parámetro por defecto)
  • Low
  • High
  • -UseSsl La conexión con el servidor SMTP se establecerá utilizando el protocolo Secure Sockets Layer (SSL)

    Entonces, vamos a hacer un script que envíe un correo electrónico que contenga texto HTML y un archivo adjunto. Esta vez, definiremos los parámetros de antemano y luego haremos referencia a ellos en el cmdlet Send-MailMessage:

    $From = "[email protected]"$To = "[email protected]", "[email protected]”$Cc = "[email protected]"$Attachment = "C:\Temp\Drogon.jpg"$Subject = "Photos of Drogon"$Body = "<h2>Guys, look at these pics of Drogon!</h2><br><br>"$Body += "He is so cute!” $SMTPServer = "smtp.mailtrap.io"$SMTPPort = "587"Send-MailMessage -From $From -to $To -Cc $Cc -Subject $Subject -Body $Body -BodyAsHtml -SmtpServer $SMTPServer -Port $SMTPPort -UseSsl -Credential (Get-Credential) -Attachments $Attachment

    Como has podido comprobar, hemos utilizado $Body += para añadir una nueva línea al cuerpo del texto del mensaje. Y así es como se ve el email en la bandeja de entrada de Mailtrap.

    Empieza a probar tus emails PowerShell gratis.

    Envía un email desde PowerShell usando el servidor SMTP de Gmail

    Todo es genial cuando usas un servidor SMTP falso para hacer pruebas. Pero qué pasa si enviamos un mensaje a través de uno real como el de Gmail. En este caso, añade smtp.gmail.com como host SMTP y utiliza direcciones de correo electrónico reales para un remitente (tu dirección de Gmail) y un destinatario.

    Hicimos un intento y rellenamos las credenciales en la ventana emergente. Pero el servidor respondió con un error – 551 Authentication Required. Para solucionar este problema, debes activar el acceso menos seguro a las aplicaciones en la pestaña Seguridad de tu cuenta de Google. Lo hemos hecho, y PowerShell ha entregado con éxito nuestro mensaje al destino. Descubre más sobre los códigos de respuesta y comandos SMTP en nuestra entrada de blog dedicada.

    Configuración SMTP para proveedores de correo electrónico populares

    No todo el mundo es usuario de Gmail. Por eso, los siguientes datos pueden ser de utilidad si utilizas otro host SMTP.

    587
    25

    Servicio Servidor SMTP Puerto Conexión
    Gmail smtp.gmail.com 587
    25
    465
    TLS
    TLS
    SSL
    Office 365 smtp.office365.com 587
    25
    TLS
    Outlook.com smtp-mail.outlook.com TLS
    Yahoo mail smtp.mail.yahoo.com 587
    25
    465
    TLS
    TLS
    SSL
    Windows Live Hotmail smtp.live.com 587
    25
    TLS
    Zoho smtp.zoho.com 587
    465
    TLS
    SSL

    Enviar correos electrónicos desde PowerShell usando EASendMail

    EASendMail es un componente SMTP que soporta protocolos como SMTP, ESMTP (SMTP extendido), EWS (Exchange Web Service) y WebDAV (Web Distributed Authoring and Versioning). El componente se utiliza sobre todo para enviar correos electrónicos en aplicaciones de entorno COM/.NET/.NET Core y en aplicaciones construidas con:

    • ASP
    • VB
    • VBA
    • VC++
    • C++/CLI
    • C#
    • VB.NET
    • JavaScript
    • ASP.NET
    • Delphi
    • También puedes utilizar EASendMail para enviar correos electrónicos desde PowerShell. Sólo Dios sabe por qué puedes necesitarlo pero aquí tienes una guía para ello:

      • Paso 1: Instalar EASendMail usando el instalador
      • Paso 2: Crear el siguiente script
    ::LoadFile("C:\Program Files (x86)\EASendMail\Lib\net20\EASendMail.dll")#change the path to the EASendMail.dll file if you have another build of run-time assembly for .NET Framework, .NET Core, or .NET Compact Frameworkfunction SendMailTo($sender, $name, $address, $subject, $body, $htmlFormat) { $mail = New-Object EASendMail.SmtpMail("TryIt") # you can replace "TryIt” with your license code for EASendMail SMTP component $mail.From.Address = $sender $recipient = New-Object EASendMail.MailAddress($name, $address) $mail.To.Add($recipient) > $null $mail.Subject = $subject if($htmlFormat) { $mail.HtmlBody = $body } else { $mail.TextBody = $body } $server = New-Object EASendMail.SmtpServer("smtp.mailtrap.io") $server.User = "*********" $server.Password = "*********" $server.Port = 587 $server.ConnectType = ::ConnectTryTLS# specify your settings of the SMTP server, username, password, port, and connection type $smtp = New-Object EASendMail.SmtpClient $smtp.SendMail($server, $mail)}function SendMailFromPowerShell () { $sender = "[email protected]" $name = "Jon Snow" $address = "[email protected]" $subject = "Happy Samhain" $body = "Jonny, congrats on Samhain!"# specify your settings of sender’s email address and name, recipient’s email address, as well as subject and body text of the message try { "Start to send email to {0} ..." -f $address SendMailTo $sender $name $address $subject $body "" "Email to {0} has been submitted to server!" -f $address } catch { "Failed to send email: {0}" -f $_.Exception.Message }}SendMailFromPowerShell
    • Paso 3: Ejecutar el script y comprobar la bandeja de entrada de Mailtrap Demo. Aquí está el mensaje.

    Comienza a probar

    Envío masivo desde PowerShell utilizando la cola de servicio de EASendMail

    El componente SMTP EASendMail es útil para el envío de correos masivos. Para ello, no tienes que codificar múltiples hilos. Todo lo que necesitas es EASendMail Service que puede enviar mensajes con múltiples hilos automáticamente en la cola de fondo. Echa un vistazo al siguiente script para el envío masivo de un mensaje con una plantilla HTML:

    ::LoadFile("C:\Program Files (x86)\EASendMail\Lib\net20\EASendMail.dll")#change the path to the EASendMail.dll file if you have another build of run-time assembly for .NET Framework, .NET Core, or .NET Compact Frameworkfunction SendMailToQueue($sender, $name, $address, $subject, $body, $htmlFormat) { $mail = New-Object EASendMail.SmtpMail("TryIt") $mail.From.Address = $sender $recipient = New-Object EASendMail.MailAddress($name, $address) $mail.To.Add($recipient) > $null $mail.Subject = $subject if($htmlFormat) { $mail.HtmlBody = $body } else { $mail.TextBody = $body } $server = New-Object EASendMail.SmtpServer("smtp.mailtrap.io") $server.User = "*********" $server.Password = "*********" $server.Port = 587 $server.ConnectType = ::ConnectTryTLS# specify your settings of the SMTP server, username, password, port, and connection type $smtp = New-Object EASendMail.SmtpClient $smtp.SendMailToQueue($server, $mail)}function OpenConnection () { $connectionString = "Server=localhost\AdminSystem;Database=test;Integrated security=SSPI;MultipleActiveResultSets=True;" Write-Host(("Connecting database {0} ..." -f $connectionString)) $sqlConnection = New-Object System.Data.SqlClient.SqlConnection $sqlConnection.ConnectionString = $connectionString# You can change the connection string to yours by specifying user and password: $connectionString = "Server=localhost\AdminSystem;Database=dbname;User Id=user;Password=yourpassword;MultipleActiveResultSets=True;" $sqlConnection.Open() Write-Host 'Connected' return $sqlConnection}function BuildHtmlBody ($sqlConnection) { Write-Host "Building HTML body based on database ..." $sqlQuery = "SELECT ID, Name, Email, Age, Department FROM users" $sqlCommand = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $sqlConnection); $reader = $sqlCommand.ExecuteReader() $html = "<!DOCTYPE html><html><body>" $html += "<div style=""font-family:'Segoe UI', Calibri, Arial, Helvetica; font-size: 14px; max-width: 768px;"">" $html += "Dear {name}, <br /><br />This is a congrats email on Samhain. <br />" $html += "Here is full data in table:<br /><br />" $html +="<table style='border-spacing: 0px; border-style: solid; border-color: #ccc; border-width: 0 0 1px 1px;'>" while ($reader.Read()) { $name = $reader.GetString(1) $address = $reader.GetString(2) $age = $reader.GetInt32(3) $department = $reader.GetString(4) $html += "<tr>" $html += "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>{0}</td>" -f $name $html += "<td style='padding: 10px; border-style: solid; border-color: #ccc; border-width: 1px 1px 0 0;'>{0}</td>" -f $address $html += "</tr>" } $reader.Close > $null $reader.Dispose > $null $sqlCommand.Close > $null $sqlCommand.Dispose > $null return $html}function SendMailFromDBToQueue () { $sender = "[email protected]" $subject = "Happy Samhain" $sqlConnection = OpenConnection $bodyTemplate = BuildHtmlBody($sqlConnection)$sqlQuery = "SELECT ID, Name, Email, Age, Department FROM users" $sqlCommand = New-Object System.Data.SqlClient.SqlCommand($sqlQuery, $sqlConnection); $reader = $sqlCommand.ExecuteReader() while ($reader.Read()) { $name = $reader.GetString(1).Trim() $address = $reader.GetString(2).Trim() $body = $bodyTemplate.Replace("{name}", $name) Write-Host(("Start to send email to {0} ..." -f $address)) SendMailToQueue $sender $name $address $subject $body "html" Write-Host(("Email to {0} has been submitted to easendmail service!" -f $address)) } $reader.Close > $null $reader.Dispose > $null $sqlCommand.Close > $null $sqlCommand.Dispose > $null $sqlConnection.Close > $null $sqlConnection.Dispose > $null } catch { "Failed to send email: {0}" -f $_.Exception.Message }}SendMailFromDBToQueue

    Enviar correos electrónicos desde PowerShell usando System.Net.Mail API

    El cmdlet Send-MailMessage es la opción más común para enviar correos electrónicos desde PowerShell. Pero esto no siempre fue así. Estuvo disponible a partir de PowerShell 3.0 y se basó en la API System.Net.Mail. Es un espacio de nombres que contiene clases para enviar mensajes electrónicos al servidor SMTP. El envío se realiza mediante el método SmtpClient.Send o .Send. Veamos el siguiente ejemplo:

    $EmailFrom = "[email protected]”$EmailTo = "[email protected]”$Subject = "Happy Samhain”$Body = "Jonny, congrats on Samhain!”$SMTPServer = "smtp.mailtrap.io”$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)$SMTPClient.EnableSsl = $true$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("<username>", "<password>");$SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)

    Comprueba la bandeja de entrada de la Demo de Mailtrap y voilá: ya está. Alternativamente, puedes utilizar el método .Send y una sintaxis modificada como esta:

    $smtpFrom = "[email protected]”$smtpTo = "[email protected]”$messageSubject = "Happy Samhain”$messageBody = "Jonny, congrats on Samhain!”$smtpServer = "smtp.mailtrap.io”$smtp = New-Object Net.Mail.SmtpClient($SmtpServer, 587)$smtp.EnableSsl = $true$smtp.Credentials = New-Object System.Net.NetworkCredential("94b784b5970edf", "01a5d515011f6e");$smtp.Send($smtpFrom , $smtpTo, $messageSubject, $messageBody)

    Aprende cómo puede ayudarte exactamente Mailtrap a agilizar los procesos de pruebas de correo electrónico desde nuestro caso de estudio con The Software House.

    Para terminar

    El espacio de nombres System.Net.Mail también se utiliza para crear y enviar mensajes en ASP.NET C# del que también hemos hablado en el blog. Y eso es todo por hoy. Esperamos que esta entrada del blog haya ampliado tus conocimientos en el uso de PowerShell. Sigue nuestro blog y descubre conocimientos útiles para tus proyectos.

    Si te ha gustado este artículo, por favor, compártelo y difúndelo. Te lo agradeceremos mucho.

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *