it-swarm.cn

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

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

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

enter image description here

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

enter image description here

我搜索并发现了许多链接,包括 维基百科的文章 关于STARTTLS命令。但是我无法使用TLS并使用命令行对Gmail的SMTP服务器进行身份验证(或者使用编程语言自行发送命令)。有人可以帮忙吗?

62
Saeed Neamati

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

或者使用openssl中的starttls选项将普通连接转换为加密...

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编码的用户名/密码对服务器进行身份验证

AUTH PLAIN AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ =

从命令行获取此信息:

echo -ne '\[email protected]\00password' | base64
AHVzZXJAZ21haWwuY29tAHBhc3N3b3Jk

然后继续使用“mail from:”,就像在你的例子中一样

示例会话:

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
104
Gryphius

不幸的是,由于我被迫使用Windows服务器,我无法以上述答案建议的方式使用openssl。

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

  1. 在Windows框中安装telnet客户端。
  2. 下载stunnel。 (我下载并安装了名为stunnel-4.56-installer.exe的文件。
  3. 安装完成后,您需要找到stunnel.conf配置文件,在我的情况下我安装到C:\Program Files (x86)\stunnel
  4. 然后,您需要在文本查看器中打开此文件,例如notepad。查找[gmail-smtp]并删除下面客户端行上的分号(在stunnel.conf文件中,以分号开头的每一行都是注释)。你应该得到类似的东西:

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

    完成此操作后,保存stunnel.conf文件和 reload config(要执行此操作,请使用stunnel GUI程序,然后单击configuration => Reload)。

现在你应该准备好在windows telnet客户端发送电子邮件了!
转到Start => run => 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会话。

例如[email protected]将变为dGVzdEBnbWFpbC5jb20 =并且密码将变为cGFzc3dvcmQ =

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

334 UGFzc3dvcmQ6

现在将转换后的base64密码复制并粘贴到cmd/telnet会话中,然后按Enter键。如果两个登录凭据都正确,则应该给出以下响应:

235 2.7.0 Accepted

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

MAIL FROM:<[email protected]>

这应该给你以下回应:

250 2.1.0 OK x23sm1104292weq.10

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

RCPT TO:<[email protected]>

这应该给你以下回应:

250 2.1.5 OK x23sm1104292weq.10

现在,您需要键入以下内容并按Enter键:

DATA

哪个应该给你以下回复:

354  Go ahead x23sm1104292weq.10

现在我们可以开始撰写消息了!为此,请按以下格式输入消息(提示:在记事本中执行此操作并将整个消息复制到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

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

QUIT

这应该给你以下回应:

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

您的电子邮件现在应该在收件人的邮箱中!

24
Exile

没有人提到 - 我建议使用很棒的工具 - 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通过gmail从nagios发送电子邮件通知最近5年没有任何问题。

5
ALex_hha

根据现有答案,以下是从命令行使用GMail帐户通过SMTP发送自动电子邮件的分步指南,而不会泄露密码。

要求

首先,安装以下软件包:

这些说明假设是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. 保存文件。

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

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

最后,使notify脚本可执行,如下所示:

chmod +x notify.sh

发送电子邮件

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

./notify.sh [email protected] "Command Line" "March 14" "15:52"
3
Dave Jarvis