2012-06-15 67 views
60

爲了教育目的,我需要通過SMTP服務器發送一封電子郵件,使用SMTP的基本規則和簡單規則。如何通過Gmail使用簡單的SMTP命令發送電子郵件?

我能夠使用smtp4dev來做到這一點。我telnet localhost 25和和命令:

enter image description here

我想要做同樣的事情,使用Gmail的SMTP服務器。但是,它需要認證和TLS。我無法弄清楚如何爲Gmail做到這一點。下面是telnet smtp.gmail.com 587截圖:

enter image description here

我搜查,發現許多環節,包括Wikipedia's articleSTARTTLS命令。但是我無法使用TLS並使用命令行對Gmail的SMTP服務器進行身份驗證(或者使用編程語言發送自己的命令)。誰能幫忙?

+0

您可以使用例如Java編寫自己的程序來執行此操作。 –

+0

爲什麼你不使用端口25與Gmail(就像你自己的服務器)? – vbence

+0

這裏有一個指南:http://linuxmeerkat.wordpress.com/2013/10/10/emailing-from-a-gmail-acount-via-telnet/ – Pithikos

回答

100

通過gmail發送,需要使用加密連接。這是不可能通過telnet獨自一人,但你可以像使用openssl

要麼工具使用STARTTLS選項OpenSSL中對加密的平原連接轉換連接......

的OpenSSL的s_client.First -starttls SMTP - 連接smtp.gmail.com:587 -crlf -ign_eof

連接到SSL sockect直接...

的OpenSSL的s_client.First -connect smtp.gmail.com:465 -crlf -ign_eof

EHLO本地主機

在此之後,驗證到使用base64編碼的用戶名/密碼

AUTH PLAIN服務器AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ =

從命令行得到這樣的:

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

然後用「從郵件:」繼續像在您的示例

例如會話:

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

我安裝了OpenSSL,但沒有命令已添加到命令行。我應該去哪裏獲得CMD的openssl命令? –

+1

對不起,我不知道openssl可執行文件在windows上的安裝位置,我在這裏使用linux。 – Gryphius

+0

@Gryphius我得到OpenSSL驗證返回碼:20(無法獲得本地簽發者證書)即客戶端驗證失敗,但我仍然可以發送上述電子郵件,請解釋原因? –

21

不幸的是,因爲我被迫使用一個Windows服務器,我一直無法得到的OpenSSL在工作上述答案表明的方式。

但是我能夠得到一個名爲stunnel的相似程序(可以從here下載)來運行。我從www.tech-and-dev.com得到了主意,但我不得不稍微更改說明。這是我所做的:

  1. 在windows窗口上安裝telnet客戶端。
  2. 下載stunnel。 (我下載並安裝了一個名爲的文件stunnel-4.56-installer.exe)。
  3. 一旦安裝,你再找到stunnel.conf配置文件,這在我來說,我安裝C:\Program Files (x86)\stunnel
  4. 然後根據需要,你需要打開用文本編輯器文件,如記事本。查找[gmail-smtp],並在下面的客戶端行中刪除分號(在stunnel.conf文件中,以分號開頭的每行都是註釋)。你應該像結束了:

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

    一旦你這樣做了保存stunnel.conf文件和重裝的配置(要做到這一點使用的安全通道GUI程序,並單擊配置=>刷新) 。

現在你應該準備好在windows的telnet客戶端發送郵件了!
轉至開始=>運行=> cmd

一旦cmd是開放式的下面,然後按Enter:

telnet localhost 25 

之後,應看到類似以下的東西:

220 mx.google.com ESMTP f14sm1400408wbe.2 

然後,您將需要通過鍵入回覆如下並按下輸入:

helo google 

這應該會給你以下回應:

250 mx.google.com at your service 

如果你得到這個你再需要鍵入以下命令並按回車鍵:

ehlo google 

這應該然後給你以下回應:

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

現在你應該準備好通過您的Gmail詳細信息進行身份驗證。要做到這一點,鍵入以下並按回車鍵:

AUTH LOGIN 

這應該然後給你以下回應:

334 VXNlcm5hbWU6 

這意味着,我們已經準備好使用我們的Gmail地址和密碼進行身份驗證。

但是,由於這是一個加密的會話,我們將不得不發送以base64編碼的電子郵件和密碼。要編碼您的電子郵件和密碼,您可以使用轉換器程序或在線網站對其進行編碼(例如base64或在谷歌搜索'base64在線編碼')。我建議您不要再觸摸cmd/telnet會話,直到完成此操作。

例如[email protected]將成爲dGVzdEBnbWFpbC5jb20 =和密碼將成爲cGFzc3dvcmQ =

一旦你完成了這個副本,並將轉換的base64用戶名粘貼到CMD/Telnet會話,並按回車。這應該給你以下響應:

334 UGFzc3dvcmQ6 

現在,複製並粘貼轉換的base64密碼進入CMD/Telnet會話,然後按回車。這應該給你以下響應如果兩個登錄憑據是正確的:

235 2.7.0 Accepted 

現在,你應該按以下格式,按輸入發件人的電子郵件(應該是相同的用戶名)輸入:

MAIL FROM:<[email protected]> 

這應該給你以下響應:

250 2.1.0 OK x23sm1104292weq.10 

現在,您可以用類似的格式輸入收件人的電子郵件地址,然後按ENTER鍵:

RCPT TO:<[email protected]> 

這應該給你以下響應:

250 2.1.5 OK x23sm1104292weq.10 

現在,你需要鍵入以下命令並按回車鍵:

DATA 

這應該給你以下回應:

354 Go ahead x23sm1104292weq.10 

現在我們可以開始comp消息!要做到這一點按以下格式輸入您的信息(提示:爲此在記事本和整個信息複製到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. 

當你完成的電子郵件進入點:

. 

這應該給你以下響應:

250 2.0.0 OK 1288307376 x23sm1104292weq.10 

的D現在你需要鍵入結束會話以下並按Enter鍵:

QUIT 

這應該給你以下回應:

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

和電子郵件現在應該在收件人的郵箱!

+0

我們可以使用wireshark捕獲通過命令行發送的這些smtp數據包嗎?因爲我無法這樣做。 –

2

由於沒有人提到 - 我會建議爲上述目的使用偉大的工具 - 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. 

它有很多的選擇,可以做幾乎所有你想要的一切。

GMAIL:STARTTLS,SSLv3的(是的,在2016年Gmail仍然支持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又名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. 

我一直使用swaks在過去的5年中通過gmail通過nagios發送電子郵件通知沒有任何問題。

2

根據現有的答案,下面是分步指南,通過命令行,通過SMTP使用GMail帳戶發送自動電子郵件,無需公開密碼。

要求

首先,安裝以下軟件包:

這些說明假設Linux操作系統,但應該是合理的容易移植到Windows(通過Cygwin或本地等價物)或其他操作系統。

認證

保存下面的shell腳本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 

使其可執行文件,並按如下運行:

chmod +x authentication.sh 
./authentication.sh 

出現提示時,請提供您的電子郵件地址,密碼。這將是這個樣子:

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

複製的最後一行(AGJ...==),因爲這將被用於驗證。

通知

保存下列預期腳本notify.sh(注意:第一行是指期望程序):

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

做以下修改:

  1. 貼過來YOUR_AUTHENTICATION_CODE與認證腳本生成的認證碼。
  2. 更改YOUR_EMAIL_ADDRESS與用於生成驗證碼的電子郵件地址。
  3. 保存文件。

例如(注意括號被保留用於e-mail地址的角度):

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

最後,使通知腳​​本可執行如下:

chmod +x notify.sh 

發送E- mail

從命令行發送電子郵件如下:

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