首页 文章

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

提问于
浏览
62

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

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

enter image description here

我想使用Gmail SMTP服务器做同样的事情 . 但是,它需要身份验证和TLS . 我可以't figure out how to do that for Gmail. Here'的 telnet smtp.gmail.com 587 截图:

enter image description here

我搜索并发现了许多链接,包括Wikipedia's article关于 STARTTLS 命令 . 但是我使用命令行(或者自己用编程语言发送命令)的SMTP服务器 . 有人可以帮忙吗?

4 回答

  • 104

    要通过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 '\00user@gmail.com\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: <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
    
  • 4

    不幸的是,由于我被迫使用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 文件和 reload 配置(要执行此操作,请使用stunnel GUI程序,然后单击configuration => Reload) .

    现在你应该准备好在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在线编码”) . 我建议您在完成此操作之前不要再次触摸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
    

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

    DATA
    

    哪个应该给你以下回复:

    354  Go ahead x23sm1104292weq.10
    

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

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

  • 23

    没有人提到 - 我建议为此目的使用伟大的工具 - 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.
    

    YAHOO: TLS aka 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.
    

    我一直使用swaks通过gmail从nagios发送电子邮件通知最近5年没有任何问题 .

  • 3

    根据现有答案,以下是从命令行使用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): 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"
    

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

    chmod +x notify.sh
    

    发送电子邮件

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

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

相关问题