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

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

я смог сделать это, используя smtp4dev. Я!--0--> и команды:

enter image description here

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

enter image description here

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

4 ответов


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

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

openssl s_client-starttls smtp-подключение smtp.gmail.com: 587-crlf-ign_eof

или подключение к SSL sockect непосредственно...

в openssl s_client -подключения по протоколу SMTP.в Gmail.ком:465 -кода crlf -ign_eof

EHLO localhost

после этого аутентифицируйтесь на сервере, используя кодированное имя пользователя/пароль base64

AUTH PLAIN AG15ZW1haWxAZ21haWwuY29tAG15cGFzc3dvcmq=

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

echo -ne 'user@gmail.compassword' | 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

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

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

  1. установите клиент telnet на windows коробка.
  2. stunnel скачать. (Я загрузил и установил файл под названием stunnel-4.56-установщика.exe).
  3. после установки вам необходимо было найти stunnel.conf конфигурационный файл, который в моем случае я установил в C:\Program Files (x86)\stunnel
  4. затем вам нужно открыть этот файл в текстовом редакторе, например Блокнот. Ищите [gmail-smtp] и удалите точку с запятой в строке клиента ниже (в stunnel.файл conf, каждая строка, начинающаяся с точка с запятой-это комментарий). Вы должны закончить с чем-то вроде:

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

    как только вы это сделаете, сохраните stunnel.conf файл и перезагрузка конфигурация (для этого используйте программу GUI stunnel и нажмите на настройки=>перезагрузка).

теперь вы должны быть готовы отправить электронную почту в клиенте 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

теперь вам нужно будет ввести следующее и нажать enter:

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.

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


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

требования

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

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

проверка подлинности

сохраните следующий скрипт как 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="$email$password"

echo -ne $TEXT | base64

сделайте его исполняемым и запустите его следующим образом:

chmod +x authentication.sh
./authentication.sh

при появлении запроса введите свой e-mail и пароль. Это будет выглядеть примерно так:

Email (shown): bob@gmail.com
Password (hidden): 
AGJvYkBnbWFpbC5jb20AYm9iaXN0aGViZXN0cGVyc29uZXZlcg==

скопируйте последнюю строку (AGJ...==), как это будет используется для аутентификации.

уведомления

сохраните следующий сценарий ожидания как 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"
            }
          }
        }
      }
    }
  }
}

внести следующие изменения:

  1. оклеить YOUR_AUTHENTICATION_CODE С кодом аутентификации, генерируемым сценарием аутентификации.
  2. изменить YOUR_EMAIL_ADDRESS с адресом электронной почты, используемым для создания кода аутентификации.
  3. сохранить файл.

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

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"