web-dev-qa-db-fra.com

Comment envoyer un email en utilisant de simples commandes SMTP via Gmail?

À des fins éducatives, je dois envoyer un courrier électronique via un serveur SMTP, en utilisant les règles fondamentales et simples de SMTP.

J'ai pu faire cela en utilisant smtp4dev . JE telnet localhost 25 et et les commandes sont:

enter image description here

Je souhaite faire la même chose en utilisant le serveur SMTP Gmail. Cependant, cela nécessite une authentification et TLS. Je n'arrive pas à comprendre comment faire cela pour Gmail. Voici une capture d'écran de telnet smtp.gmail.com 587:

enter image description here

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

62
Saeed Neamati

pour envoyer sur gmail, vous devez utiliser une connexion cryptée. ce n'est pas possible avec telnet seul, mais vous pouvez utiliser des outils tels que openssl

soit connectez-vous à l'aide de l'option starttls dans openssl pour convertir la connexion standard en fichier crypté ...

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

ou connectez-vous directement à un sockect ssl ...

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

EHLO localhost

après cela, authentifiez-vous sur le serveur en utilisant le nom d'utilisateur/mot de passe codé en base64

AUTH PLAIN AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ =

pour l'obtenir depuis la ligne de commande:

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

puis continuez 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: <[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
105
Gryphius

Malheureusement, comme je suis obligé d'utiliser un serveur Windows, je ne parviens pas à 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é depuis ici ) pour fonctionner. J'ai eu l'idée de www.tech-and-dev.com mais j'ai dû changer légèrement les instructions. Voici ce que j'ai fait:

  1. Installez le client telnet sur la fenêtre.
  2. Téléchargez stunnel. (J'ai téléchargé et installé un fichier nommé stunnel-4.56-installer.exe).
  3. Une fois installé, vous devez ensuite localiser le fichier de configuration stunnel.conf, Que j'ai installé dans mon cas sur C:\Program Files (x86)\stunnel
  4. Ensuite, vous devez ouvrir ce fichier dans une visionneuse de texte telle que notepad. Recherchez [gmail-smtp] Et supprimez le point-virgule sur la ligne client ci-dessous (dans le fichier stunnel.conf, chaque ligne commençant par un point-virgule est un commentaire). Vous devriez vous retrouver avec quelque chose comme:

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

    Une fois que cela est fait, sauvegardez le fichier stunnel.conf Et rechargez la configuration (pour ce faire, utilisez le programme stunnel GUI, puis cliquez sur - configuration => Recharger).

Vous devriez maintenant être prêt à envoyer un courrier électronique dans le client Windows Telnet!
Allez à 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 de similaire au suivant:

220 mx.google.com ESMTP f14sm1400408wbe.2

Vous devrez ensuite répondre en tapant ce qui suit et en appuyant sur Entrée:

helo google

Cela devrait vous donner la réponse suivante:

250 mx.google.com at your service

Si vous obtenez cela, vous devez alors taper ce qui suit et appuyer 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

Vous devriez maintenant être prêt à vous 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 à nous authentifier en utilisant notre adresse gmail et notre mot de passe.

Cependant, puisqu'il s'agit d'une session chiffrée, nous devrons envoyer le courrier électronique et le mot de passe codés en base64. Pour encoder votre email et votre mot de passe, vous pouvez utiliser un programme de conversion ou un site Web en ligne pour l’encoder (par exemple base64 ou recherchez sur Google le site 'encodage en ligne base64 ’). Je vous recommande de ne pas toucher à la session cmd/telnet tant que vous ne l'avez pas fait.

Par exemple, [email protected] deviendrait dGVzdEBnbWFpbC5jb20 = et le mot de passe deviendrait cGFzc3dvcmQ =

Une fois que vous avez terminé, copiez 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 base64 converti dans la session cmd/telnet et appuyez sur entrée. Cela 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 courrier électronique de l'expéditeur (il devrait être identique au nom d'utilisateur) au format suivant et appuyer sur la touche Entrée:

MAIL FROM:<[email protected]>

Cela devrait vous donner la réponse suivante:

250 2.1.0 OK x23sm1104292weq.10

Vous pouvez maintenant entrer l'adresse électronique du destinataire dans un format similaire et appuyer sur Entrée:

RCPT TO:<[email protected]>

Cela devrait vous donner la réponse suivante:

250 2.1.5 OK x23sm1104292weq.10

Maintenant, vous devrez taper ce qui suit et appuyer sur Entrée:

DATA

Ce 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 au format suivant (Astuce: faites-le dans le bloc-notes et copiez le message dans son intégralité dans la cmd./session 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.

Quand vous avez fini 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 email devrait maintenant être dans la boîte aux lettres du destinataire!

24
Exile

Comme personne ne l’a mentionné - je suggérerais d’utiliser un excellent outil à cette 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.

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

GMAIL: STARTTLS, SSLv (et oui, en 2016, Gmail prend toujours en charge 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 aussi nommé 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.

J'utilise swaks pour envoyer des notifications par courrier électronique de nagios via gmail depuis 5 ans sans aucun problème.

5
ALex_hha

Sur la base des réponses existantes, voici un guide pas à pas pour envoyer des courriers électroniques automatisés via SMTP, à l'aide d'un compte GMail, à partir de la ligne de commande, sans révéler le mot de passe.

Exigences

Commencez par installer les progiciels suivants:

Ces instructions s’appliquent à un système d’exploitation Linux, mais devraient pouvoir être portées facilement vers Windows (via Cygwin ou des équivalents natifs) ou un autre système d’exploitation.

Authentification

Enregistrez le script Shell suivant sous le nom 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

Rendez-le exécutable et exécutez-le comme suit:

chmod +x authentication.sh
./authentication.sh

Lorsque vous y êtes invité, indiquez votre adresse électronique et votre mot de passe. Cela ressemblera à quelque chose comme:

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

Copier la dernière ligne (AGJ...==), comme cela sera utilisé pour l'authentification.

Notification

Enregistrez le script attendu suivant sous notify.sh (notez que la première ligne fait référence au programme attendu):

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

Apportez les modifications suivantes:

  1. Coller sur YOUR_AUTHENTICATION_CODE avec le code d'authentification généré par le script d'authentification.
  2. Changement YOUR_EMAIL_ADDRESS avec l’adresse e-mail utilisée pour générer le code d’authentification.
  3. Enregistrez le fichier.

Par exemple (notez que les crochets sont conservés pour l'adresse de messagerie):

send "AUTH PLAIN AGJvYkBnbWFpbC5jb20AYm9iaXN0aGViZXN0cGVyc29uZXZlcg==\n"
send "MAIL FROM: <[email protected]>\n"

Enfin, rendez le script de notification exécutable comme suit:

chmod +x notify.sh

Envoyer un e-mail

Envoyez un courrier électronique à partir de la ligne de commande comme suit:

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