Programing

Gmail을 통해 간단한 SMTP 명령을 사용하여 이메일을 보내는 방법은 무엇입니까?

crosscheck 2020. 11. 27. 07:48
반응형

Gmail을 통해 간단한 SMTP 명령을 사용하여 이메일을 보내는 방법은 무엇입니까?


교육 목적으로 SMTP의 기본적이고 간단한 규칙을 사용하여 SMTP 서버를 통해 이메일을 보내야합니다.

나는 smtp4dev 를 사용하여 그것을 할 수있었습니다 . I telnet localhost 25및 및 명령은 다음과 같습니다.

여기에 이미지 설명 입력

Gmail SMTP 서버를 사용하여 동일한 작업을하고 싶습니다. 그러나 인증 및 TLS가 필요합니다. Gmail에서 수행하는 방법을 알 수 없습니다. 다음은 스크린 샷입니다 telnet smtp.gmail.com 587.

여기에 이미지 설명 입력

명령 에 대한 Wikipedia의 기사포함하여 많은 링크를 검색하고 찾았습니다 STARTTLS. 하지만 TLS를 사용할 수없고 명령 줄을 사용하여 Gmail의 SMTP 서버에 인증 할 수 없습니다 (또는 프로그래밍 언어로 직접 명령 보내기). 누구든지 도울 수 있습니까?


Gmail을 통해 보내려면 암호화 된 연결을 사용해야합니다. 텔넷만으로는 불가능하지만 openssl 과 같은 도구를 사용할 수 있습니다.

암호화에 대한 일반 연결을 변환 할 수있는 OpenSSL에서 STARTTLS 옵션을 사용하여 연결 ...

openssl s_client -starttls smtp -connect smtp.gmail.com:587 -crlf -ign_eof

또는 SSL 양말에 직접 연결 ...

openssl s_client -connect smtp.gmail.com:465 -crlf -ign_eof

EHLO 로컬 호스트

그 후 base64로 인코딩 된 사용자 이름 / 암호를 사용하여 서버에 인증합니다.

AUTH 일반 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

불행히도 Windows 서버를 사용해야하므로 위의 답변이 제안하는 방식으로 openssl을 작동시킬 수 없었습니다.

그러나 나는 stunnel ( 여기 에서 다운로드 할 수 있음)이라는 유사한 프로그램을 사용할 수 있었습니다. www.tech-and-dev.com 에서 아이디어를 얻었 지만 지침을 약간 변경해야했습니다. 내가 한 일은 다음과 같습니다.

  1. Windows 상자에 텔넷 클라이언트를 설치합니다.
  2. stunnel을 다운로드하십시오. ( stunnel-4.56-installer.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파일을 저장하고 구성을 다시로드 합니다 (이 작업을 수행하려면 stunnel GUI 프로그램을 사용하고 configuration => Reload를 클릭합니다 ).

이제 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 세션을 다시 건드리지 않는 것이 좋습니다.

예를 들어 test@gmail.comdGVzdEBnbWFpbC5jb20 =이 되고 비밀번호는 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 (일명 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를 사용하여 지난 5 년 동안 아무 문제없이 nagios에서 Gmail을 통해 이메일 알림을 보내고 있습니다.


Based on the existing answers, here's a step-by-step guide to sending automated e-mails over SMTP, using a GMail account, from the command line, without disclosing the password.

Requirements

First, install the following software packages:

These instructions assume a Linux operating system, but should be reasonably easy to port to Windows (via Cygwin or native equivalents), or other operating system.

Authentication

Save the following shell script as 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

Make it executable and run it as follows:

chmod +x authentication.sh
./authentication.sh

When prompted, provide your e-mail address and password. This will look something like:

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

Copy the last line (AGJ...==), as this will be used for authentication.

Notification

다음 예상 스크립트를 다른 이름으로 저장하십시오 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: <bob@gmail.com>\n"

마지막으로 다음과 같이 알림 스크립트를 실행 가능하게 만듭니다.

chmod +x notify.sh

이메일을 보내

다음과 같이 명령 줄에서 전자 메일을 보냅니다.

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

참고 URL : https://stackoverflow.com/questions/11046135/how-to-send-email-using-simple-smtp-commands-via-gmail

반응형