Как отправить электронную почту с помощью простых команд SMTP через Gmail?

В образовательных целях мне нужно отправить электронное письмо через SMTP-сервер, используя основные и простые правила SMTP.

Я смог сделать это, используя smtp4dev. я telnet localhost 25 и и команды:

enter image description here

Я хочу сделать то же самое, используя SMTP-сервер Gmail. Однако для этого требуется аутентификация и TLS. Я не могу понять, как это сделать для Gmail. Здесь снимок экрана telnet smtp.gmail.com 587:

enter image description here

Я искал и нашел много ссылок, включая статью в Википедии о команде STARTTLS. Но я не могу использовать TLS и проверять подлинность на SMTP-сервере Gmail с помощью командной строки (или отправлять команды самостоятельно на языках программирования). Может ли кто-нибудь помочь?

Ответ 1

для отправки через gmail вам необходимо использовать зашифрованное соединение. это невозможно с помощью telnet, но вы можете использовать такие инструменты, как openssl

либо подключиться, используя параметр starttls в openssl, чтобы преобразовать обычное соединение в зашифрованное...

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 =

чтобы получить это из командной строки:

perl -MMIME::Base64 -e 'print encode_base64("\000myemail\@gmail.com\000mypassword")' 
AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmQ=

затем перейдите к "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

Ответ 2

К сожалению, поскольку я вынужден использовать сервер Windows, мне не удалось заставить openssl работать так, как это предлагает вышеприведенный ответ.

Однако мне удалось получить аналогичную программу под названием stunnel (которую можно скачать из здесь) для работы. Я получил идею от www.tech-and-dev.com, но мне пришлось немного изменить инструкции. Вот что я сделал:

  • Установите 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 и нажмите на конфигурацию = > Перезагрузить).

Теперь вы должны быть готовы отправить электронную почту в клиенте telnet windows!
Перейдите в 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). Я рекомендую, чтобы вы еще не дотронулись до сеанса cmd/telnet, пока не сделали это.

Например, [email protected] станет dGVzdEBnbWFpbC5jb20 = и пароль станет cGFzc3dvcmQ =

Как только вы сделали эту копию и вставьте преобразованное имя пользователя base64 в сеанс cmd/telnet и нажмите enter. Это должно дать вам следующий ответ:

334 UGFzc3dvcmQ6

Теперь скопируйте и вставьте преобразованный пароль base64 в сеанс cmd/telnet и нажмите клавишу ввода. Это должно дать вам следующий ответ, если оба учетных данных верны:

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 <reci[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.

Теперь ваша электронная почта должна быть в почтовом ящике получателей!

Ответ 3

В соответствии с существующими ответами, пошаговое руководство по отправке автоматических сообщений электронной почты через SMTP с использованием учетной записи GMail из командной строки без раскрытия пароля.

Требования

Сначала установите следующие пакеты программного обеспечения:

Эти инструкции предполагают операционную систему Linux, но должны быть достаточно легко переноситься в Windows (через Cygwin или родные эквиваленты) или в другую операционную систему.

Аутентификация

Сохраните следующую оболочку script как 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...==), так как она будет использоваться для аутентификации.

Уведомление

Сохраните следующий ожидаемый script как 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 код аутентификации, сгенерированный аутентификацией script.
  • Измените YOUR_EMAIL_ADDRESS на адрес электронной почты, используемый для генерации кода аутентификации.
  • Сохраните файл.

Например (обратите внимание, что угловые скобки сохраняются для адреса электронной почты):

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

Наконец, сделайте исполняемый файл уведомления script следующим образом:

chmod +x notify.sh

Отправить E-mail

Отправьте электронное письмо из командной строки следующим образом:

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

Ответ 4

Как никто не упомянул - я бы предложил использовать отличный инструмент для этой цели - 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 aka 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 для отправки уведомлений по электронной почте из nagios через gmail последние 5 лет без каких-либо проблем.