Send-MailMessage: envío de correos electrónicos desde PowerShell

Para enviar mensajes de correo electrónico a través de un servidor SMTP, puede utilizar el Enviar mensaje de correo Cmdlet de PowerShell. Puede usar este cmdlet integrado para enviar correos electrónicos en PowerShell versión 2.0 y posteriores (anteriormente, puede usar .Net System.Net.Mail clase para enviar correos electrónicos). En este artículo mostraremos cómo usar Send-MailMessage para enviar correos electrónicos desde scripts de PowerShell.

Para obtener la sintaxis del cmdlet, ejecute este comando:

get-help Send-MailMessage

Send-MailMessage [-To] <String[]> [-Subject] <String> [[-Body] <String>] [[-SmtpServer] <String>] [-Attachments <String[]>] [-Bcc <String[]>] [-BodyAsHtml] [-Cc <String[]>] [-Credential <PSCredential>] [-DeliveryNotificationOption {None | OnSuccess | OnFailure | Delay | Never}] [-Encoding <Encoding>] -From <String> [-Port <Int32>] [-Priority {Normal | Low | High}] [-UseSsl] [<CommonParameters>]
The Send-MailMessage cmdlet sends an email message from within Windows PowerShell.

Estas son las opciones principales:

  • De es una dirección de remitente (si el servidor SMTP no verifica la dirección del remitente y permite enviar correos electrónicos de forma anónima, no es necesario que proporcione una dirección smtp real. Puede enviar mensajes de correo electrónico en nombre de cualquier dirección de correo electrónico);
  • A – Dirección de Correo Electrónico del Destinatario;
  • Servidor SMTP –La dirección del servidor SMTP a través del cual desea enviar el correo electrónico.

Si configura la dirección del servidor de correo en el $PSEmailServer variable de entorno, no es necesario que especifique la dirección del servidor SMTP en el cmdlet Send-MailMessage.

El siguiente comando simple de PowerShell enviará un correo electrónico con el asunto y el cuerpo especificados a varios destinatarios.

Send-MailMessage -From 'ps-script@woshub.com' -To 'serveradmin@woshub.com','helpdesk@woshub.com' -Subject "Test Email Alert" -Body "This is email body text" –SmtpServer 'smtp.woshub.com'

Para facilitar la edición de los atributos de un cmdlet, el comando de envío de correo electrónico se puede representar de la siguiente manera:

Send-MailMessage `
-SmtpServer smtp.woshub.com `
-To 'serveradmin@woshub.com','helpdesk@woshub.com' `
-From 'ps-script@woshub.com' `
-Subject "Test" `
-Body "Sending email using PowerShell" `
-Encoding 'UTF8'

Tenga en cuenta que en el último comando configuramos adicionalmente la codificación UTF8 para el correo electrónico. De lo contrario, si el asunto o el cuerpo del correo electrónico contiene caracteres que no sean ANSI, se mostrarán incorrectamente.

De forma predeterminada, el cmdlet Send-MailMessage intenta enviar un correo electrónico a través del puerto SMTP estándar TCP 25. Si su servidor SMTP permite enviar correo electrónico solo mediante un protocolo cifrado, puede especificar el número de puerto (el más frecuente es 465 o 587 ) y el UseSsl opción:

-SmtpServer 'smtp.woshub.com' -Port 465 –UseSsl

La siguiente tabla muestra los parámetros del servidor SMTP de los proveedores de correo electrónico públicos populares que puede usar para enviar mensajes desde PowerShell (tenga en cuenta que deberá permitir el envío de correos electrónicos a través de SMTP en la interfaz de la cuenta):

Nombre Dirección del servidor SMTP Puerto Tipo de cifrado
Gmail smtp.gmail.com 587

25

465

TLS

TLS

SSL

Oficina 365 smtp.office365.com 587 TLS
Outlook.com smtp-mail.outlook.com 587 TLS
Yahoo smtp.mail.yahoo.com 587 TLS
correo de iCloud smtp.mail.me.com 587 TLS
AOL smtp.aol.com 465 SSL

Si el servidor SMTP prohíbe enviar correos electrónicos de forma anónima (la retransmisión está denegada), verá este error:

5.7.1 Client was not authenticated.

Luego puede autenticarse en el servidor SMTP usando el -Credencial opción.

Puede solicitar credenciales de usuario de forma interactiva para autenticarse:

Send-MailMessage …… -Credential (Get-Credential)

Además, puede especificar la cuenta que se utilizará para la autenticación en la variable:

$cred = Get-Credential
Send-MailMessage ... -Credential $cred

Si desea guardar una contraseña para conectarse al servidor SMTP directamente en el script de PowerShell, use esta sintaxis:

$mypasswd = ConvertTo-SecureString "smP@ssdw0rrd2" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("user1@woshub.com", $mypasswd)
Send-MailMessage ... –Credential $mycreds

Si desea agregar un archivo adjunto a su correo electrónico, use el –Attachments opción. En el siguiente ejemplo, enviaremos un correo electrónico en formato HTML y adjuntaremos file1.txt e install.log desde el disco local. Usaremos el servidor SMTP de Gmail (primero debe crear una contraseña de aplicación en Gmail y usarla para la autenticación smtp en lugar de su contraseña de Gmail):

$MailMessage = @{
To = "admin@woshub.com"
Bcc = "manager@woshub.com", "manager2@woshub.com"
From = "smtpsender1@gmail.com"
Subject = "DC Server Report"
Body = "<h1>Welcome!</h1> <p><strong>Generated:</strong> $(Get-Date -Format g)</p>”
Smtpserver = "smtp.gmail.com"
Port = 587
UseSsl = $true
BodyAsHtml = $true
Encoding = “UTF8”
Attachment = “C:Logsfile1.txt”, “C:Logsinstall.log”
}
Send-MailMessage @MailMessage -Credential $cred

Así es como se ve el correo electrónico en formato HTML con archivos adjuntos en la interfaz de Gmail.

un correo electrónico de prueba con un archivo adjunto generado con PowerShell en la interfaz de Gmail

Puede configurar una notificación de entrega (confirmación de lectura) para un correo electrónico utilizando -DeliveryNotificationOption. Una notificación de entrega le permite recibir una notificación si el destinatario recibe un correo electrónico.

Los tipos de notificación disponibles son:

  • OnSuccess (Notificar si la entrega es exitosa)
  • OnFailure (Notificar si la entrega no se realiza correctamente)
  • Demora (Notificar si la entrega se retrasa)

Deja un comentario

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