it-swarm-es.com

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

Para fines educativos, necesito enviar un correo electrónico a través de un servidor SMTP, utilizando las reglas fundamentales y simples de SMTP.

Pude hacer eso usando smtp4dev . Yo telnet localhost 25 yy 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 averiguar cómo hacerlo para Gmail. Aquí hay una captura de pantalla de telnet smtp.gmail.com 587:

enter image description here

Busqué y encontré muchos enlaces incluyendo Artículo de Wikipedia sobre el comando STARTTLS. Pero no puedo usar TLS y autenticar en el servidor SMTP de Gmail mediante la línea de comandos (o enviar comandos a mí mismo en lenguajes de programación) ¿Alguien puede ayudar?

62
Saeed Neamati

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

cualquiera conecta usando la opción starttls en openssl para convertir la conexión simple a cifrada ...

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

o conectarse a un sock sock 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 '\[email protected]\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: <[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
104
Gryphius

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

Sin embargo, pude obtener un programa similar llamado stunnel (que se puede descargar desde aquí ) para que funcione. Obtuve la idea de www.tech-and-dev.com pero tuve que cambiar las instrucciones ligeramente. Aquí esta lo que hice:

  1. Instale el cliente telnet en el cuadro de ventanas.
  2. Descargar stunnel. (Descargué e instalé un archivo llamado stunnel-4.56-installer.exe).
  3. Una vez instalado, necesitabas localizar el archivo de configuración stunnel.conf, que en mi caso instalé para C:\Program Files (x86)\stunnel
  4. Luego, necesita abrir este archivo en un visor de texto como bloc de notas. Busque [gmail-smtp] y elimine el punto y coma en la línea del cliente que se encuentra debajo (en el archivo stunnel.conf, todas las líneas que comienzan con un punto y coma son comentarios). 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 reload the config (para hacer esto use el programa GUI stunnel, y haga clic en configuration => Reload).

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

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

telnet localhost 25

Entonces deberías ver algo similar a lo siguiente:

220 mx.google.com ESMTP f14sm1400408wbe.2

Luego deberá responder escribiendo lo siguiente y presionando entrar:

helo google

Esto debería darte la siguiente respuesta:

250 mx.google.com at your service

Si obtienes esto, debes escribir lo siguiente y presionar enter:

ehlo google

Esto debería darte 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 debería estar listo para autenticarse con sus datos de Gmail. Para ello escribe lo siguiente y pulsa enter:

AUTH LOGIN

Esto debería darte la siguiente respuesta:

334 VXNlcm5hbWU6

Esto significa que estamos listos para autenticarse usando nuestra dirección y contraseña de Gmail.

Sin embargo, como 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 convertidor o un sitio web en línea para codificarlo (por ejemplo base64 o buscar en google para ’codificación en línea de base64’) Le recomiendo que no vuelva a tocar la sesión 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 que haya hecho esta copia, pegue su nombre de usuario base64 convertido en la sesión cmd/telnet y presione enter. Esto debería darte la siguiente respuesta:

334 UGFzc3dvcmQ6

Ahora copie y pegue su contraseña de base64 convertida en la sesión cmd/telnet y presione enter. Esto debería darte 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 intro:

MAIL FROM:<[email protected]>

Esto debería darte 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 intro:

RCPT TO:<[email protected]>

Esto debería darte la siguiente respuesta:

250 2.1.5 OK x23sm1104292weq.10

Ahora deberás escribir lo siguiente y presionar enter:

DATA

Lo que debería darte la siguiente respuesta:

354  Go ahead x23sm1104292weq.10

¡Ahora podemos empezar a redactar el mensaje! Para hacer esto, ingrese su mensaje en el siguiente formato (Consejo: haga esto en el bloc de notas y copie el mensaje completo en la sesión 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 introduce un punto:

.

Esto debería darte la siguiente respuesta:

250 2.0.0 OK 1288307376 x23sm1104292weq.10

Y ahora necesita terminar su sesión escribiendo lo siguiente y presionando entrar:

QUIT

Esto debería darte la siguiente respuesta:

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

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

24
Exile

Como nadie lo ha mencionado, sugeriría usar 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 usando swaks para enviar notificaciones de correo electrónico de nagios a través de gmail durante los últimos 5 años sin ningún problema.

5
ALex_hha

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.

Requerimientos

Primero, instale los siguientes paquetes de software:

Estas instrucciones asumen un sistema operativo Linux, pero deben ser razonablemente fáciles 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 como:

Email (shown): [email protected]
Password (hidden): 
AGJvYkBnbWFpbC5jb20AYm9iaXN0aGViZXN0cGVyc29uZXZlcg==

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

Notificación

Guarde la siguiente secuencia de comandos expect como notify.sh (tenga en cuenta que la primera línea se refiere al programa expect):

#!/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:

  1. Pegue 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: <[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"
3
Dave Jarvis