Как отправить электронную почту с помощью простых команд SMTP через Gmail?
в образовательных целях мне нужно отправить электронное письмо через SMTP-сервер, используя основные и простые правила SMTP.
я смог сделать это с помощью smtp4dev. Я telnet localhost 25
и команды:
Я хочу сделать то же самое, используя SMTP-сервер Gmail. Однако для этого требуется аутентификация и TLS. Я не могу понять, как это сделать для Gmail. Вот скриншот telnet smtp.gmail.com 587
:
Я искал и нашел много ссылок, в том числе Википедии о . Но я не могу использовать TLS и аутентифицироваться на SMTP-сервере Gmail с помощью командной строки (или отправлять команды самостоятельно на языках программирования). Кто-нибудь может помочь?
4 ответа:
отправить через Gmail, вам нужно использовать зашифрованное соединение. это невозможно только с telnet, но вы можете использовать такие инструменты, как openssl
или подключение с помощью опции starttls в openssl для преобразования простого соединения в зашифрованное...
в openssl s_client -команды протокола SMTP -подключения по протоколу SMTP.в Gmail.ком: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 '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 но мне пришлось немного изменить инструкции. Вот что я сделал:
- установите клиент telnet на windows коробка.
- stunnel скачать. (Я скачал и установил файл под названием stunnel-4.56-установщика.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!
Перейти к 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 снова, пока вы не сделаете это.
например 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.
Яху: ТЛС ака протокола 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, из командной строки, не раскрывая пароль.
требования
во-первых, установите следующие пакеты программного обеспечения:
- ожидал
- OpenSSL
- Основные Utils (base64)
эти инструкции предполагают Операционная система 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" } } } } } } }
внести следующие изменения:
- вставить
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"