如何通过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得到了这个想法,但是我必须稍微改变一下这个说明。 这是我做的:
- 在Windows框上安装telnet客户端。
- 下载stunnel。 (我下载并安装了一个名为stunnel-4.56-installer.exe的文件)。
- 一旦安装你需要find
stunnel.conf
configuration文件,在我的情况下,我安装到C:\Program Files (x86)\stunnel
-
然后,您需要在文本查看器(如记事本)中打开此文件。 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" } } } } } } }
进行以下更改:
- 通过身份validation脚本生成的身份validation代码粘贴
YOUR_AUTHENTICATION_CODE
。 - 使用用于生成validation码的电子邮件地址更改
YOUR_EMAIL_ADDRESS
。 - 保存文件。
例如(注意尖括号保留为电子邮件地址):
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发送电子邮件通知,没有任何问题。