Come inviare e-mail utilizzando semplici comandi SMTP tramite Gmail?

Per scopi didattici, ho bisogno di inviare una e-mail attraverso un server SMTP, utilizzando le regole fondamentali e semplici di SMTP.

Sono stato in grado di farlo usando smtp4dev . I telnet localhost 25 e i comandi sono:

inserisci la descrizione dell'immagine qui

Voglio fare la stessa cosa, usando il server SMTP di Gmail. Tuttavia, richiede l’autenticazione e TLS. Non riesco a capire come farlo per Gmail. Ecco uno screenshot di telnet smtp.gmail.com 587 :

inserisci la descrizione dell'immagine qui

Ho cercato e trovato molti link tra cui l’articolo di Wikipedia sul comando STARTTLS . Ma non sono in grado di utilizzare TLS e autenticarsi sul server SMTP di Gmail utilizzando la riga di comando (o inviando comandi da solo nei linguaggi di programmazione). Qualcuno può aiutare?

per inviare su Gmail, è necessario utilizzare una connessione crittografata. questo non è ansible con telnet da solo, ma puoi usare strumenti come openssl

Connettiti usando l’opzione starttls in openssl per convertire la semplice connessione in crittografata …

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

o connettersi direttamente a un sockect ssl …

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

EHLO localhost

successivamente, autenticare il server usando il nome utente / password codificati in base64

AUTH PLAIN AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ =

per ottenere questo dalla riga di comando:

 echo -ne '\[email protected]\00password' | base64 AHVzZXJAZ21haWwuY29tAHBhc3N3b3Jk 

quindi continua con “posta da:” come nel tuo esempio

sessione di esempio:

 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 

Sfortunatamente, dato che sono costretto a utilizzare un server Windows, non sono riuscito a ottenere openssl funzionante nel modo suggerito dalla risposta sopra.

Tuttavia, sono riuscito a ottenere un programma simile chiamato stunnel (che può essere scaricato da qui ) per funzionare. Ho avuto l’idea da http://www.tech-and-dev.com ma ho dovuto cambiare leggermente le istruzioni. Ecco cosa ho fatto:

  1. Installa il client telnet sulla finestra di Windows.
  2. Scarica stunnel. (Ho scaricato e installato un file chiamato stunnel-4.56-installer.exe ).
  3. Una volta installato, era quindi necessario localizzare il file di configurazione stunnel.conf , che nel mio caso ho installato su C:\Program Files (x86)\stunnel
  4. Quindi, è necessario aprire questo file in un visualizzatore di testo come il blocco note . Cerca [gmail-smtp] e rimuovi il punto e virgola sulla riga del client sottostante (nel file stunnel.conf, ogni riga che inizia con un punto e virgola è un commento). Dovresti finire con qualcosa come:

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

    Una volta fatto questo, salva il file stunnel.conf e ricarica la configurazione (per farlo usa il programma GUI stunnel e fai clic su configuration => Ricarica ).

Ora dovresti essere pronto per inviare email nel client telnet di Windows!
Vai a Start => run => cmd .

Una volta che cmd è aperto, digita quanto segue e premi Invio:

 telnet localhost 25 

Dovresti quindi vedere qualcosa di simile al seguente:

 220 mx.google.com ESMTP f14sm1400408wbe.2 

Dovrai quindi rispondere digitando quanto segue e premendo invio:

 helo google 

Questo dovrebbe darti la seguente risposta:

 250 mx.google.com at your service 

Se ottieni questo, allora devi digitare quanto segue e premere invio:

 ehlo google 

Questo dovrebbe quindi darti la seguente risposta:

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

Ora dovresti essere pronto per l’autenticazione con i tuoi dettagli Gmail. Per fare questo digitare quanto segue e premere invio:

 AUTH LOGIN 

Questo dovrebbe quindi darti la seguente risposta:

 334 VXNlcm5hbWU6 

Ciò significa che siamo pronti per l’autenticazione utilizzando il nostro indirizzo e password Gmail.

Tuttavia, poiché questa è una sessione crittografata, dovremo inviare l’e-mail e la password codificate in base64. Per codificare email e password, puoi utilizzare un programma di conversione o un sito web online per codificarlo (ad esempio base64 o cercare su google per “codifica online base64” ). Ti consiglio di non toccare di nuovo la sessione cmd / telnet fino a quando non lo hai fatto.

Ad esempio [email protected] diventerebbe dGVzdEBnbWFpbC5jb20 = e la password diventerebbe cGFzc3dvcmQ =

Una volta eseguita questa operazione, copia e incolla il tuo nome utente base64 convertito nella sessione cmd / telnet e premi invio. Questo dovrebbe darti la seguente risposta:

 334 UGFzc3dvcmQ6 

Ora copia e incolla la tua password base64 convertita nella sessione cmd / telnet e premi invio. Questo dovrebbe darti la seguente risposta se entrambe le credenziali di accesso sono corrette:

 235 2.7.0 Accepted 

Ora dovresti inserire l’email del mittente (dovrebbe essere uguale al nome utente) nel seguente formato e premere invio:

 MAIL FROM: 

Questo dovrebbe darti la seguente risposta:

 250 2.1.0 OK x23sm1104292weq.10 

Ora puoi inserire l’indirizzo email del destinatario in un formato simile e premere invio:

 RCPT TO: 

Questo dovrebbe darti la seguente risposta:

 250 2.1.5 OK x23sm1104292weq.10 

Ora dovrai digitare quanto segue e premere invio:

 DATA 

Quale dovrebbe darti la seguente risposta:

 354 Go ahead x23sm1104292weq.10 

Ora possiamo iniziare a comporre il messaggio! Per fare ciò inserisci il tuo messaggio nel seguente formato ( Suggerimento : fallo nel blocco note e copia l’intero messaggio nella sessione cmd / telnet):

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

Quando hai finito l’email, inserisci un punto:

 . 

Questo dovrebbe darti la seguente risposta:

 250 2.0.0 OK 1288307376 x23sm1104292weq.10 

E ora devi terminare la sessione digitando quanto segue e premendo invio:

 QUIT 

Questo dovrebbe darti la seguente risposta:

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

E la tua email dovrebbe ora essere nella casella di posta del destinatario!

Come nessuno ha menzionato, suggerirei di utilizzare un ottimo strumento per tale scopo: 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. 

Ha un sacco di opzioni e può fare quasi tutto quello che vuoi.

GMAIL: STARTTLS, SSLv3 (e sì, nel 2016 gmail supporta ancora 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: <~ 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: [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 aka 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: <~ 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: [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. 

Ho usato swaks per inviare notifiche email da nagios via gmail per gli ultimi 5 anni senza alcun problema.

Sulla base delle risposte esistenti, ecco una guida passo passo per l’invio di e-mail automatizzate via SMTP, utilizzando un account GMail, dalla riga di comando, senza rivelare la password.

Requisiti

Innanzitutto, installa i seguenti pacchetti software:

  • Aspettarsi
  • OpenSSL
  • Core Utils (base64)

Queste istruzioni presuppongono un sistema operativo Linux, ma dovrebbero essere ragionevolmente facili da eseguire su Windows (tramite Cygwin o equivalenti nativi) o su un altro sistema operativo.

Autenticazione

Salva il seguente script di shell come 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 

Rendilo eseguibile ed eseguilo come segue:

 chmod +x authentication.sh ./authentication.sh 

Quando richiesto, fornire il proprio indirizzo e-mail e password. Questo assomiglierà a qualcosa:

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

Copia l’ultima riga ( AGJ...== ), in quanto verrà utilizzata per l’autenticazione.

Notifica

Salva il seguente script di aspettativa come notify.sh (nota che la prima riga si riferisce al programma 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: \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" } } } } } } } 

Apporta le seguenti modifiche:

  1. Incolla su YOUR_AUTHENTICATION_CODE con il codice di autenticazione generato dallo script di autenticazione.
  2. Cambia YOUR_EMAIL_ADDRESS con l’indirizzo e-mail utilizzato per generare il codice di autenticazione.
  3. Salva il file.

Ad esempio (si noti che le parentesi angolari vengono mantenute per l’indirizzo e-mail):

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

Infine, rendi eseguibile lo script di notifica nel modo seguente:

 chmod +x notify.sh 

Invia una email

Invia una e-mail dalla riga di comando come segue:

 ./notify.sh [email protected] "Command Line" "March 14" "15:52"