Jak wysyłać wiadomości e-mail za pomocą prostych poleceń SMTP przez Gmail?

W celach edukacyjnych, muszę wysłać e-mail przez serwer SMTP, używając podstawowych i prostych zasad SMTP.

Udało mi się to zrobić za pomocą smtp4dev . I telnet localhost 25 oraz komendy i to:

Tutaj wpisz opis obrazka

Chcę zrobić to samo, używając serwera Gmail SMTP. Wymaga jednak uwierzytelniania i TLS. Nie wiem, jak to zrobić dla Gmaila. Oto zrzut ekranu telnet smtp.gmail.com 587:

Tutaj wpisz opis obrazka

Szukałem i znalazłem wiele linków, w tym artykuł Wikipedii o STARTTLS poleceniu. Ale nie jestem w stanie używać TLS i uwierzytelniać się na serwerze SMTP Gmaila za pomocą wiersza poleceń (lub wysyłania poleceń samodzielnie w językach programowania). Czy ktoś może pomóc?

Author: Saeed Neamati, 2012-06-15

4 answers

Aby wysłać przez gmail, musisz użyć szyfrowanego połączenia. nie jest to możliwe tylko z telnet, ale możesz użyć narzędzi takich jak openssl

połącz się za pomocą opcji starttls w OpenSSL, aby przekonwertować zwykłe połączenie na szyfrowane...

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

lub połączyć się bezpośrednio z ssl sockect...

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

EHLO localhost

Następnie Uwierzytelnij się na serwerze za pomocą zakodowanej nazwy użytkownika/hasła base64

Author AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmq=

Aby pobrać to z linii poleceń:

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

Następnie kontynuuj "mail from:" jak w twoim przykładzie

Przykładowa sesja:

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
Author: Gryphius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-13 12:05:01

Niestety, ponieważ jestem zmuszony do korzystania z serwera windows, nie byłem w stanie uruchomić openssl tak, jak sugeruje powyższa odpowiedź.

Udało mi się jednak uruchomić podobny program o nazwie stunnel (który można pobrać z tutaj ). Mam pomysł z www.tech-and-dev.com ale musiałem nieco zmienić instrukcje. Oto co zrobiłem:

  1. zainstaluj klienta telnet w oknie windows.
  2. Pobierz stunnel. (Ściągnąłem i zainstalował plik o nazwie stunnel-4.56-installer.exe ).
  3. Po zainstalowaniu konieczne było zlokalizowanie pliku konfiguracyjnego stunnel.conf, który w moim przypadku zainstalowałem na C:\Program Files (x86)\stunnel
  4. Następnie należy otworzyć ten plik w przeglądarce tekstu, takiej jak notatnik. Poszukaj [gmail-smtp] i usuń średnik w linii klienta poniżej (w stunnelu.plik conf, każda linia zaczynająca się średnikiem jest komentarzem). Powinieneś skończyć z czymś takim:

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

    Once w tym celu należy zapisać plik stunnel.confi reload config (w tym celu należy skorzystać z GUI programu stunnel i kliknąć na configuration = > Reload).

Teraz powinieneś być gotowy do wysyłania wiadomości e-mail w kliencie Windows telnet!
Przejdź do Start= > run= > cmd.

Po otwarciu cmd wpisz następujący tekst i naciśnij Enter:

telnet localhost 25

Powinieneś zobaczyć coś podobnego do następującego:

220 mx.google.com ESMTP f14sm1400408wbe.2

Będziesz musiał odpowiedzieć przez wpisując następujący tekst i naciskając enter:

helo google

To powinno dać ci następującą odpowiedź:

250 mx.google.com at your service

Jeśli to dostaniesz, musisz wpisać następujący tekst i nacisnąć enter:

ehlo google

To powinno dać ci następującą odpowiedź:

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

Teraz powinieneś być gotowy do uwierzytelnienia za pomocą danych Gmaila. Aby to zrobić, wpisz następujący tekst i naciśnij enter:

AUTH LOGIN

To powinno dać ci następującą odpowiedź:

334 VXNlcm5hbWU6

To oznacza to, że jesteśmy gotowi do uwierzytelnienia za pomocą naszego adresu gmail i hasła.

Jednak ponieważ jest to zaszyfrowana sesja, będziemy musieli wysłać e-mail i hasło zakodowane w base64. Aby zakodować swój adres e-mail i hasło, możesz użyć programu konwertera lub strony internetowej, aby go zakodować (na przykład base64 lub wyszukać w google 'Base64 online encoding'). Zalecam, aby nie dotykać sesji cmd/telnet ponownie, dopóki tego nie zrobisz.

Na przykład [email protected] stałoby się dGVzdEBnbWFpbC5jb20=a hasło stałoby się cGFzc3dvcmQ=

Po wykonaniu tej czynności skopiuj i wklej przekonwertowaną nazwę użytkownika base64 do sesji cmd / telnet i naciśnij enter. To powinno dać ci następującą odpowiedź:

334 UGFzc3dvcmQ6

Teraz skopiuj i wklej przekonwertowane hasło base64 do sesji cmd / telnet i naciśnij enter. To powinno dać następujące odpowiedzi, jeśli zarówno logowania uprawnienia są poprawne:

235 2.7.0 Accepted

Należy teraz wprowadzić adres e-mail nadawcy (powinien być taki sam jak nazwa użytkownika) w następującym formacie i nacisnąć enter:

MAIL FROM:<[email protected]>

To powinno dać ci następującą odpowiedź:

250 2.1.0 OK x23sm1104292weq.10

Możesz teraz wprowadzić adres e-mail odbiorcy w podobnym formacie i nacisnąć enter:

RCPT TO:<[email protected]>

To powinno dać ci następującą odpowiedź:

250 2.1.5 OK x23sm1104292weq.10

Teraz musisz wpisać następujący tekst i nacisnąć enter:

DATA

Co powinno dać ci następującą odpowiedź:

354  Go ahead x23sm1104292weq.10

Teraz możemy zacząć komponować wiadomość! W tym celu wprowadź wiadomość w następującym formacie (Tip: aby to zrobić w notatniku i skopiować całą wiadomość do sesji 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.

Po zakończeniu e-maila wpisz kropkę:

.

To powinno dać ci następującą odpowiedź:

250 2.0.0 OK 1288307376 x23sm1104292weq.10

A teraz musisz zakończyć sesję wpisując PO i naciśnięciu enter:

QUIT

To powinno dać ci następującą odpowiedź:

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

A twój e-mail powinien być teraz w skrzynce odbiorczej!

 23
Author: Exile,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-27 20:02:55

Jak nikt nie wspomniał - proponuję użyć do tego celu świetnego narzędzia - 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.

Ma wiele opcji i może zrobić prawie wszystko, co chcesz.

GMAIL: STARTTLS, SSLv3 (i tak, w 2016 roku gmail nadal obsługuje 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 vel 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.

Używam swaks do wysyłania powiadomień e-mail z nagios za pośrednictwem Gmaila przez ostatnie 5 lat bez żadnego problemu.

 4
Author: ALex_hha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-17 10:30:05

W oparciu o istniejące odpowiedzi, oto przewodnik krok po kroku do wysyłania automatycznych wiadomości e-mail przez SMTP, przy użyciu konta GMail, z linii poleceń, bez ujawniania hasła.

Wymagania

Najpierw zainstaluj następujące pakiety oprogramowania:

Te instrukcje zakładają System Operacyjny Linux, ale powinny być w miarę łatwe do przeniesienia do Windows (poprzez Cygwin lub natywne odpowiedniki) lub innego systemu operacyjnego.

Uwierzytelnianie

Zapisz następujący skrypt powłoki jako 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

Utwórz plik wykonywalny i uruchom go w następujący sposób:

chmod +x authentication.sh
./authentication.sh

Po wyświetleniu monitu podaj swój adres e-mail i hasło. To będzie wyglądało tak:

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

Skopiuj ostatnią linię (AGJ...==), ponieważ będzie ona używana do uwierzytelniania.

Zgłoszenie

Zapisz następujący skrypt expect jako notify.sh (Uwaga pierwsza linia odnosi się do programu 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"
            }
          }
        }
      }
    }
  }
}

Wprowadzić następujące zmiany:

  1. Wklej YOUR_AUTHENTICATION_CODE z kodem uwierzytelniania wygenerowanym przez skrypt uwierzytelniania.
  2. Zmień YOUR_EMAIL_ADDRESS adres e-mail użyty do wygenerowania kodu uwierzytelniającego.
  3. Zapisz plik.

Na przykład (uwaga nawiasy kątowe są zachowane dla adresu e-mail):

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

Na koniec uczyń skrypt notify wykonywalnym jako następuje:

chmod +x notify.sh

Wyślij E-mail

Wyślij e-mail z linii poleceń w następujący sposób:

./notify.sh [email protected] "Command Line" "March 14" "15:52"
 2
Author: Dave Jarvis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-01 18:44:09