出于教育目的,我需要使用 SMTP 的基本和简单规则通过 SMTP 服务器发送电子邮件。
我可以使用 smtp4dev 做到这一点。 I telnet localhost 25
和和命令是:
https://i.stack.imgur.com/GkwJ5.png
我想做同样的事情,使用 Gmail SMTP 服务器。但是,它需要身份验证和 TLS。我不知道如何为 Gmail 做到这一点。这是 telnet smtp.gmail.com 587
的屏幕截图:
https://i.stack.imgur.com/pVLQf.png
我搜索并找到了许多链接,包括关于 STARTTLS
命令的 Wikipedia's article。但我无法使用 TLS 并使用命令行(或自己用编程语言发送命令)对 Gmail 的 SMTP 服务器进行身份验证。任何人都可以帮忙吗?
要通过 gmail 发送,您需要使用加密连接。单独使用 telnet 无法做到这一点,但您可以使用 openssl 等工具
使用 openssl 中的 starttls 选项进行连接,将普通连接转换为加密连接...
openssl s_client -starttls smtp -connect smtp.gmail.com:587 -crlf -ign_eof
或直接连接到 ssl 套接字...
openssl s_client -connect smtp.gmail.com:465 -crlf -ign_eof
EHLO 本地主机
之后,使用 base64 编码的用户名/密码对服务器进行身份验证
AUTH 普通 AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ=
从命令行获取:
echo -ne '\00user@gmail.com\00password' | base64
AHVzZXJAZ21haWwuY29tAHBhc3N3b3Jk
然后继续“来自:”的邮件,就像你的例子一样
示例会话:
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 的类似程序(可以从 here 下载)来工作。我从 www.tech-and-dev.com 得到了这个想法,但我不得不稍微更改说明。这是我所做的:
在 windows 框上安装 telnet 客户端。下载stunnel。 (我下载并安装了一个名为 stunnel-4.56-installer.exe 的文件)。安装后,您需要找到 stunnel.conf 配置文件,在我的情况下,我安装到 C:\Program Files (x86)\stunnel 然后,您需要在记事本等文本查看器中打开此文件。查找 [gmail-smtp] 并删除下面客户端行上的分号(在 stunnel.conf 文件中,以分号开头的每一行都是注释)。你应该得到类似的结果: [gmail-smtp] client = yes accept = 127.0.0.1:25 connect = smtp.gmail.com:465 完成后保存 stunnel.conf 文件并重新加载配置(要做这使用stunnel GUI程序,然后单击配置=>重新加载)。
现在您应该准备好在 windows telnet 客户端中发送电子邮件了!转到开始=>运行=>cmd。
打开 cmd 后,键入以下内容并按 Enter:
telnet localhost 25
然后,您应该会看到类似于以下内容的内容:
220 mx.google.com ESMTP f14sm1400408wbe.2
然后,您需要通过键入以下内容并按 Enter 进行回复:
helo google
这应该会给您以下响应:
250 mx.google.com at your service
如果您收到此信息,则需要输入以下内容并按 Enter:
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 详细信息进行身份验证了。要执行此操作,请键入以下内容并按 Enter:
AUTH LOGIN
这应该会给你以下响应:
334 VXNlcm5hbWU6
这意味着我们已准备好使用我们的 gmail 地址和密码进行身份验证。
然而,由于这是一个加密会话,我们将不得不发送以 base64 编码的电子邮件和密码。要对您的电子邮件和密码进行编码,您可以使用转换器程序或在线网站对其进行编码(例如 base64 或在 google 上搜索 'base64 online encoding')。我建议您在完成此操作之前不要再次触摸 cmd/telnet 会话。
例如 test@gmail.com 将变为 dGVzdEBnbWFpbC5jb20= 并且密码将变为 cGFzc3dvcmQ=
完成此操作后,将转换后的 base64 用户名粘贴到 cmd/telnet 会话中,然后按 Enter。这应该给你以下回应:
334 UGFzc3dvcmQ6
现在将转换后的 base64 密码复制并粘贴到 cmd/telnet 会话中,然后按 Enter。如果两个登录凭据都正确,这应该会给您以下响应:
235 2.7.0 Accepted
您现在应该按以下格式输入发件人电子邮件(应该与用户名相同),然后按 Enter:
MAIL FROM:<test@gmail.com>
这应该会给您以下响应:
250 2.1.0 OK x23sm1104292weq.10
您现在可以以类似的格式输入收件人电子邮件地址,然后按 Enter:
RCPT TO:<recipient@gmail.com>
这应该会给您以下响应:
250 2.1.5 OK x23sm1104292weq.10
现在您需要输入以下内容并按回车键:
DATA
这应该会给你以下回应:
354 Go ahead x23sm1104292weq.10
现在我们可以开始编写消息了!为此,请按以下格式输入您的消息(提示:在记事本中执行此操作并将整个消息复制到 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.
完成电子邮件后,输入一个点:
.
这应该会给您以下响应:
250 2.0.0 OK 1288307376 x23sm1104292weq.10
现在您需要通过键入以下内容并按 Enter 来结束会话:
QUIT
这应该会给您以下响应:
221 2.0.0 closing connection x23sm1104292weq.10
Connection to host lost.
您的电子邮件现在应该在收件人的邮箱中!
正如没有人提到的那样-我建议为此目的使用出色的工具-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 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.
雅虎: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 发送电子邮件通知,没有任何问题。
根据现有的答案,这里有一个分步指南,通过 SMTP 发送自动电子邮件,使用 GMail 帐户,从命令行,不透露密码。
要求
首先,安装以下软件包:
预计
OpenSSL
核心实用程序(base64)
这些说明假定为 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): bob@gmail.com
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"
}
}
}
}
}
}
}
进行以下更改:
将身份验证脚本生成的身份验证代码粘贴到 YOUR_AUTHENTICATION_CODE 上。将 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"
base64
对命令行中的用户名 + 密码进行编码:echo -en '\000myemail@gmail.com\000mypassword' | base64
(不要转义@
)。