Comment envoyer un e-mail en utilisant des commandes SMTP simples via Gmail?

à des fins éducatives, je dois envoyer un e-mail via un serveur SMTP, en utilisant les règles fondamentales et simples de SMTP.

j'ai pu le faire en utilisant smtp4dev . I telnet localhost 25 et et les commandes sont:

enter image description here

je veux faire la même chose, en utilisant le serveur SMTP Gmail. Cependant, elle nécessite une authentification et des TLS. Je ne sais pas comment faire pour Gmail. Voici un capture d'écran de telnet smtp.gmail.com 587 :

enter image description here

j'ai cherché et trouvé de nombreux liens dont article de Wikipedia à propos de STARTTLS commande. Mais je ne suis pas capable d'utiliser TLS et d'authentifier le serveur SMTP de Gmail en utilisant la ligne de commande (ou en envoyant des commandes moi-même dans les langages de programmation). Quelqu'un peut-il aider?

62
demandé sur Saeed Neamati 2012-06-15 11:10:11

4 réponses

envoyer par gmail, vous devez utiliser une connexion cryptée. cela n'est pas possible avec telnet seul, mais vous pouvez utiliser des outils comme openssl

ou connectez-vous en utilisant l'option starttls dans openssl pour convertir la connexion simple en crypté...

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

ou raccorder directement à une prise ssl...

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

EHLO localhost

après cela, authentifier au serveur en utilisant le nom d'utilisateur/mot de passe encodé base64

AUTH PLAIN AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmq=

pour obtenir ce de la ligne de commande:

echo -ne '"151900920"user@gmail.com"151900920"password' | base64
AHVzZXJAZ21haWwuY29tAHBhc3N3b3Jk

puis continuer avec "mail from:" comme dans votre exemple

exemple de session:

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: <gryphius-demo@gmail.com>
250 2.1.0 OK m46sm11546481eeh.9
rcpt to: <somepoorguy@example.com>
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
répondu Gryphius 2018-08-13 12:05:01

malheureusement, comme je suis forcé d'utiliser un serveur windows, je n'ai pas été capable de faire fonctionner openssl comme le suggère la réponse ci-dessus.

cependant j'ai pu obtenir un programme similaire appelé stunnel (qui peut être téléchargé à partir de ici ) pour travailler. J'ai eu l'idée de www.tech-and-dev.com mais j'ai dû changer les instructions légèrement. Voici ce que j'ai fait:

  1. Install telnet client sur la fenêtre windows.
  2. télécharger stunnel. (J'ai téléchargé et installé un fichier appelé stunnel-4.56-installer.exe ).
  3. une fois installé, vous avez ensuite eu besoin de localiser le fichier de configuration stunnel.conf , que dans mon cas j'ai installé sur C:\Program Files (x86)\stunnel
  4. ensuite, vous devez ouvrir ce fichier dans un visualiseur de texte tel que bloc-notes . Rechercher [gmail-smtp] et supprimer le point-virgule sur la ligne du client ci-dessous (dans le stunnel.conf fichier, chaque ligne commence par un point-virgule est un commentaire). Vous devriez finir avec quelque chose comme:

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

    une fois que vous avez fait cela, sauvegardez le fichier stunnel.conf et rechargez la configuration (pour ce faire, utilisez le programme GUI de stunnel, et cliquez sur configuration=>rechargez ).

Maintenant, vous devriez être prêt à envoyez un e-mail dans le client Windows telnet!

Aller à Démarrer=>exécuter=>cmd .

une fois que cmd est ouvert, tapez ce qui suit et appuyez sur Entrée:

telnet localhost 25

vous devriez alors voir quelque chose semblable à ce qui suit:

220 mx.google.com ESMTP f14sm1400408wbe.2

vous devrez alors répondre en tapant ce qui suit et en appuyant sur enter:

helo google

cela devrait vous donner le réponse suivante:

250 mx.google.com at your service

si vous obtenez cela, vous devez taper ce qui suit et appuyez sur Entrée:

ehlo google

cela devrait alors vous donner la réponse suivante:

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

Maintenant, vous devriez être prêt à authentifier avec vos détails Gmail. Pour ce faire, tapez ce qui suit et appuyez sur Entrée:

AUTH LOGIN

cela devrait alors vous donner la réponse suivante:

334 VXNlcm5hbWU6

Cela signifie que nous sommes prêts à s'authentifier en utilisant notre adresse gmail et mot de passe.

cependant puisqu'il s'agit d'une session cryptée, nous allons devoir envoyer l'email et le mot de passe encodés dans base64. Pour encoder votre adresse e-mail et votre mot de passe, vous pouvez utiliser un programme de conversion ou un site Web en ligne (par exemple base64 ou rechercher sur google ’base64 online encoding’ ). Je vous conseille d' vous ne toucherez plus à la session cmd/telnet tant que vous ne l'aurez pas fait.

par exemple test@gmail.com deviendra dGVzdEBnbWFpbC5jb20= et le mot de passe deviendra cGFzc3dvcmQ= "1519390920

une fois que vous avez fait cette copie et collez votre nom d'utilisateur base64 converti dans la session cmd/telnet et appuyez sur Entrée. Cela devrait vous donner la réponse suivante:

334 UGFzc3dvcmQ6

maintenant, copiez et collez votre mot de passe converti de base64 dans la session cmd/telnet et appuyez sur Entrée. Ceci devrait vous donner la réponse suivante si les deux identifiants de connexion sont corrects:

235 2.7.0 Accepted

vous devez maintenant entrer le courriel de l'expéditeur (doit être le même que le nom d'utilisateur) dans le format suivant et appuyez sur Entrée:

MAIL FROM:<test@gmail.com>

Cela devrait vous donner la réponse suivante:

250 2.1.0 OK x23sm1104292weq.10

vous pouvez maintenant, entrez l'adresse email du destinataire dans un format similaire et appuyez sur ENTRER:

RCPT TO:<recipient@gmail.com>

Cela devrait vous donner la réponse suivante:

250 2.1.5 OK x23sm1104292weq.10

maintenant, vous devez taper ce qui suit et appuyez sur Entrée:

DATA

Qui devrait vous donner la réponse suivante:

354  Go ahead x23sm1104292weq.10

Maintenant, nous pouvons commencer à composer le message! Pour ce faire, entrez votre message dans la suite format ( Tip : faites ceci dans le bloc-notes et copiez le message entier dans la session cmd/telnet):

From: Test <test@gmail.com>
To: Me <recipient@gmail.com>
Subject: Testing email from telnet
This is the body

Adding more lines to the body message.

lorsque vous avez terminé l'email Entrez un point:

.

Cela devrait vous donner la réponse suivante:

250 2.0.0 OK 1288307376 x23sm1104292weq.10

et maintenant vous devez terminer votre session en tapant ce qui suit et en appuyant sur Entrée:

QUIT

Cela devrait vous donner la réponse suivante:

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

et votre courriel devrait maintenant être dans la boîte aux lettres du destinataire!

23
répondu Exile 2015-01-27 20:02:55

comme personne ne l'a mentionné - je suggérerais d'utiliser grand outil pour un tel but - 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.

il a beaucoup d'options et peut faire presque tout ce que vous voulez.

GMAIL: STARTTLS, SSLv3 (et oui, en 2016 gmail supporte toujours 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:<user@gmail.com>
<~  250 2.1.0 OK h8sm76342lbd.48 - gsmtp
 ~> RCPT TO:<user@example.net>
<~  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 alias 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:<user@yahoo.com>
<~  250 OK , completed
 ~> RCPT TO:<user@gmail.com>
<~  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.

j'ai utilise swaks pour envoyer des notifications par email depuis nagios via gmail depuis 5 ans sans aucun problème.

4
répondu ALex_hha 2016-02-17 10:30:05

basé sur les réponses existantes, voici un guide étape par étape pour envoyer des e-mails automatisés sur SMTP, en utilisant un compte GMail, à partir de la ligne de commande, sans divulguer le mot de passe.

exigences

d'abord, installer les progiciels suivants:

ces instructions supposent un système D'exploitation Linux, mais devraient être raisonnablement facile à porter à Windows (via Cygwin ou équivalents natifs), ou un autre système d'exploitation.

authentification

Enregistrer le script suivant 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=""151900920"$email"151900920"$password"

echo -ne $TEXT | base64

le rendre exécutable et l'exécuter comme suit:

chmod +x authentication.sh
./authentication.sh

quand invité, indiquez votre adresse e-mail et votre mot de passe. Cela ressemblera à quelque chose comme:

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

copier la dernière ligne ( AGJ...== ), car elle sera utilisée pour l'authentification.

Notification

Enregistrer les suivants script expect notify.sh (note la première ligne désigne le fait de s'attendre d'un programme):

#!/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"
            }
          }
        }
      }
    }
  }
}

faire les changements suivants:

  1. Paste plus de YOUR_AUTHENTICATION_CODE avec le code d'authentification généré par le script d'authentification.
  2. modifier YOUR_EMAIL_ADDRESS avec l'adresse e-mail utilisée pour générer le code d'authentification.
  3. Enregistrer le fichier.

par exemple (notez que les crochets d'angle sont conservés pour l'adresse e-mail):

send "AUTH PLAIN AGJvYkBnbWFpbC5jb20AYm9iaXN0aGViZXN0cGVyc29uZXZlcg==\n"
send "MAIL FROM: <bob@gmail.com>\n"

enfin, rendre le script de notification exécutable comme suit:

chmod +x notify.sh

envoyer E-mail

envoyer un e-mail de la ligne de commande comme suit:

./notify.sh recipient@domain.com "Command Line" "March 14" "15:52"
2
répondu Dave Jarvis 2016-08-01 18:44:09