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:

  • 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

Entradas populares de este blog

Cómo saber el UUID de un equipo

Reducir el tamaño de install.wim a menos de 4 GB

Monitor HP No funciona ningún botón - OSD LOCKOUT