Para este cmdlet PowerShell del día, estamos cubriendo el cmdlet PowerShell Send-MailMessage. Este cmdlet de PowerShell sirve para un propósito y un solo propósito; para enviar correo electrónico en un montón de maneras diferentes.
Dado que hay tantas maneras el cmdlet Send-MailMessage puede enviar mensajes de correo electrónico, vamos a sumergirse en y empezar a cubrir todos los ejemplos comunes que puede ejecutar en. En este artículo, vamos a cubrir muchos ejemplos que van desde el más simple todo el camino hasta algunos escenarios que no deseo a nadie!
Este post será un gran recurso para marcar en caso de que alguna vez se encuentre con instancias en las que necesita enviar correo electrónico con PowerShell y olvidar la sintaxis.
El servidor SMTP
Todo correo electrónico tiene que pasar por un servidor SMTP en algún lugar a través de un servidor y un puerto. Para especificar un el servidor SMTP a utilizar, utilice un parámetro llamado SMTPServer
que le permite especificar el servidor SMTP para establecer una conexión y retransmitir el correo a través. Sin embargo, no es obligatorio.
Si no especifica un valor para el parámetro SMTPServer
, se utilizará el valor almacenado en la variable de preferencia $PSEmailServer
. Puede asignar un valor a esta variable como lo haría con cualquier otra variable.
PS51> $PSEmailServer = 'smtp.server.local'
Sin embargo, esta variable no vive a través de las sesiones de PowerShell. Esto significa que debe definirla cada vez que se abre una nueva sesión de PowerShell. Por esta razón, recomiendo o bien utilizarlo definiéndolo por encima de su referencia Send-MailMessage
o no definirlo todo. En su lugar, yo personalmente proporcionaría el valor del parámetro SMTPServer
. De esta manera no tienes que manejar una variable externa que podría cambiar sobre ti.
PS51> Send-MailMessage -SmtpServer 'smtp.server.local'
Puerto
Por defecto, el valor que el cmdlet intentará enviar un correo electrónico a través del servidor SMTP es el puerto 25. Se trata de un SMTP sencillo y sin cifrar. Sin embargo, hoy en día, es más común enviar correo electrónico encriptado usando SSL/TLS (Cubriremos estos escenarios más adelante).
Si necesitas cambiar el puerto de 25, puedes usar el parámetro Port
.
PS51> Send-MailMessage -SmtpServer 'smtp.server.local' -Port 587
Destinatarios y Originadores
Para enviar un correo electrónico a diferentes destinatarios a través de métodos como los campos Para, CC y CCO, el cmdlet tiene varios parámetros para acomodar esto.
Los parámetros To, Cc y Bcc en el cmdlet Send-Mailmessage
El cmdlet tiene tres parámetros, cada uno de los cuales admite múltiples destinatarios separados por una coma, llamados To
Cc
y Bcc
.
Puedes especificar direcciones individuales como las siguientes.
PS51> Send-MailMessage -To -Cc -Bcc -Subject 'this is a subject'
O puedes especificar múltiples destinatarios para cada valor del parámetro.
PS51> Send-MailMessage -To , -Cc , -Bcc , -Subject 'this is a subject'
El parámetro From
Cuando envíes un correo electrónico, también puedes especificar el parámetro From
que establecerá la cabecera de respuesta en el correo electrónico. Este parámetro sólo permite una dirección. En caso de que un destinatario decida responder al correo electrónico, esta será la dirección de correo electrónico a la que se responderá.
PS51> Send-MailMessage -From -To -Subject 'this is a subject'
Por defecto, el uso de una dirección de correo electrónico simplemente mostrará la dirección de correo electrónico en el campo FROM del destinatario. Sin embargo, si desea especificar un nombre o algún tipo de etiqueta como Buzón de cuenta de servicio, también puede especificar un nombre y un correo electrónico como:
Adam Bertram <>
Nota que se ha utilizado el parámetro
Subject
. Este parámetro es siempre necesario. Verás que este parámetro se utiliza en todos los ejemplos.
Cuerpo
El parámetro Body
te permite especificar qué habrá en el cuerpo del correo electrónico. En el más simple, puede especificar cualquier texto que le gustaría y el cmdlet lo enviará a través de texto plano.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'
Envío de correos electrónicos con cuerpo HTML
También puede enviar un cuerpo de correo electrónico a través de HTML en lugar de texto plano. Para ello, utiliza el mismo parámetro Body
que con el texto plano, pero utiliza HTML para la cadena y usa el parámetro de cambio BodyAsHtml
.
$body = @'<table style="width:100%"> <tr> <th>Firstname</th> <th>Lastname</th> <th>Age</th> </tr> <tr> <td>Jill</td> <td>Smith</td> <td>50</td> </tr> <tr> <td>Eve</td> <td>Jackson</td> <td>94</td> </tr></table>'@PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body $body -BodyAsHtml
Nota que en el ejemplo anterior, encerré la cadena del cuerpo en
@'
y'@
. Esto se llama una cadena de aquí. Esto le permite definir cadenas largas que se ven típicamente en los cuerpos de los correos electrónicos que contienen retornos de carro. Las cadenas here conservan el formato de las cadenas y es una gran manera de definir el cuerpo del correo electrónico, especialmente si está en HTML.
Codificación
Si tienes caracteres especiales en el asunto o el cuerpo de tu correo electrónico, puedes utilizar el parámetro Encoding
. Este parámetro le permite codificar el asunto y el cuerpo del correo electrónico mediante el tipo de codificación especificado antes de enviarlo.
Aquí tienes unas cuantas opciones:
- ASCII (por defecto)
- UTF8
- UTF7
- UTF32
- Unicode
- BigEndianUnicode
- Default
- OEM
.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Encoding UTF8
Adjuntos
El cmdlet también puede adjuntar uno o más archivos. Para ello, puede utilizar el parámetro Attachments
y proporcionar la ruta del archivo o archivos que desea adjuntar.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc'
También puede especificar varios archivos adjuntos a través de una colección separándolos con una coma.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Attachments 'C:\file.doc','D:\report.xlsx'
El parámetro Attachments
también permite canalizar archivos mediante cmdlets como Get-Item
y Get-ChildItem
al cmdlet Send-MailMessage
.
PS51> Get-ChildItem -Path 'C:\MyFiles' | Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body'
Correo electrónico seguro y autenticado
Por defecto, el cmdlet envía el correo electrónico a través de una comunicación SMTP no cifrada sobre el puerto 25. Sin embargo, también es compatible con el envío de correo electrónico cifrado a través de SSL/TLS con un nombre de usuario y una contraseña.
Si intenta retransmitir el correo electrónico a través de un servidor SMTP que requiere autenticación, el comando falla con un mensaje de error como el que aparece a continuación.
The SMTP server requires a secure connection or the client was notauthenticated. The server response was: 5.7.0 Must issue a STARTTLS command first.
Para remediar esto, primero debe especificar el puerto (normalmente 587 para TLS) y el parámetro UseSsl
. Esto le dice al cmdlet que intente conectarse al puerto 587 en el servidor SMTP y cifrar todo el mensaje. Normalmente (¿siempre?) también tendrás que especificar el nombre de usuario/contraseña para autentificarte en el servidor SMTP utilizando el parámetro Credential
.
PS51> $credential = Get-CredentialPS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -UseSsl -Port 587 -Credential $credential
Encima estoy cogiendo un objeto credencial (PSCredential) usando el cmdlet
Get-Credential
. Esto a veces plantea un problema porque es interactivo, lo que significa que detiene el script para pedir un nombre de usuario y una contraseña. Para evitar esto, podrías crear un objeto PSCredential sobre la marcha.
Un ejemplo de correo electrónico común es utilizar Gmail. Utilizando los conocimientos adquiridos anteriormente, ahora puedes enviar fácilmente correos electrónicos a través de Gmail utilizando el servidor SMTP smtp.gmail.com como se muestra a continuación.
$gmailCred = Get-Credential$sendMailParams = @{ From = '' ## Must be gmail.com To = '' Subject = 'some subject' Body = 'some body' SMTPServer = 'smtp.gmail.com' SMTPPort = 587 UseSsl = $true Credential = $gmailCred}Send-MailMessage @sendMailParams
Asignación de la prioridad del correo electrónico
Aunque es una característica del correo electrónico que personalmente desearía que muriera, puedes asignar niveles de prioridad a los correos electrónicos que envíes a través del parámetro Priority
. Esta prioridad es luego interpretada de varias maneras por el cliente de correo electrónico.
Enviar mensaje de correo electrónico permite asignar un correo electrónico con tres prioridades diferentes.
- Normal (por defecto)
- Alta
- Baja
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -Priority High
Pero por favor, por el amor de Dios, ¡no pienses que todos tus correos son de alta prioridad!
Notificaciones de entrega
Por último, puedes especificar notificaciones de entrega para los correos electrónicos. Las notificaciones de entrega son lo que normalmente se conoce como recibos de lectura en algunos clientes de correo electrónico. Las notificaciones de entrega le permiten ser notificado si/cuando el correo electrónico es recibido por el destinatario. Sin embargo, el destinatario aún debe permitirlo.
Tiene cuatro opciones al solicitar notificaciones de entrega.
- Ninguna (por defecto)
- OnSuccess (cuando el correo electrónico se entrega con éxito)
- OnFailure (notifica si la entrega no tiene éxito)
- Delay (cuando el correo electrónico se retrasa a través de un servidor SMTP)
Puede especificar una opción de notificación de entrega mediante el parámetro DeliveryNotificationOptions
.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess'
También puedes solicitar varias notificaciones de entrega a la vez separándolas con una coma.
PS51> Send-MailMessage -From -To -Subject 'this is a subject' -Body 'this is the body' -DeliveryNotificationsOptions 'OnSuccess','OnFailure','Delay'
Resumen
En este post, has aprendido todo sobre el cmdlet Send-mailmessage y lo que puede. Cubrimos este cmdlet ampliamente usando cada parámetro que tiene junto con ejemplos. ¡Espero que este post pueda servir como una referencia para usted cuando se utiliza el cmdlet Send-mailmessage.
Otras lecturas
Asegúrese de revisar algunos otros posts relacionados!
- Usando el
Get-ChildItem
cmdlet de PowerShell - Usando el
Set-Content
cmdlet de PowerShell - Usando el
Out-File
cmdlet de PowerShell
.