¿Cómo enviar correos electrónicos usando simples comandos SMTP a través de Gmail?

Para propósitos educativos, necesito enviar un correo electrónico a través de un servidor SMTP, usando las reglas básicas y simples de SMTP.

Pude hacer eso usando smtp4dev . Yo telnet localhost 25 y los comandos son:

enter image description here

Quiero hacer lo mismo, usando el servidor SMTP de Gmail. Sin embargo, requiere autenticación y TLS. No puedo encontrar la manera de hacerlo para Gmail. Aquí hay una captura de pantalla de telnet smtp.gmail.com 587 :

enter image description here

Busqué y encontré muchos enlaces, incluido el artículo de Wikipedia sobre el comando STARTTLS . Pero no puedo usar TLS y autenticar al servidor SMTP de Gmail usando la línea de comandos (o enviar comandos en los lenguajes de progtwigción). ¿Alguien puede ayudar?

para enviar a través de Gmail, debe usar una conexión encriptada. esto no es posible solo con telnet, pero puede usar herramientas como openssl

ya sea conectando usando la opción starttls en openssl para convertir la conexión simple a encriptada …

openssl s_client -starttls smtp -connect smtp.gmail.com:587 -crlf -ign_eof

o conectarse a un sockect ssl directamente …

openssl s_client -connect smtp.gmail.com:465 -crlf -ign_eof

EHLO localhost

después de eso, autentíquese en el servidor usando el nombre de usuario / contraseña codificado en base64

AUTH PLAIN AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ =

para obtener esto desde la línea de comandos:

 echo -ne '\00user@gmail.com\00password' | base64 AHVzZXJAZ21haWwuY29tAHBhc3N3b3Jk 

luego continúe con “mail from:” como en su ejemplo

sesión de ejemplo:

 openssl s_client -connect smtp.gmail.com:465 -crlf -ign_eof [... lots of openssl output ...] 220 mx.google.com ESMTP m46sm11546481eeh.9 EHLO localhost 250-mx.google.com at your service, [1.2.3.4] 250-SIZE 35882577 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH 250 ENHANCEDSTATUSCODES AUTH PLAIN AG5pY2UudHJ5QGdtYWlsLmNvbQBub2l0c25vdG15cGFzc3dvcmQ= 235 2.7.0 Accepted MAIL FROM:  250 2.1.0 OK m46sm11546481eeh.9 rcpt to:  250 2.1.5 OK m46sm11546481eeh.9 DATA 354 Go ahead m46sm11546481eeh.9 Subject: it works yay! . 250 2.0.0 OK 1339757532 m46sm11546481eeh.9 quit 221 2.0.0 closing connection m46sm11546481eeh.9 read:errno=0 

Desafortunadamente, como me veo obligado a usar un servidor de Windows, no he podido lograr que openssl funcione de la manera que sugiere la respuesta anterior.

Sin embargo, pude hacer funcionar un progtwig similar llamado stunnel (que se puede descargar desde aquí ). Obtuve la idea de http://www.tech-and-dev.com pero tuve que cambiar las instrucciones un poco. Aquí esta lo que hice:

  1. Instale el cliente telnet en el cuadro de Windows.
  2. Descargar stunnel. (Descargué e instalé un archivo llamado stunnel-4.56-installer.exe ).
  3. Una vez instalado, necesitaba ubicar el archivo de configuración stunnel.conf , que en mi caso instalé en C:\Program Files (x86)\stunnel
  4. Luego, debe abrir este archivo en un visualizador de texto, como el bloc de notas . Busque [gmail-smtp] y elimine el punto y coma en la línea del cliente a continuación (en el archivo stunnel.conf, cada línea que comienza con un punto y coma es un comentario). Deberías terminar con algo como:

     [gmail-smtp] client = yes accept = 127.0.0.1:25 connect = smtp.gmail.com:465 

    Una vez que haya hecho esto, guarde el archivo stunnel.conf y vuelva a cargar la configuración (para hacer esto, use el progtwig de interfaz gráfica de usuario de stunnel, y haga clic en configuración => Recargar ).

¡Ahora debería estar listo para enviar correos electrónicos en el cliente Windows telnet!
Vaya a Inicio => ejecutar => cmd .

Una vez que cmd esté abierto, escriba lo siguiente y presione Enter:

 telnet localhost 25 

Debería ver algo similar a lo siguiente:

 220 mx.google.com ESMTP f14sm1400408wbe.2 

Luego deberá responder escribiendo lo siguiente y presionando enter:

 helo google 

Esto debería darle la siguiente respuesta:

 250 mx.google.com at your service 

Si obtiene esto, debe escribir lo siguiente y presionar enter:

 ehlo google 

Esto debería darle la siguiente respuesta:

 250-mx.google.com at your service, [212.28.228.49] 250-SIZE 35651584 250-8BITMIME 250-AUTH LOGIN PLAIN XOAUTH 250 ENHANCEDSTATUSCODES 

Ahora debe estar listo para autenticarse con sus detalles de Gmail. Para hacer esto escriba lo siguiente y presione enter:

 AUTH LOGIN 

Esto debería darle la siguiente respuesta:

 334 VXNlcm5hbWU6 

Esto significa que estamos listos para autenticarse mediante el uso de nuestra dirección y contraseña de gmail.

Sin embargo, dado que se trata de una sesión cifrada, tendremos que enviar el correo electrónico y la contraseña codificados en base64. Para codificar su correo electrónico y contraseña, puede usar un progtwig conversor o un sitio web en línea para codificarlo (por ejemplo, base64 o buscar en google ‘encoding en línea base64’ ). Recomiendo que no vuelva a tocar la sesión de cmd / telnet hasta que haya hecho esto.

Por ejemplo, test@gmail.com se convertiría en dGVzdEBnbWFpbC5jb20 = y la contraseña se convertiría en cGFzc3dvcmQ =

Una vez hecho esto, copie y pegue su nombre de usuario de base64 convertido en la sesión de cmd / telnet y presione enter. Esto debería darle la siguiente respuesta:

 334 UGFzc3dvcmQ6 

Ahora copie y pegue su contraseña convertida de base64 en la sesión de cmd / telnet y presione enter. Esto debería darle la siguiente respuesta si ambas credenciales de inicio de sesión son correctas:

 235 2.7.0 Accepted 

Ahora debe ingresar el correo electrónico del remitente (debe ser el mismo que el nombre de usuario) en el siguiente formato y presionar enter:

 MAIL FROM: 

Esto debería darle la siguiente respuesta:

 250 2.1.0 OK x23sm1104292weq.10 

Ahora puede ingresar la dirección de correo electrónico del destinatario en un formato similar y presionar enter:

 RCPT TO: 

Esto debería darle la siguiente respuesta:

 250 2.1.5 OK x23sm1104292weq.10 

Ahora deberá escribir lo siguiente y presionar enter:

 DATA 

Que debería darle la siguiente respuesta:

 354 Go ahead x23sm1104292weq.10 

¡Ahora podemos comenzar a redactar el mensaje! Para hacerlo, ingrese su mensaje en el siguiente formato ( Sugerencia : haga esto en el bloc de notas y copie el mensaje completo en la sesión de cmd / telnet):

 From: Test  To: Me  Subject: Testing email from telnet This is the body Adding more lines to the body message. 

Cuando hayas terminado el correo electrónico, ingresa un punto:

 . 

Esto debería darle la siguiente respuesta:

 250 2.0.0 OK 1288307376 x23sm1104292weq.10 

Y ahora debe finalizar su sesión escribiendo lo siguiente y presionando enter:

 QUIT 

Esto debería darle la siguiente respuesta:

 221 2.0.0 closing connection x23sm1104292weq.10 Connection to host lost. 

¡Y su correo electrónico ahora debería estar en el buzón del destinatario!

Como nadie ha mencionado, sugiero utilizar una gran herramienta para tal fin – swaks

 # yum info swaks Installed Packages Name : swaks Arch : noarch Version : 20130209.0 Release : 3.el6 Size : 287 k Repo : installed From repo : epel Summary : Command-line SMTP transaction tester URL : http://www.jetmore.org/john/code/swaks License : GPLv2+ Description : Swiss Army Knife SMTP: A command line SMTP tester. Swaks can test : various aspects of your SMTP server, including TLS and AUTH. 

Tiene muchas opciones y puede hacer casi todo lo que quieras.

GMAIL: STARTTLS, SSLv3 (y sí, en 2016 gmail aún es compatible con sslv3)

 $ echo "Hello world" | swaks -4 --server smtp.gmail.com:587 --from user@gmail.com --to user@example.net -tls --tls-protocol sslv3 --auth PLAIN --auth-user user@gmail.com --auth-password 7654321 --h-Subject "Test message" --body - === Trying smtp.gmail.com:587... === Connected to smtp.gmail.com. <- 220 smtp.gmail.com ESMTP h8sm76342lbd.48 - gsmtp -> EHLO www.example.net <- 250-smtp.gmail.com at your service, [193.243.156.26] <- 250-SIZE 35882577 <- 250-8BITMIME <- 250-STARTTLS <- 250-ENHANCEDSTATUSCODES <- 250-PIPELINING <- 250-CHUNKING <- 250 SMTPUTF8 -> STARTTLS <- 220 2.0.0 Ready to start TLS === TLS started with cipher SSLv3:RC4-SHA:128 === TLS no local certificate set === TLS peer DN="/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com" ~> EHLO www.example.net <~ 250-smtp.gmail.com at your service, [193.243.156.26] <~ 250-SIZE 35882577 <~ 250-8BITMIME <~ 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH <~ 250-ENHANCEDSTATUSCODES <~ 250-PIPELINING <~ 250-CHUNKING <~ 250 SMTPUTF8 ~> AUTH PLAIN AGFhQxsZXguaGhMGdATGV4X2hoYtYWlsLmNvbQBS9TU1MjQ= <~ 235 2.7.0 Accepted ~> MAIL FROM: <~ 250 2.1.0 OK h8sm76342lbd.48 - gsmtp ~> RCPT TO: <~ 250 2.1.5 OK h8sm76342lbd.48 - gsmtp ~> DATA <~ 354 Go ahead h8sm76342lbd.48 - gsmtp ~> Date: Wed, 17 Feb 2016 09:49:03 +0000 ~> To: user@example.net ~> From: user@gmail.com ~> Subject: Test message ~> X-Mailer: swaks v20130209.0 jetmore.org/john/code/swaks/ ~> ~> Hello world ~> ~> ~> . <~ 250 2.0.0 OK 1455702544 h8sm76342lbd.48 - gsmtp ~> QUIT <~ 221 2.0.0 closing connection h8sm76342lbd.48 - gsmtp === Connection closed with remote host. 

YAHOO: TLS también conocido como SMTPS, tlsv1.2

 $ echo "Hello world" | swaks -4 --server smtp.mail.yahoo.com:465 --from user@yahoo.com --to user@gmail.com --tlsc --tls-protocol tlsv1_2 --auth PLAIN --auth-user user@yahoo.com --auth-password 7654321 --h-Subject "Test message" --body - === Trying smtp.mail.yahoo.com:465... === Connected to smtp.mail.yahoo.com. === TLS started with cipher TLSv1.2:ECDHE-RSA-AES128-GCM-SHA256:128 === TLS no local certificate set === TLS peer DN="/C=US/ST=California/L=Sunnyvale/O=Yahoo Inc./OU=Information Technology/CN=smtp.mail.yahoo.com" <~ 220 smtp.mail.yahoo.com ESMTP ready ~> EHLO www.example.net <~ 250-smtp.mail.yahoo.com <~ 250-PIPELINING <~ 250-SIZE 41697280 <~ 250-8 BITMIME <~ 250 AUTH PLAIN LOGIN XOAUTH2 XYMCOOKIE ~> AUTH PLAIN AGFhQxsZXguaGhMGdATGV4X2hoYtYWlsLmNvbQBS9TU1MjQ= <~ 235 2.0.0 OK ~> MAIL FROM: <~ 250 OK , completed ~> RCPT TO: <~ 250 OK , completed ~> DATA <~ 354 Start Mail. End with CRLF.CRLF ~> Date: Wed, 17 Feb 2016 10:08:28 +0000 ~> To: user@gmail.com ~> From: user@yahoo.com ~> Subject: Test message ~> X-Mailer: swaks v20130209.0 jetmore.org/john/code/swaks/ ~> ~> Hello world ~> ~> ~> . <~ 250 OK , completed ~> QUIT <~ 221 Service Closing transmission === Connection closed with remote host. 

He estado utilizando swaks para enviar notificaciones por correo electrónico desde nagios a través de gmail durante los últimos 5 años sin ningún problema.

Basado en las respuestas existentes, aquí hay una guía paso a paso para enviar correos electrónicos automáticos a través de SMTP, usando una cuenta de GMail, desde la línea de comandos, sin revelar la contraseña.

Requisitos

Primero, instale los siguientes paquetes de software:

  • Esperar
  • OpenSSL
  • Core Utils (base64)

Estas instrucciones asumen un sistema operativo Linux, pero debe ser razonablemente fácil de portar a Windows (a través de Cygwin o equivalentes nativos) u otro sistema operativo.

Autenticación

Guarde el siguiente script de shell como authentication.sh :

 #!/bin/bash # Asks for a username and password, then spits out the encoded value for # use with authentication against SMTP servers. echo -n "Email (shown): " read email echo -n "Password (hidden): " read -s password echo TEXT="\0$email\0$password" echo -ne $TEXT | base64 

Hazlo ejecutable y ejecútalo de la siguiente manera:

 chmod +x authentication.sh ./authentication.sh 

Cuando se le solicite, proporcione su dirección de correo electrónico y contraseña. Esto se verá algo así como:

 Email (shown): bob@gmail.com Password (hidden): AGJvYkBnbWFpbC5jb20AYm9iaXN0aGViZXN0cGVyc29uZXZlcg== 

Copie la última línea ( AGJ...== ), ya que se usará para la autenticación.

Notificación

Guarde el siguiente guión esperado como notify.sh (tenga en cuenta que la primera línea hace referencia al progtwig esperado):

 #!/usr/bin/expect set address "[lindex $argv 0]" set subject "[lindex $argv 1]" set ts_date "[lindex $argv 2]" set ts_time "[lindex $argv 3]" set timeout 10 spawn openssl s_client -connect smtp.gmail.com:465 -crlf -ign_eof expect "220" { send "EHLO localhost\n" expect "250" { send "AUTH PLAIN YOUR_AUTHENTICATION_CODE\n" expect "235" { send "MAIL FROM: \n" expect "250" { send "RCPT TO: <$address>\n" expect "250" { send "DATA\n" expect "354" { send "Subject: $subject\n\n" send "Email sent on $ts_date at $ts_time.\n" send "\n.\n" expect "250" { send "quit\n" } } } } } } } 

Realice los siguientes cambios:

  1. Pega sobre YOUR_AUTHENTICATION_CODE con el código de autenticación generado por el script de autenticación.
  2. Cambie YOUR_EMAIL_ADDRESS con la dirección de correo electrónico utilizada para generar el código de autenticación.
  3. Guarda el archivo.

Por ejemplo (tenga en cuenta que los corchetes angulares se conservan para la dirección de correo electrónico):

 send "AUTH PLAIN AGJvYkBnbWFpbC5jb20AYm9iaXN0aGViZXN0cGVyc29uZXZlcg==\n" send "MAIL FROM: \n" 

Por último, haga que el script de notificación sea ejecutable de la siguiente manera:

 chmod +x notify.sh 

Enviar correo electrónico

Envíe un correo electrónico desde la línea de comando de la siguiente manera:

 ./notify.sh recipient@domain.com "Command Line" "March 14" "15:52"