Comparte este post:
La posibilidad de enviar emails usando PowerShell es una gran característica y puede ayudarnos enormemente si se implementa de la manera correcta. Así que os mostraré muchos ejemplos de cómo podéis enviar correos electrónicos usando PowerShell y cómo podéis seguir implementando esto en vuestras rutinas informáticas diarias.
Para enviar correos electrónicos usando PowerShell usaremos Send-MailMessage PowerShell CmdLet y necesitamos unos cuantos requisitos previos antes de empezar a usarlo que voy a maquetar aquí:
- Primero, necesitamos un servidor SMTP que nos proporcione un servicio de transmisión de nuestros correos electrónicos a los destinatarios.
- Segundo, obtendremos las credenciales SMTP (nombre de usuario y contraseña) de nuestro proveedor del servidor SMTP para autenticarnos en el servicio mientras transmitimos los correos electrónicos.
- Por último, después de aclarar el proveedor del servidor SMTP y las credenciales podemos empezar a usar Send-MailMessage PowerShell CmdLet con varios ejemplos que he preparado para ti.
Vamos a sumergirnos en varios ejemplos impresionantes para que podamos conocer las capacidades de envío de correos electrónicos usando PowerShell.
Tabla de contenidos
Enviar correo electrónico usando PowerShell – Ejemplo sencillo
Como ya hemos concluido PowerShell Send-MailMessage CmdLet nos ayudará a enviar correo electrónico desde PowerShell y aquí tenemos un ejemplo muy sencillo:
Send-MailMessage -To "recipient’s email address" -From "sender’s email address" -Subject "Your message subject" -Body "Message text!" -Credential (Get-Credential) -SmtpServer "SMTP server" -Port 587
IMPORTANTE: Los valores de todos los parámetros, excepto Puerto, deben ser sustituidos por los valores reales aplicables a su caso para que esta línea de código funcione.
En este sencillo ejemplo hemos utilizado sólo unos pocos parámetros necesarios de Send-MailMessage PowerShell CmdLet para enviar un simple correo electrónico al destinatario:
- -El valor del parámetro To es la dirección de correo electrónico del destinatario
- -El valor del parámetro From es la dirección de correo electrónico del remitente
- -El valor del parámetro Subject es el texto del asunto del correo electrónico
- -El valor del parámetro Body es el contenido del correo electrónico. Este es un contenido de texto simple y más adelante veremos cómo podemos enviar contenido HTML en el texto del cuerpo del correo electrónico.
- -El parámetroCredential es el nombre de usuario del servidor SMTP y las credenciales de la contraseña. Por favor, mira los siguientes subtemas de este artículo donde he explicado las formas de pasar las credenciales. Es muy importante, así que preste atención a eso.
- El valor del parámetro -SmtpServer es la dirección del servidor SMTP.
- El valor del parámetro -Port es el número de puerto que SMTP escucha para los mensajes de correo electrónico.
- la dirección del servidor SMTP («in-v3.mailjet.com»),
- un puerto que se utiliza (587),
- nombre de usuario, y
- contraseña para las credenciales SMTP.
- SmtpServer
- Credencial
NOTA: Si para el parámetro -From utiliza una dirección de correo electrónico del remitente que no está registrada como remitente en el servidor SMTP, podría recibir un correo electrónico del soporte del servidor SMTP para que intente enviar correos electrónicos desde una dirección de correo electrónico del remitente no registrada. Así que tienes que utilizar una dirección de correo electrónico registrada o registrar una dirección de correo electrónico del remitente adicional.
Aquí está el correo electrónico que he recibido utilizando mi dirección del servidor SMTP y las credenciales. Como podéis ver tenemos un ejemplo de envío de un email con archivo adjunto y vemos el texto del Asunto y parte del texto del cuerpo del email en la bandeja de entrada de Gmail.
En el cuerpo del correo electrónico, podemos ver el contenido del mensaje de correo electrónico enviado mediante PowerShell. Este es un ejemplo de envío de un correo electrónico usando PowerShell con el texto del Asunto, a través del Servidor SMTP MailJet, el texto del cuerpo es solo texto plano y con el archivo adjunto al correo electrónico.
Hay muchos más parámetros de Send-MailMessage CmdLet que veremos en los siguientes ejemplos un poco más abajo en este artículo.
Pero antes de sumergirnos en más ejemplos y matices del envío de correos electrónicos usando PowerShell vamos a aclarar los requisitos previos necesarios para el envío de los correos electrónicos y esos son el Servidor SMTP y las credenciales de autenticación del Servidor SMTP.
Qué servidor SMTP usar y cómo conseguir un servidor SMTP
Ahora te estarás preguntando, espera un momento, quiero enviar un correo electrónico usando PowerShell y por qué estamos hablando de un servidor SMTP.
Bueno, ¿recuerdas los viejos tiempos cuando enviábamos mensajes en sobres? Entregabas los sobres personalmente al destinatario? Por supuesto que no. Hay una alta probabilidad, al menos por decirlo, de que hayas utilizado algunos proveedores como Correos para hacerlo por ti.
Pues bien, el servidor SMTP es nuestro proveedor que enviará los correos que escribamos en PowerShell y los enviará a los destinatarios por nosotros.
INFO: SMTP significa (Simple Mail Transfer Protocol) y es un «lenguaje» o protocolo de comunicación acordado para que las aplicaciones en los servidores transmitan los correos electrónicos.
Si te preguntas qué Servidor SMTP usar por favor investiga ya que hay muchas empresas en internet que brindan dicho servicio y solo por nombrar algunas: Gmail, Hotmail, Yahoo, etc.
Para mis ejemplos y para probar el código he utilizado MailJet simplemente porque era fácil crear una cuenta y configurar todo.
Cuando he creado una cuenta con MailJet es posible ver la configuración SMTP:
Todas estas piezas de información son importantes cuando queremos enviar mensajes de correo electrónico utilizando Send-MailMessage PowerShell CmdLet así que asegúrese de que usted tiene antes de comenzar a utilizar PowerShell enviar función de correo electrónico.
Cómo enviar correo electrónico SMTP con autenticación utilizando PowerShell
Hay varias maneras de proporcionar credenciales SMTP mientras que el envío de correos electrónicos utilizando PowerShell. Vamos a mostrar dos enfoques diferentes.
El primero es más sencillo pero menos seguro ya que la contraseña del servidor SMTP es visible para el resto de personas que tengan acceso al código fuente.
El segundo tiene un paso adicional pero es más seguro ya que nos permite mantener la contraseña asegurada y encriptada en un archivo externo que podemos utilizar al proporcionar las credenciales SMTP.
Envío de credenciales SMTP con una contraseña visible en el código fuente (menos seguro)
En este ejemplo, proporcionamos varios parámetros a Send-MailMessage CmdLet pero los más importantes para explicar este ejemplo son:
NOTA: Para que este ejemplo te funcione sustituye los valores de estas variables por tus propios datos: $EmailFrom, $EmailTo, $SMTPserver, $username.
$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com." $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$username="your_user_name" $password = "your_password" | ConvertTo-SecureString -AsPlainText -Force$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl
El valor del parámetro SMTPServer tiene una dirección del Servidor SMTP, por ejemplo, el Servidor SMTP de MailJet es «in-v3.mailjet.com».
El parámetro Credential envuelve las credenciales de usuario y contraseña del Servidor SMTP y necesita ser pasado como un objeto PSCredential. Debemos prestar especial atención al pasar una contraseña a la creación de un objeto PSCredential ya que una contraseña no puede ser de texto plano sino de tipo de datos SecureString. Así que tenemos que convertir nuestra contraseña en texto plano en tipo de datos SecureString utilizando ConvertTo-SecureString CmdLet.
$password = "your_password" | ConvertTo-SecureString -AsPlainText -Force
Como ya se ha mencionado este método no es demasiado complicado pero tiene problemas de seguridad ya que mantenemos nuestra contraseña del servidor SMTP como texto plano en nuestro código fuente lo cual no es la mejor práctica.
Por último, aquí está el resultado y el correo electrónico recibido usando este ejemplo:
Envío de credenciales SMTP con contraseña oculta en código fuente (más seguro)
En este ejemplo, proporcionaremos las credenciales SMTP mientras llamamos a Send-MailMessage CmdLet pero esta vez la contraseña no será visible. Sin embargo, este método requiere un paso adicional por nuestra parte para que funcione.
Primero cifraremos nuestra contraseña en un archivo txt externo una sola vez y utilizaremos ese archivo para descifrar y leer nuestra contraseña siempre que lo necesitemos en nuestro código fuente.
Cuando ejecutemos este código se nos pedirá que proporcionemos la credencial de contraseña del servidor SMTP. Al hacer clic en el botón OK (como se puede ver en la captura de pantalla) la contraseña cifrada se guardará en un archivo externo (En este ejemplo que es el archivo MailJet.txt).
Read-Host -AsSecureString | ConvertFrom-SecureString | Out-File -FilePath "C:\Users\dekib\Documents\PSCredential\MailJet.txt"
Ahora nuestra contraseña está encriptada y guardada en un archivo externo para que podamos usarla al llamar a Send-MailMessage CmdLet.
Aquí hay un ejemplo que nos muestra cómo usar la contraseña encriptada en un archivo txt externo.
NOTA: Para que este ejemplo te funcione sustituye los valores de estas variables por tus propios datos: $EmailFrom, $EmailTo, $SMTPserver, $username.
$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com." $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl
Ahora que hemos aclarado las formas de pasar las credenciales SMTP al CmdLet Send-MailMessage podemos centrarnos en diferentes ejemplos.
Cómo enviar archivo(s) adjunto(s) con el correo electrónico usando PowerShell
A veces es muy conveniente acompañar el correo electrónico con algunos archivos adjuntos que nos den información adicional. Aunque ya hemos utilizado ejemplos de envío de correos electrónicos con adjuntos usando PowerShell veamos un ejemplo dedicado. Estamos utilizando el parámetro -Attachments del CmdLet Send-MailMessage para terminar el trabajo:
NOTA: Para que este ejemplo te funcione sustituye los valores de estas variables por tus propios datos: $EmailFrom, $EmailTo, $SMTPserver, $username.
$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. (Multiple recipients example)" $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to $EmailTo -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl
Si queremos enviar varios archivos adjuntos en el mismo email podemos hacerlo fácilmente ya que el parámetro -Attachments del CmdLet Send-MailMessage acepta un array de cadenas como valores de entrada. Sin embargo, hay que tener cuidado con la forma de pasar el array de cadenas para no sorprenderse con resultados inesperados.
Esta es la forma correcta de pasar dos adjuntos
$Attachments = "$home\Documents\PSlogs\Error_Log.txt", "$home\Documents\PSReports\Excel_report.xls"
y esta otra también:
$Attachments = @("$home\Documents\PSlogs\Error_Log.txt", "$home\Documents\PSReports\Excel_report.xls")
pero esta es incorrecta. Así que presta atención a eso.
$Attachments = "$home\Documents\PSlogs\Error_Log.txt, $home\Documents\PSReports\Excel_report.xls"
Cómo enviar un correo electrónico a varios destinatarios usando PowerShell
Si queremos enviar correos electrónicos usando PowerShell a varios destinatarios, tenemos la comodidad del parámetro -To que acepta un array de cadenas en Send-MailMessage CmdLet. Es importante prestar atención a cómo añadimos varias direcciones de correo electrónico como un array de cadenas y no una sola cadena con valores separados por comas. Al final de este subtema, di varios ejemplos de las formas correctas e incorrectas de pasar múltiples destinatarios.
Aquí tienes un ejemplo de envío de correo electrónico a múltiples destinatarios usando PowerShell :
NOTA: Para que este ejemplo te funcione por favor reemplaza los valores de estas variables por tus propios datos: $EmailFrom, $ToRecipients, $SMTPserver, $username.
$EmailFrom = "sender’s email address" $ToRecipients = "recipient’s email address 1", "recipient’s email address 2", "recipient’s email address 3" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. (Multiple recipients example)" $EmailBody = "This email has an attachment error log." $SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to $ToRecipients -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl
Nota la diferencia entre el paso correcto de las direcciones de correo electrónico de los destinatarios como un array de cadenas:
$ToRecipients = "recipient’s email address 1", "recipient’s email address 2", "recipient’s email address 3"
y el paso incorrecto como una sola cadena (las direcciones de correo electrónico son valores separados por comas pero dentro de una sola cadena) en lugar de un array de cadenas.
$ToRecipients = "recipient’s email address 1, recipient’s email address 2, recipient’s email address 3"
Además de enviar correos electrónicos a múltiples destinatarios, solemos tener las funciones de correo electrónico de enviar Cc (copia de carbón) y Bcc (copia de carbón ciega) y para ello, utilizamos los parámetros -Cc y -Bcc (Send-MailMessage CmdLet) respectivamente mientras proporcionamos las direcciones de correo electrónico como valores para cada uno de ellos.
Cómo enviar correos electrónicos con cuerpo HTML usando PowerShell
Tenemos la opción de enviar nuestros correos electrónicos usando PowerShell con contenido HTML dentro del cuerpo del correo electrónico usando Send-MailMessage CmdLet. Para poder enviar correos electrónicos usando PowerShell como HTML necesitamos hacer dos cosas adicionales:
- El valor del parámetro -body debe estar bien formateado en HTML para que el cliente de correo electrónico nos muestre un correo HTML.
- Se ha pasado el parámetro de cambio -BodyAsHtml a Send-MailMessage CmdLet sólo para notificarle que el parámetro -body tiene código HTML dentro.
Aquí hay un ejemplo de una llamada a Send-MailMessage CmdLet que crea un correo electrónico HTML en lugar de texto plano en el cuerpo del correo electrónico.
NOTA: Para que este ejemplo le funcione, sustituya los valores de estas variables por sus propios datos: $EmailFrom, $EmailTo, $SMTPserver, $username.
$EmailFrom = "sender’s email address" $EmailTo = "recipient’s email address" $EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. HTML Example" $EmailHTMLBody = 'Learn PowerShell With Dejan - ImproveScripting.com'$SMTPserver= "SMTP server"$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$credential = New-Object System.Management.Automation.PSCredential($username, $password)Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailHTMLBody" -BodyAsHtml -SmtpServer "$SMTPserver" -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -Credential $credential -Port 587 -UseSsl
Aquí está el correo electrónico resultante que se recibió y como se puede ver en el cuerpo del correo tenemos un enlace HTML a este sitio web en lugar de sólo texto plano.
Cómo enviar Email desde PowerShell usando el servidor SMTP de Gmail
Quizás mi respuesta te sorprenda pero no recomiendo usar el servidor SMTP de Gmail para enviar emails usando PowerShell Send-MailMessage CmdLet.
El motivo es el hecho de que necesitamos habilitar en la cuenta de Gmail la función: «Habilitar aplicaciones menos seguras para acceder a Gmail». Esto disminuirá la seguridad de nuestra cuenta de Gmail y prefiero no hacerlo sobre todo que hay un montón de otras opciones disponibles públicamente.
System.Net.Mail API
Una de las aproximaciones alternativas para enviar correos electrónicos usando PowerShell es usar clases .NET en el espacio de nombres System.Net.Mail. Este enfoque es anterior a la época de Send-MailMessage CmdLet, cuando Send-MailMessage CmdLet no estaba disponible.
Aquí hay una llamada de ejemplo utilizando la API System.Net.Mail:
NOTA: Para que este ejemplo le funcione, por favor, sustituya los valores de estas variables por sus propios datos: $EmailFrom, $EmailTo, $SMTPserver, $username.
$EmailFrom = "sender’s email address”$EmailTo = "recipient’s email address”$EmailSubject = "Learn PowerShell With Dejan - ImproveScripting.com. (System.Net.Mail API Example)”$EmailBody = "This email has as the attachments error log."$SMTPServer = "SMTP server”$SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)$SMTPClient.EnableSsl = $true$EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt"$username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString$SMTPClient.Credentials = New-Object System.Net.NetworkCredential($username, $password);$SMTPClient.Send($EmailFrom, $EmailTo, $EmailSubject, $EmailBody)
Aquí está el correo electrónico recibido en la bandeja de entrada después de reemplazar el ejemplo con los valores reales de los parámetros necesarios:
En mi opinión, usar las clases del espacio de nombres System.Net.Mail .NET es un enfoque más natural para los desarrolladores .NET mientras que usar Send-MailMessage CmdLet es un enfoque más nativo de PowerShell. De todos modos, es bueno estar familiarizado con las alternativas y ambos enfoques son útiles para tener en el conjunto de habilidades de scripting de PowerShell.
Cómo escribir un CmdLet propio para enviar correos electrónicos usando PowerShell
He escrito mi propio CmdLet de PowerShell que proporciona la funcionalidad de envío de correo llamada Send-Email CmdLet.
Este CmdLet pertenece al proyecto Efficiency Booster PowerShell. Este proyecto es la biblioteca de diferentes CmdLets que pueden ayudarnos a nosotros, el personal de TI, a realizar nuestras tareas diarias de manera más eficiente y precisa.
El código fuente de Send-Email CmdLet se puede descargar desde este archivo zip, así que no dude en descargarlo o mirar el código fuente en la parte inferior de este artículo.
Send-Email CmdLet forma parte del módulo Utils y si has descargado el código fuente lo puedes encontrar en la carpeta …Documentos\NWindowsPowerShell\Modules\02utils
No voy a explicar demasiado sobre este CmdLet ya que básicamente es un wrapper alrededor de Send-MailMessage CmdLet y no es especialmente innovador pero es importante utilizar las capacidades de PowerShell de envío de correos electrónicos como un mecanismo importante en la automatización y eficiencia.
INFO: Si quieres saber cómo instalar y configurar los archivos del proyecto PowerShell de Efficiency Booster lee el siguiente artículo: Cómo instalar y configurar PowerShell: CmdLets, Módulos, Perfiles.
Cómo Usar la Función de Envío de Correos Electrónicos en PowerShell
Te voy a dar unos cuantos ejemplos de cómo he usado los correos electrónicos combinados con algunas otras funciones de PowerShell para ser más eficiente o para tener una mejor visión del sistema que hay que mantener.
Ejemplo: Espacio Libre en los Discos de los Servidores
Quería tener una visión general del espacio libre en los discos de los servidores que estaba manteniendo. Así que he escrito mi propio CmdLet de PowerShell Get-DiskFreeSpace que comprobará el espacio libre en cada disco de todos los servidores, además este CmdLet se programó para que se ejecutara una vez a la semana y produjera un informe en forma de hoja de Excel que se enviaría a mi correo electrónico para que pudiera revisarlo y evitar los espacios libres en disco bajos.
Este ejemplo puede ser ampliado aún más para ser utilizado para la planificación de la capacidad y enviar los datos más a MS SQL Table y combinado con MS SQL Reporting Service para obtener gráficos con las tendencias de uso de almacenamiento en disco para planificar actualizaciones y ampliaciones de almacenamiento en el futuro.
Recomiendo encarecidamente a todo el mundo que lea el artículo dedicado a este Cmdlet de PowerShell «How To Get Disk Size And Disk Free Space Using PowerShell».
Ejemplo: Registros de Eventos de Windows en Servidores
El segundo ejemplo ha sido parte de mi rutina de mantenimiento mensual para buscar en todos los Registros de Eventos de Windows los errores que están ocurriendo en los servidores especialmente con respecto al SO y las aplicaciones de misión crítica.
Para ello, he escrito mi propio CmdLet Get-ErrorFromEventLog de PowerShell que comprobará los Registros de Eventos de Windows y buscará errores en todos los servidores. Este script ha sido programado para ejecutarse una vez al mes antes del mantenimiento y además produciría una hoja de Excel para que sea fácil filtrar y mirar los datos. Por último, se ha enviado un informe de Excel a mi dirección de correo electrónico. Así que puedo revisar los errores y estar preparado para hacer las acciones necesarias y evitar los mismos errores en el futuro.
En ese sentido, me ahorraría una enorme cantidad de tiempo al no hacer un trabajo manual de registro en cada servidor y comprobar manualmente cada registro de eventos de Windows en cada servidor.
Si usted mantiene un entorno con un montón de servidores recomiendo encarecidamente la adopción de esta rutina mensual y mirar el artículo escrito al respecto «Cómo obtener los detalles de los registros de eventos de Windows utilizando PowerShell».
Espero que estos dos ejemplos disparen tus ideas para implementar fantásticas posibilidades enviando un correo electrónico usando PowerShell combinado con otras capacidades de PowerShell.
Artículos útiles de PowerShell sobre el envío de correos electrónicos
Aquí tienes algunos artículos y recursos útiles:
- Send-MailMessage
- DE0005: SmtpClient no debería usarse
- MailKit
- System.Net.Mail API
- SmtpClient
- Clase NetworkCredential
Send-Email CmdLet – Código fuente
DISCLAIMER: La función Send-Email forma parte del proyecto PowerShell Efficiency Booster y como tal utiliza otros CmdLets que forman parte del mismo proyecto. Así que la mejor opción para que esta función funcione sin ninguna personalización adicional es descargar el código fuente de todo el proyecto desde aquí.
INFO: Mi mejor consejo para todo scripter de PowerShell es que aprenda a escribir sus propias Funciones Avanzadas y CmdLets de PowerShell y he escrito varios artículos explicando esto, así que léelos. Cómo crear un CmdLet de PowerShell personalizado (paso a paso). Aquí explico cómo usar la Función Complementaria de PowerShell para ser más rápido en la escritura de Funciones de PowerShell Cómo Escribir Funciones Avanzadas o CmdLets con PowerShell (Rápido).
Aquí tienes el código fuente de todo el CmdLet Send-Email:
NOTA: Para que este ejemplo te funcione sustituye los valores de estas variables por tus propios datos: $EmailFrom, $EmailTo, $SMTPserver, $EncryptedPasswordFile, $username.
<#.SYNOPSISSend email..DESCRIPTIONSend email..PARAMETER AttachmentsEmail attachments. File path to file(s) that will be attachments..PARAMETER PriorityEmail priority. Valid values are: Normal, High, and Low..PARAMETER errorlogWrite to Error log or not. Switch parameter. Error log is in PSLogs Folder of My documents..PARAMETER clientOK - O clientBK - B client.PARAMETER solutionFIN - Financial solution HR - Humane Resource solution.EXAMPLESend-Email -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -errorlog -client "Test" -solution "Test" -Verbose.NOTESFunctionName : Send-EmailCreated by : Dejan MladenovicDate Coded : 09/23/2020 15:13:00More info : https://improvescripting.com/send-emails-using-powershell-with-many-examples/.LINK Send-MailMessagehttps://improvescripting.com/send-emails-using-powershell-with-many-examples/#>Function Send-Email {param ( ]$Attachments, $Priority = "Normal", $errorlog, $client, $solution)BEGIN { }PROCESS { try { Write-Verbose "Sending email..." if( $client -eq "OK" -and $solution -eq "FIN") { ##REPLACE THIS VALUE!!! $EmailFrom = "your_email" ##REPLACE THIS VALUE!!! $EmailTo = "your_email" $EmailSubject = "Report from Financial solution - OK client." $EmailBody = "This email has as attachments error log and report file from Financial Solution - OK client." ##REPLACE THIS VALUE!!! $SMTPserver= "your_SMTP_server" ##REPLACE THIS VALUE!!! $EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt" ##REPLACE THIS VALUE!!! $username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString $credential = New-Object System.Management.Automation.PSCredential($username, $password) ##Change this as splatting syntax in Send-MailMessage CmdLet Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments $Attachments -Priority $Priority -Credential $credential -Port 587 } elseif ( $client -eq "Test" -and $solution -eq "Test" ) { ##REPLACE THIS VALUE!!! $EmailFrom = "your_email" ##REPLACE THIS VALUE!!! $EmailTo = "your_email" $EmailSubject = "Test of Send-Email cmdlet" $EmailBody = "This is test email." ##REPLACE THIS VALUE!!! $SMTPserver= "your_SMTP_server" ##REPLACE THIS VALUE!!! $EncryptedPasswordFile = "$home\Documents\PSCredential\MailJet.txt" ##REPLACE THIS VALUE!!! $username="your_user_name" $password = Get-Content -Path $EncryptedPasswordFile | ConvertTo-SecureString $credential = New-Object System.Management.Automation.PSCredential($username, $password) ##Change this as splatting syntax in Send-MailMessage CmdLet Send-MailMessage -ErrorAction Stop -from "$EmailFrom" -to "$EmailTo" -subject "$EmailSubject" -body "$EmailBody" -SmtpServer "$SMTPserver" -Attachments $Attachments -Priority $Priority -Credential $credential -Port 587 } Write-Verbose "Email sent." } catch { Write-Warning "There was a problem with sending email, check error log. Value of error is: $_" if ( $errorlog ) { $errormsg = $_.ToString() $exception = $_.Exception $stacktrace = $_.ScriptStackTrace $failingline = $_.InvocationInfo.Line $positionmsg = $_.InvocationInfo.PositionMessage $pscommandpath = $_.InvocationInfo.PSCommandPath $failinglinenumber = $_.InvocationInfo.ScriptLineNumber $scriptname = $_.InvocationInfo.ScriptName Write-Verbose "Start writing to Error log." Write-ErrorLog -hostname "Send Email was failing." -errormsg $errormsg -exception $exception -scriptname $scriptname -failinglinenumber $failinglinenumber -failingline $failingline -pscommandpath $pscommandpath -positionmsg $pscommandpath -stacktrace $stacktrace Write-Verbose "Finish writing to Error log." } }}END { }}#Send-Email -Attachments "$home\Documents\PSlogs\Error_Log.txt" -Priority "Normal" -errorlog -client "Test" -solution "Test" -Verbose