如何通过Gmail使用简单的SMTP命令发送电子邮件?

为了教育目的,我需要通过SMTP服务器发送电子邮件,使用SMTP的基本和简单的规则。

我能够做到这一点使用smtp4dev 。 我telnet localhost 25和命令是:

在这里输入图像说明

我想用Gmail SMTP服务器来做同样的事情。 但是,它需要身份validation和TLS。 我无法弄清楚如何做到这一点的Gmail。 以下是telnet smtp.gmail.com 587的截图:

在这里输入图像说明

我search了许多链接,包括维基百科有关STARTTLS命令的文章 。 但是,我无法使用TLS并使用命令行对Gmail的SMTP服务器进行身份validation(或者使用编程语言发送自己的命令)。 谁能帮忙?

通过gmail发送,您需要使用encryption的连接。 单独使用telnet是不可能的,但是你可以使用像openssl这样的工具

或者连接使用openssl中的starttls选项将纯连接转换为encryption…

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

直接连接到一个ssl sockect …

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

EHLO localhost

之后,使用base64编码的用户名/密码对服务器进行身份validation

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: <gryphius-demo@gmail.com> 250 2.1.0 OK m46sm11546481eeh.9 rcpt to: <somepoorguy@example.com> 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 

不幸的是,我被迫使用Windows服务器,我一直无法得到openssl以上述答案的方式工作。

但是我能够得到一个名为stunnel(可以从这里下载)的类似程序来工作。 我从www.tech-and-dev.com得到了这个想法,但是我必须稍微改变一下这个说明。 这是我做的:

  1. 在Windows框上安装telnet客户端。
  2. 下载stunnel。 (我下载并安装了一个名为stunnel-4.56-installer.exe的文件)。
  3. 一旦安装你需要findstunnel.confconfiguration文件,在我的情况下,我安装到C:\Program Files (x86)\stunnel
  4. 然后,您需要在文本查看器(如记事本)中打开此文件。 find[gmail-smtp]并在下面的客户端行上删除分号(在stunnel.conf文件中,以分号开头的每一行都是注释)。 你最终应该是这样的:

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

    完成后,保存stunnel.conf文件并重新加载configuration(使用stunnel GUI程序执行此操作,然后单击configuration=>重新加载 )。

现在你应该准备好在Windows远程login客户端发送电子邮件了!
转到开始=>运行=> cmd

一旦cmd打开,请按以下方式input:

 telnet localhost 25 

您应该看到类似于以下内容的内容:

 220 mx.google.com ESMTP f14sm1400408wbe.2 

然后,您需要input以下内容并按回车:

 helo google 

这应该给你以下的回应:

 250 mx.google.com at your service 

如果你得到这个,你需要input以下内容并按回车:

 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的详细信息进行身份validation。 要做到这一点,请input以下内容并按下Enter键:

 AUTH LOGIN 

这应该给你以下的回应:

 334 VXNlcm5hbWU6 

这意味着我们准备通过使用我们的Gmail地址和密码进行身份validation。

然而,由于这是一个encryption的会话,我们将不得不发送在base64编码的电子邮件和密码。 要编码您的电子邮件和密码,您可以使用转换器程序或在线网站对其进行编码(例如base64或在谷歌search'base64在线编码' )。 我build议您不要再触摸cmd / telnet会话,直到您完成此操作。

例如test@gmail.com会变成dGVzdEBnbWFpbC5jb20 = ,密码将变成cGFzc3dvcmQ =

完成此复制后,将转换后的base64用户名粘贴到cmd / telnet会话中,然后按Enter键。 这应该给你以下的回应:

 334 UGFzc3dvcmQ6 

现在复制并粘贴您的转换后的base64密码到cmd / telnet会话中,然后按回车。 如果两个login凭证都是正确的,这应该给你以下的回应:

 235 2.7.0 Accepted 

您现在应该按以下格式input发件人电子邮件(应与用户名相同),然后按Enter键:

 MAIL FROM:<test@gmail.com> 

这应该给你以下的回应:

 250 2.1.0 OK x23sm1104292weq.10 

您现在可以使用类似的格式input收件人电子邮件地址,然后按Enter键:

 RCPT TO:<recipient@gmail.com> 

这应该给你以下的回应:

 250 2.1.5 OK x23sm1104292weq.10 

现在您需要input以下内容并按下回车键:

 DATA 

哪个应该给你以下的回应:

 354 Go ahead x23sm1104292weq.10 

现在我们可以开始撰写信息了! 要做到这一点,请按以下格式input您的消息( 提示 :在记事本中执行此操作,并将整个消息复制到cmd / telnet会话中):

 From: Test <test@gmail.com> To: Me <recipient@gmail.com> Subject: Testing email from telnet This is the body Adding more lines to the body message. 

当你完成电子邮件input一个点:

 . 

这应该给你以下的回应:

 250 2.0.0 OK 1288307376 x23sm1104292weq.10 

现在,您需要input以下内容并按Enter键结束会话:

 QUIT 

这应该给你以下的回应:

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

而你的电子邮件现在应该在收件人的邮箱!

根据现有的答案,下面是分步指南,通过命令行使用GMail帐户通过SMTP发送自动电子邮件,而无需公开密码。

要求

首先,安装以下软件包:

  • 期望
  • OpenSSL的
  • 核心实用程序 (base64)

这些指令假定一个Linux操作系统,但应该可以很容易地移植到Windows(通过Cygwin或本地等价物)或其他操作系统。

authentication

将以下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): bob@gmail.com Password (hidden): AGJvYkBnbWFpbC5jb20AYm9iaXN0aGViZXN0cGVyc29uZXZlcg== 

复制最后一行( AGJ...== ),因为这将用于身份validation。

通知

将下面的期望脚本保存为notify.sh (注意第一行指向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" } } } } } } } 

进行以下更改:

  1. 通过身份validation脚本生成的身份validation代码粘贴YOUR_AUTHENTICATION_CODE
  2. 使用用于生成validation码的电子邮件地址更改YOUR_EMAIL_ADDRESS
  3. 保存文件。

例如(注意尖括号保留为电子邮件地址):

 send "AUTH PLAIN AGJvYkBnbWFpbC5jb20AYm9iaXN0aGViZXN0cGVyc29uZXZlcg==\n" send "MAIL FROM: <bob@gmail.com>\n" 

最后,使通知脚​​本可执行如下:

 chmod +x notify.sh 

发电子邮件

从命令行发送电子邮件如下:

 ./notify.sh recipient@domain.com "Command Line" "March 14" "15:52" 

正如没有人提到的 – 我会build议使用伟大的工具来达到这个目的 – 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. 

它有很多select,可以做几乎所有你想要的。

GMAIL:STARTTLS,SSLv3 (是的,在2016年gmail仍然支持sslv3)

 $ echo "Hello world" | swaks -4 --server smtp.gmail.com:587 --from user@gmail.com --to user@example.net -tls --tls-protocol sslv3 --auth PLAIN --auth-user user@gmail.com --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:<user@gmail.com> <~ 250 2.1.0 OK h8sm76342lbd.48 - gsmtp ~> RCPT TO:<user@example.net> <~ 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: user@example.net ~> From: user@gmail.com ~> 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 user@yahoo.com --to user@gmail.com --tlsc --tls-protocol tlsv1_2 --auth PLAIN --auth-user user@yahoo.com --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:<user@yahoo.com> <~ 250 OK , completed ~> RCPT TO:<user@gmail.com> <~ 250 OK , completed ~> DATA <~ 354 Start Mail. End with CRLF.CRLF ~> Date: Wed, 17 Feb 2016 10:08:28 +0000 ~> To: user@gmail.com ~> From: user@yahoo.com ~> 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. 

过去5年来,我一直使用swaks通过gmail通过nagios发送电子邮件通知,没有任何问题。