2012-06-15 12 views
60

Do celów edukacyjnych muszę wysłać wiadomość e-mail za pośrednictwem serwera SMTP, używając podstawowych i prostych reguł SMTP.Jak wysyłać wiadomości e-mail za pomocą prostych poleceń SMTP za pośrednictwem Gmaila?

Udało mi się to zrobić, używając smtp4dev. I telnet localhost 25 i i polecenia są:

enter image description here

chcę zrobić to samo, za pomocą serwera Gmail SMTP. Wymaga jednak uwierzytelnienia i TLS. Nie mogę wymyślić, jak to zrobić w Gmailu. Oto zrzut ekranu z telnet smtp.gmail.com 587:

enter image description here

Szukałem i znalazłem wiele linków tym Wikipedia's article o STARTTLS polecenia. Nie mogę jednak korzystać z TLS i uwierzytelniać się na serwerze SMTP Gmaila za pomocą wiersza poleceń (lub wysyłać polecenia samodzielnie w językach programowania). Czy ktoś może pomóc?

+0

Można napisać własny program, aby to zrobić, używając na przykład Java. –

+0

Dlaczego nie używasz portu 25 w Gmailu (tak jak na własnym serwerze)? – vbence

+0

Tutaj jest przewodnik: http://linuxmeerkat.wordpress.com/2013/10/10/emailing-from-a-gmail-acount-via-telnet/ – Pithikos

Odpowiedz

100

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

obu połączyć za pomocą opcji StartTLS w OpenSSL do konwersji zwykłego połączenia szyfrowane ...

openssl s_client -starttls SMTP - połączyć smtp.gmail.com:587 -crlf -ign_eof

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

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

EHLO localhost

po tym, uwierzytelnienia na serwerze za pomocą base64 zakodowany login/hasło

AUTH PLAIN AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ =

dostać to z linii poleceń:

perl -MMIME::Base64 -e 'print encode_base64("\000myemail\@gmail.com\000mypassword")' 
AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ= 

następnie przejdź do sekcji „MAIL FROM:” jak w przykładzie

przykład 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 
+0

Zainstalowałem OpenSSL, ale do wiersza poleceń nie dodano żadnego polecenia. Gdzie powinienem uzyskać komendę openssl w CMD? –

+1

Niestety, nie wiem, gdzie jest zainstalowany plik windowsowy openssl, używam linuxa tutaj. – Gryphius

+0

@Gryphius Otrzymuję OpenSSL Zweryfikuj kod powrotu: 20 (nie można uzyskać certyfikatu lokalnego wydawcy), tj. Uwierzytelnienie klienta nie powiodło się, nadal jestem w stanie wysłać e-mail jak powyżej, czy mógłbyś wyjaśnić dlaczego? –

21

Niestety jak jestem zmuszony do korzystania z serwera Windows I nie były w stanie uzyskać openssl pracy w sposób sugeruje powyższa odpowiedź.

Jednak udało mi się uzyskać podobny program o nazwie stunnel (który można pobrać z here) do pracy. Wpadłem na pomysł z www.tech-and-dev.com, ale musiałem zmienić nieco instrukcje. Oto, co zrobiłem:

  1. Zainstaluj klienta telnet na oknie systemu Windows.
  2. Pobierz stunnel. (Pobrałem i zainstalowałem plik o nazwie stunnel-4.56-installer.exe).
  3. Po zainstalowaniu wtedy potrzebne, aby zlokalizować plik stunnel.conf config, który w moim przypadku zainstalowanej na C:\Program Files (x86)\stunnel
  4. Następnie trzeba otworzyć ten plik w przeglądarce tekstowej, takich jak notatnika. Poszukaj [gmail-smtp] i usuń średnik z wiersza klienta poniżej (w pliku stunnel.conf każda linia zaczynająca się od średnika jest komentarzem). Należy skończyć z czymś takim:

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

    Kiedy już to zrobisz to zaoszczędzić stunnel.conf plik i Reload config (w tym celu użyć programu stunnel GUI, i kliknij konfiguracja => Odśwież) .

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

Po cmd jest typu otwartego w następujące polecenie i naciśnij Enter:

telnet localhost 25 

Należy wtedy zobaczyć coś podobnego do poniższego:

220 mx.google.com ESMTP f14sm1400408wbe.2 

Następnie należy odpowiedzieć wpisując i naciśnięcie klawisza enter:

helo google 

Powinno dać to następującą odpowiedź:

250 mx.google.com at your service 

Jeśli masz ten należy następnie wpisz następujące polecenie i naciśnij klawisz ENTER:

ehlo google 

ta powinna następnie daje 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ące polecenie, a następnie naciśnij klawisz ENTER:

AUTH LOGIN 

ta powinna następnie daje następującą odpowiedź:

334 VXNlcm5hbWU6 

Oznacza to, że jesteśmy gotowi do uwierzytelniania za pomocą naszego adresu Gmail i hasło.

Ponieważ jednak jest to zaszyfrowana sesja, będziemy musieli wysłać wiadomość 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 witryny internetowej do jej kodowania (na przykład base64 lub wyszukaj google pod numerem "kodowanie online base64"). Polecam, abyś ponownie nie dotykał sesji cmd/telnet, dopóki tego nie zrobisz.

Na przykład [email protected] staną dGVzdEBnbWFpbC5jb20 = i hasło by stać cGFzc3dvcmQ =

Po wykonaniu tej kopii i wklej przeliczona base64 użytkownika do sesji cmd/telnet i naciśnij enter. To powinno dać Ci odpowiedź:

334 UGFzc3dvcmQ6 

Teraz skopiuj i wklej przekonwertowane hasło base64 do sesji cmd/telnet i naciśnij enter. To powinno dać następującą odpowiedź, jeśli obie dane logowania są poprawne:

235 2.7.0 Accepted 

Należy teraz wpisać e-mail nadawcy (powinna być taka sama jak nazwa użytkownika) w następującym formacie i naciśnij klawisz ENTER:

MAIL FROM:<[email protected]> 

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

250 2.1.0 OK x23sm1104292weq.10 

teraz można wprowadzić adres e-mail odbiorcy w podobnym formacie, a następnie naciśnij klawisz eNTER:

RCPT TO:<[email protected]> 

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

250 2.1.5 OK x23sm1104292weq.10 

Teraz trzeba będzie wpisać następujące polecenie i naciśnij klawisz ENTER:

DATA 

Które powinny dać następującą odpowiedź:

354 Go ahead x23sm1104292weq.10 

Teraz możemy zacząć komp ose wiadomość! Aby to zrobić, wpisz wiadomość w następującym formacie (Tip: zrobić to 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-mail wpisać kropkę :

. 

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

250 2.0.0 OK 1288307376 x23sm1104292weq.10 

An d teraz trzeba zakończyć sesję, wpisując i naciskając klawisz ENTER:

QUIT 

To powinno dać 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 pocztowej adresata!

+0

Czy możemy przechwytywać te pakiety smtp wysyłane przez linię poleceń za pomocą wireshark? ponieważ nie jestem w stanie tego zrobić. –

2

jak nikt nie wspomniał - Proponuję użyć doskonałe narzędzie do tego celu - 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żna zrobić niemal wszystko, co chcesz.

Gmail: STARTTLS, SSLv3 (i tak, w 2016 gmail nadal wspierać 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 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:<[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. 

byłem za pomocą Swaków do wysyłania powiadomień e-mail z nagios za pośrednictwem Gmaila przez ostatnie 5 lat bez problemu.

2

Na podstawie istniejących odpowiedzi, poniżej znajduje się przewodnik krok po kroku dotyczący wysyłania zautomatyzowanych wiadomości e-mail przez SMTP, za pomocą konta GMail, z wiersza poleceń, bez ujawniania hasła.

Wymagania

Najpierw należy zainstalować następujące pakiety oprogramowania:

Te instrukcje zakładają, system operacyjny Linux, ale powinno być rozsądnie łatwe do przeniesienia do systemu Windows (przez Cygwin lub natywne odpowiedniki) lub innego systemu operacyjnego.

Authentication

Zapisz poniższy 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 

Zrób to plik wykonywalny i uruchomić go w następujący sposób:

chmod +x authentication.sh 
./authentication.sh 

Gdy pojawi się monit, podaj swój adres e-mail i hasło. Będzie to wyglądać mniej więcej tak:

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

Kopiuj ostatniej linii (AGJ...==), ponieważ może to być wykorzystywane do uwierzytelniania.

Powiadomienie

Zapisz następujące oczekiwać skrypt jako notify.sh (uwaga pierwsza linia odnosi się do programu spodziewać):

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

Wprowadź następujące zmiany:

  1. Wklej nad YOUR_AUTHENTICATION_CODE z kod uwierzytelniający wygenerowany przez skrypt uwierzytelniający.
  2. Zmień adres YOUR_EMAIL_ADDRESS za pomocą adresu e-mail użytego do wygenerowania kodu uwierzytelniającego.
  3. Zapisz plik.

Na przykład (uwaga kąt wsporniki są zatrzymywane na adres e-mail):

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

Wreszcie, upewnij się powiadomić skrypt wykonywalny w następujący sposób:

chmod +x notify.sh 

Wyślij E- mail

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

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