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

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)





