Powershell: script para enviar correo desde gmail leyendo la contraseña de un fichero cifrado
Para futuros proyectos precisaba de un script que enviase un correo desde gmail.
Scripts ya hay muchos hechos en internet. Utilidades para esto también hay unas cuantas (por ejemplo http://www.blat.net/)
Pero me gustaría que cumpliese estas características:
Por todos estos motivos, me decidí a hacer un script en powershell que envíe un correo desde una cuenta y lea la contraseña de un fichero cifrado.
Obviamente, el único requisito que tiene este script es que tengamos instalado powershell.
Tenemos que decidir qué cuenta vamos a utilizar para enviar los correos
En mi caso es cmdcons@gmail.com. Pero vamos a usar una genérica para este ejemplo: cuenta-desde@gmail.com
Para crear el fichero cifrado con la contraseña, abrimos powershell.
Ejecutamos este comando siendo
"password-decuenta-desde@gmail.com"
El password entrecomillado de la cuenta del remitente
c:\contraseña-cifrada.txt
El fichero donde almacenaremos la contraseña
"password-decuenta-desde@gmail.com" | Convertto-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-file c:\contraseña-cifrada.txt
IMPORTANTE: El cifrado está asociado al equipo.
Esto es: supongamos que ejecutamos el comando que crea el fichero con la contraseña cifrada en el equipo PC-A. Se nos genera el archivo cifrado-en-A.txt.
Si llevamos el fichero cifrado-en-A.txt a otro equipo , PC-B, el script no funcionará.
Esto implica que por cada equipo en que vayamos a ejecutar el script, tendremos que volver a generar el fichero con la contraseña cifrada
<#
.SYNOPSIS
Enviar correo desde cuenta de gmail
.DESCRIPTION
Enviar correo desde cuenta de gmail, con la contraseña almacenada en fichero cifrado
.PARAMETER from
Remitente del correo
.PARAMETER para
Destinatario del correo
.PARAMETER asunto
Asunto del correo
.PARAMETER cuerpo
Fichero de texto en el que se pondrá el cuerpo del correo
.PARAMETER contraseña
Fichero de texto que contiene la contraseña cifrada
.EXAMPLE
enviar-correo-gmail.ps1 cmdcons@gmail.com para-quien-sea@dominio.com "Asunto" cuerpo.txt fichero-contraseña.txt
enviar-correo-gmail.ps1 cmdcons@gmail.com para-quien-sea@dominio.com "Asunto" "cuerpo entrecomillado" fichero-contraseña.txt
.NOTES
https://www.adminarsenal.com/blog/powershell-send-mailmessage-gmail/
https://community.spiceworks.com/topic/1232283-how-do-i-store-a-password-in-send-mailmessage-script
https://blogs.technet.microsoft.com/gary/2009/07/23/creating-a-ps-credential-from-a-clear-text-password-in-powershell/
#>
param(
[string]$from,
[string]$para,
[string]$asunto,
[string]$cuerpo,
[string]$contraseña
)
## declaracion de variables
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
## El cuerpo tiene que pasarse a un string. De lo contrario manda el nombre del fichero, no su contenido.
Try
{
if (Test-Path $cuerpo) { $cuerpo = Get-Content $cuerpo| Out-String }
}
Catch
{
write-warning "Error. No se puede acceder a $cuerpo $($_.Exception.Message)"
}
### Ejecutar esto para guardar la contraseña
## "password-de-cuenta-en-from" | Convertto-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-file c:\scripts\contraseña-en-ORC5.txt
## Obtenemos el password de las credenciales almacenadas
$password = Get-Content $contraseña| Convertto-SecureString
## ejecutamos comando que envia mail
$credentials = New-Object System.Management.Automation.Pscredential -Argumentlist $from,$password
Send-MailMessage -From $from -to $Para -Subject $asunto -Body $cuerpo -Encoding ASCII -SmtpServer $SMTPServer -port $SMTPPort -UseSsl -Credential $credentials
-------------------------- FIN SCRIPT -----------------------------
El cuerpo puede ser tanto una cadena de texto como un fichero de texto.
Para ejecutarlo:
enviar-correo-gmail.ps1 cuenta-desde@gmail.com para-quien-sea@dominio.com "asunto del correo" cuerpo.txt fichero-con-contraseña.txt
Siendo:
cuenta-desde@gmail.com
Cuenta del remitente. Nuestra cuenta
para-quien-sea@dominio.com
la cuenta del destinatario
"asunto del correo"
Asunto
cuerpo.txt
fichero-con-contraseña.txt
Fichero cifrado con la contraseña
Si queremos enviar un texto, simplemente cambiamos el cuerpo.txt por un texto entrecomillado
enviar-correo-gmail.ps1 cuenta-desde@gmail.com para-quien-sea@dominio.com "asunto del correo" "cuerpo del correo. Hola" fichero-con-contraseña.txt
Por último, como voy a usar esto para tareas programadas, necesitaremos un comando que ejecute esto suponiendo que nuestro script está en c:\scripts
Programa o script:
C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
Argumentos :
-f C:\scripts enviar-correo-gmail.ps1 cuenta-desde@gmail.com para-quien-sea@dominio.com "asunto del correo" "cuerpo del correo" fichero-con-contraseña.txt
Scripts ya hay muchos hechos en internet. Utilidades para esto también hay unas cuantas (por ejemplo http://www.blat.net/)
Pero me gustaría que cumpliese estas características:
- Seguro: No poner la contraseña en un comando ni en texto plano en un fichero.
- Portable: Que no tenga que instalar ningún programa y que lo que tenga que configurar sea mínimo.
- Windows-friendly: Que se ejecute en cualquier windows (windows 7,10, 2008 R2, 2012 R2)
Por todos estos motivos, me decidí a hacer un script en powershell que envíe un correo desde una cuenta y lea la contraseña de un fichero cifrado.
Obviamente, el único requisito que tiene este script es que tengamos instalado powershell.
1.- Crear el fichero cifrado que contiene la contraseña
Tenemos que decidir qué cuenta vamos a utilizar para enviar los correos
En mi caso es cmdcons@gmail.com. Pero vamos a usar una genérica para este ejemplo: cuenta-desde@gmail.com
Para crear el fichero cifrado con la contraseña, abrimos powershell.
Ejecutamos este comando siendo
"password-decuenta-desde@gmail.com"
El password entrecomillado de la cuenta del remitente
c:\contraseña-cifrada.txt
El fichero donde almacenaremos la contraseña
"password-decuenta-desde@gmail.com" | Convertto-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-file c:\contraseña-cifrada.txt
IMPORTANTE: El cifrado está asociado al equipo.
Esto es: supongamos que ejecutamos el comando que crea el fichero con la contraseña cifrada en el equipo PC-A. Se nos genera el archivo cifrado-en-A.txt.
Si llevamos el fichero cifrado-en-A.txt a otro equipo , PC-B, el script no funcionará.
Esto implica que por cada equipo en que vayamos a ejecutar el script, tendremos que volver a generar el fichero con la contraseña cifrada
2. - El script que envía correo desde gmail
-------------------------- INICIO SCRIPT -----------------------------<#
.SYNOPSIS
Enviar correo desde cuenta de gmail
.DESCRIPTION
Enviar correo desde cuenta de gmail, con la contraseña almacenada en fichero cifrado
.PARAMETER from
Remitente del correo
.PARAMETER para
Destinatario del correo
.PARAMETER asunto
Asunto del correo
.PARAMETER cuerpo
Fichero de texto en el que se pondrá el cuerpo del correo
.PARAMETER contraseña
Fichero de texto que contiene la contraseña cifrada
.EXAMPLE
enviar-correo-gmail.ps1 cmdcons@gmail.com para-quien-sea@dominio.com "Asunto" cuerpo.txt fichero-contraseña.txt
enviar-correo-gmail.ps1 cmdcons@gmail.com para-quien-sea@dominio.com "Asunto" "cuerpo entrecomillado" fichero-contraseña.txt
.NOTES
https://www.adminarsenal.com/blog/powershell-send-mailmessage-gmail/
https://community.spiceworks.com/topic/1232283-how-do-i-store-a-password-in-send-mailmessage-script
https://blogs.technet.microsoft.com/gary/2009/07/23/creating-a-ps-credential-from-a-clear-text-password-in-powershell/
#>
param(
[string]$from,
[string]$para,
[string]$asunto,
[string]$cuerpo,
[string]$contraseña
)
## declaracion de variables
$SMTPServer = "smtp.gmail.com"
$SMTPPort = "587"
## El cuerpo tiene que pasarse a un string. De lo contrario manda el nombre del fichero, no su contenido.
Try
{
if (Test-Path $cuerpo) { $cuerpo = Get-Content $cuerpo| Out-String }
}
Catch
{
write-warning "Error. No se puede acceder a $cuerpo $($_.Exception.Message)"
}
### Ejecutar esto para guardar la contraseña
## "password-de-cuenta-en-from" | Convertto-SecureString -AsPlainText -Force | ConvertFrom-SecureString | Out-file c:\scripts\contraseña-en-ORC5.txt
## Obtenemos el password de las credenciales almacenadas
$password = Get-Content $contraseña| Convertto-SecureString
## ejecutamos comando que envia mail
$credentials = New-Object System.Management.Automation.Pscredential -Argumentlist $from,$password
Send-MailMessage -From $from -to $Para -Subject $asunto -Body $cuerpo -Encoding ASCII -SmtpServer $SMTPServer -port $SMTPPort -UseSsl -Credential $credentials
-------------------------- FIN SCRIPT -----------------------------
El cuerpo puede ser tanto una cadena de texto como un fichero de texto.
Para ejecutarlo:
enviar-correo-gmail.ps1 cuenta-desde@gmail.com para-quien-sea@dominio.com "asunto del correo" cuerpo.txt fichero-con-contraseña.txt
Siendo:
cuenta-desde@gmail.com
Cuenta del remitente. Nuestra cuenta
para-quien-sea@dominio.com
la cuenta del destinatario
"asunto del correo"
Asunto
cuerpo.txt
fichero-con-contraseña.txt
Fichero cifrado con la contraseña
Si queremos enviar un texto, simplemente cambiamos el cuerpo.txt por un texto entrecomillado
enviar-correo-gmail.ps1 cuenta-desde@gmail.com para-quien-sea@dominio.com "asunto del correo" "cuerpo del correo. Hola" fichero-con-contraseña.txt
3.- Comando para una tarea programada
Por último, como voy a usar esto para tareas programadas, necesitaremos un comando que ejecute esto suponiendo que nuestro script está en c:\scripts
Programa o script:
C:\Windows\system32\WindowsPowerShell\v1.0\powershell.exe
Argumentos :
-f C:\scripts enviar-correo-gmail.ps1 cuenta-desde@gmail.com para-quien-sea@dominio.com "asunto del correo" "cuerpo del correo" fichero-con-contraseña.txt
Comentarios
Publicar un comentario