2012-06-15 68 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" 
相关问题