lunes, 4 de noviembre de 2013

Como enviar un email desde un archivo bat en Windows

Pautas para enviar un correo desde linea de comandos de Windows (archivo bat):



Actualización del post al final!!

1) Necesitaremos tener instalado PowerShell de Windows:
Si  tu equipo tiene  Windows 7  ó  Windows Server 2008 R2, no tienes que instalar nada pues ya está instalado.

Si tienes Windows XP, para comprobar si tienes instalado el PowerShell, ir a:  

   
Inicio > Ejecutar > cmd > Aceptar

A continuación escribes: start powershell.


Si se abre una nueva pantalla negra con el prompt PS C:\> significa que lo tienes instalado. Sino, puedes descargarlo desde el siguiente enlace de Microsoft.


Nota: Para instalar Powershell necesita que tengas como mínimo el Service Pack 2 de Windows XPla versión 2.0 de .NET Framework.


2) Una vez instalado, mira la política de Ejecución de PowerShell.


Para ello, abrir la consola de PowerShell y escribir:


      Get-ExecutionPolicy


Si nos devuelve el valor 'Restricted', deberemos cambiarla a RemoteSigned con el comando:

Set-ExecutionPolicy RemoteSigned
De esta forma, configuramos PowerShell para que ejecute, sin preguntar, 
cualquier script que hayas escrito, y en cuanto a los bajados de 
internet, sólo ejecutará los scripts firmados por un editor de confianza. 

Nota: Si te ada el error de acceso denegado, haz clic derecho sobre Powershell y selecciona "Ejecutar como administrador"

3) Abrir el bloc de notas: Inicio > Ejecutar > notepad.exe > Aceptar
 4) Copiar el siguiente texto en un archivo nuevo y guardarlo como C:\correo.ps1
 $EmailFrom = “tudirecciongmail@gmail.com”
 $EmailTo = “direcciondestino@dominio.com”

 $Subject = “El asunto de tu email”

 $Body = “El cuerpo de tu email”

 $SMTPServer = smtp.gmail.com

 $SMTPClient = New-Object Net.Mail.SmtpClient($SmtpServer, 587)

 $SMTPClient.EnableSsl = $true

 $SMTPClient.Credentials = New-Object System.Net.NetworkCredential(“user”,  “password”);

 $SMTPClient.Send($EmailFrom, $EmailTo, $Subject, $Body)
 Obviamente debes modificar el valor de las variables(lo que escribo entre ” ”)
por las que tú quieras.
Nota: “user” y “password” se refieren al usuario y contraseña de tu cuenta de gmail.
5) Copiar la siguiente linea en un nuevo documento de texto: 
      start powershell C:\correo.ps1
y guardarlo como C:\correo.bat
Nota: Si la ruta del archivo contiene espacios en blanco, escribe la ruta de acceso entre comillas dobles y empieza la instrucción con un signo "&" . Por ejemplo:
& "C:\Mis Scripts\correo.ps1"

Sólo nos queda hacer doble clic en el archivo correo.bat y comprobar que nos ha llegado el email que hemos enviado!!

Si se trata de una cuenta GMail, hay que activar el acceso de aplicaciones menos seguras de tu cuenta de Google.

Si te muestra el error: "Se denegó el acceso a la clave de Registro 'HKEY_LOCAL_MA CHINE\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell'"

   1) Ir a Incio > Ejecutar > Regedit 

   2) Navega hasta la clave HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell

   3) Si no existe "ExecutionPolicy", creala como REG_SZ con el valor "RemoteSigned"

   4) Abre PowerShell y ejecuta el comando "Get-ExecutionPolicy" para comprobar que esta configurado correctamente.


Método actualizado:

1) Para poder enviar emails desde un archivo por lotes con ficheros adjuntos,lo mas fácil es que te bajes la versión 2 de Windows Poweshell:

2) Abre el bloc de notas, copia y pega: 
 Send-MailMessage -To direcciondestino@dominio.com
-Subject “El asunto de tu email”
-Body “El cuerpo de tu email”
-SmtpServer smtp.gmail.com
-From tudirecciongmail@gmail.com
-Attachments “el path completo donde esta guardado el archivo adjunto”, por
ej: “C:\imagen.jpg” 
-Credential user\password

3) Guardarlo como C:\correo_con_archivo.ps1  
4) Copiar la siguiente linea en un nuevo documento de texto: start powershell C:\correo_con_archivo.ps1 y guardarlo como C:\correo_con_adjunto.bat
Nota: Si la ruta del archivo contiene espacios en blanco, escribe la ruta de acceso entre comillas dobles y empieza la instrucción con un signo "&". Por ejemplo: & "C:\Mis Scripts\correo.ps1" 

5) Haz doble clic en el archivo correo_con_adjunto.bat y listo!

Para ver todas los parametros que puedes usar con el cmdlet Send-MailMessage escribe en PowerShell 2.0: help send*

Pero si lo que quieres es crear un acceso directo en el escritorio de tu PC para poder enviar correos con algunos de los campos ya rellenos, echale un vistazo a este otro post.
Para más información sobre PowerShell (en inglés):
http://technet.microsoft.com/en-us/scriptcenter/dd742419.aspx 

http://technet.microsoft.com/en-us/library/ee176949.aspx




No obstante, si eres de los que prefieres usar un programa con entorno gráfico tipo Windows mejor que la clásica pantalla negra de MS-Dos, puedes echar un vistazo a SwithMail.




Los parámetros que tiene son:

SwithMail.exe [/Silent]  [/ToAddress ...] [/CC ...] [/BCC ...] [/FromAddress ...] [/FromName "..."] [/Subject "..."] [/Body "..."] [/HTML true] [/Attachment "C:PathToFile.txt"] [/Param1 "Mr. Smith"] [/enc "..."]

Y los modificadores que podemos usar son:

/Silent -- [also '/s' and '/q'] send an email without any prompt.
/XML -- [also '/x'] "C:\PathToSettings.xml"
/FromAddress -- [also '/from'] email address
/FromName -- [also '/name'] name displayed
/Server -- server address - no port specified
/Port -- [also '/p'] server port - needed if /Server is used
/Username -- [also '/u'] specified different username to use when logging in with SSL / TSL
/Password [also '/pass'] password - in plain text
/SSL -- [also '/TSL'] "true" or "false" depending on if SSL / TLS is enabled
/ToAddress -- [also '/to'] email address(es); multiple separated by ';' or ','
/CC -- email address(es); multiple separated by ';' or ','
/BCC -- email address(es); multiple separated by ';' or ','
/ReplyTo -- [also '/rt'] address to set as the "Reply To" address
/Subject -- [also '/sub'] subject "in quotes"
/Body -- [also '/b'] email body "in quotes" - html tags allowed when /HTML=true
/BodyTxt -- [also '/btxt'] full path of a text file to be used as the message body.
/HTML -- "true" or "false" depending on if HTML tags are allowed in the body
/Attachment -- [also '/a'] "C:\PathToFile.txt|C:\PathTo2.txt" - separate with pipe (|) symbol
/Param{1-5} -- [also '/p{1-5}'] use %Param1% in subject or body, && replace it with this value
/Test -- use when testing from CLI. Message will appear with errors or success
/Encoding --  [also '/enc'] Specify different charset to be used (UTF8 by default)
/ReadReceipt -- [also '/rr'] Request Read Receipt (where the client acknowledges and agrees)
/DontReplace -- [also '/drnl'] Don't replace New Line with '<br />' on HTML email

Tienes un foro (en inglés) para poder ver las dudas de otros usuarios.

5 comentarios:

  1. Hola buenas!! he usado el primer codigo,ya que tengo windows 2007,y al ejecutarlo en el powershell me dice: "falta el parentesis de cierre '>' en la expresion.
    No sé por qué

    ResponderEliminar
  2. Muchas gracias. Funciona perfectamente.
    Lo único a tener en cuenta es que esta sentencia debe ir entre comillas $SMTPServer = "smtp.gmail.com"

    ResponderEliminar