email - servidor - ¿Cómo enviar correos electrónicos usando simples comandos SMTP a través de Gmail?
smtp gmail (4)
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:
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
:
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 programación). ¿Alguien puede ayudar?
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:
- Expect
- 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): [email protected]
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 programa 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: <YOUR_EMAIL_ADDRESS>/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:
- Pega sobre
YOUR_AUTHENTICATION_CODE
con el código de autenticación generado por el script de autenticación. - Cambie
YOUR_EMAIL_ADDRESS
con la dirección de correo electrónico utilizada para generar el código de autenticación. - 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: <[email protected]>/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 [email protected] "Command Line" "March 14" "15:52"
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 [email protected] --to [email protected] -tls --tls-protocol sslv3 --auth PLAIN --auth-user [email protected] --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:<[email protected]>
<~ 250 2.1.0 OK h8sm76342lbd.48 - gsmtp
~> RCPT TO:<[email protected]>
<~ 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: [email protected]
~> From: [email protected]
~> 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 [email protected] --to [email protected] --tlsc --tls-protocol tlsv1_2 --auth PLAIN --auth-user [email protected] --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:<[email protected]>
<~ 250 OK , completed
~> RCPT TO:<[email protected]>
<~ 250 OK , completed
~> DATA
<~ 354 Start Mail. End with CRLF.CRLF
~> Date: Wed, 17 Feb 2016 10:08:28 +0000
~> To: [email protected]
~> From: [email protected]
~> 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.
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 programa similar llamado stunnel (que se puede descargar desde here ). Obtuve la idea de www.tech-and-dev.com pero tuve que cambiar las instrucciones un poco. Aquí esta lo que hice:
- Instale el cliente telnet en el cuadro de Windows.
- Descargar stunnel. (Descargué e instalé un archivo llamado stunnel-4.56-installer.exe ).
- Una vez instalado, necesitaba ubicar el archivo de configuración
stunnel.conf
, que en mi caso instalé enC:/Program Files (x86)/stunnel
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 programa 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 programa conversor o un sitio web en línea para codificarlo (por ejemplo, base64 o buscar en google ''codificación en línea base64'' ). Recomiendo que no vuelva a tocar la sesión de cmd / telnet hasta que haya hecho esto.
Por ejemplo, [email protected] 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:<[email protected]>
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:<[email protected]>
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 <[email protected]>
To: Me <[email protected]>
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!
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 utilizando el nombre de usuario / contraseña codificado en base64
AUTH PLAIN AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ =
para obtener esto desde la línea de comandos:
perl -MMIME::Base64 -e ''print encode_base64("/000myemail/@gmail.com/000mypassword")''
AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ=
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: <[email protected]>
250 2.1.0 OK m46sm11546481eeh.9
rcpt to: <[email protected]>
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