2015/12/15

Gmailにコマンドラインからメールを送る

gmailにtelnetからメールを送信するのは、セキュリティが強化されて今は無理なようです。
tlsなどで暗号化しないとメールは送信できません。
そこで、telnetではなく、opensslを使う事で送信できます。
これは、phpなどで作成したメーラでも同じことで、gmailを相手にPHPMailerやphp PEARでメール送信プログラムを作成されている方は要注意です。

1.まずはgmailでアカウントを作成します。

2.右上隅にある「アカウント」から、「接続済みのアプリとサイト」>「安全性の低いアプリの許可」を「有効」にします。
※これをしておかないとgmailからエラーで怒られます。authenticationエラーとかでたり、以下のようなエラーがでます。
※他のサイトにはこの部分の記載が少ないので、私はこれではまりました(泣)

https://accounts.google.com/ContinueSignIn?sarp=********************
Please log in via your web browser and then try again Learn more at https://support.google.com/mail/answer/78754

3.作成したアカウントのIDとパスをエンコードしておきます。
#echo "hogehoge@gmail.com" | openssl enc -e -base64
aG9nZWhvZ2VAZ21haWwuY29tCg==          <--このワードが必要です。
#echo "password" | openssl enc -e -base64
cGFzc3dvcmQK                  <--このワードが必要です。

4.ここからsmtpサーバにTLS接続します。
#openssl s_client -starttls smtp -crlf -connect smtp.gmail.com:587
CONNECTED(00000003)
depth=2 /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
0 s:/C=US/ST=California/L=Mountain View/O=Google Inc/CN=smtp.gmail.com
 i:/C=US/O=Google Inc/CN=Google Internet Authority G2
1 s:/C=US/O=Google Inc/CN=Google Internet Authority G2
 i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
2 s:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
 i:/C=US/O=Equifax/OU=Equifax Secure Certificate Authority
---
Server certificate
-----BEGIN CERTIFICATE-----
 asjfoaioehoatklnasijoYHO
    :
   途中省略
    :
---
New, TLSv1/SSLv3, Cipher is AES128-SHA
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
  Protocol : TLSv1
  Cipher : AES128-SHA
  Session-ID: F0A89AFDBB5E972F28E057397F899E1A1AA2B007B64452110E31987C47D1DF86
  Session-ID-ctx:
  Master-Key: 9DC85468BB13CD18A795462BAC18D2B183EB5301F79EC83C01C4A2777856352C5ABBB790744FE1FDB9D6329A8C65E96D
  Key-Arg : None
  Start Time: 1450146939
  Timeout : 300 (sec)
  Verify return code: 0 (ok)
---
250 SMTPUTF8

5.接続oKになったようなので、ここで、「EHLO localhost」を入力して、SMTPクライアントを識別させます。
    :
EHLO localhost          <-- 入力
250-smtp.gmail.com at your service, [xxx.xxx.xxx.xxx]
250-SIZE 35882577
250-8BITMIME
250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-CHUNKING
250 SMTPUTF8

6.認証が必要なので「AUTH LOGIN」を入力し、さきほどのユーザーID、パスをエンコードしたものを入力。
    :
AUTH LOGIN            <--入力
334 VXNlcm5hbWU6
aG9nZWhvZ2VAZ21haWwuY29tCg==   <--さきほどのID
334 UGFzc3dvcmQ6
cGFzc3dvcmQK           <--さきほどのパス
235 2.7.0 Accepted

7.あとは、いつもの通りのコマンドでok。
    :
mail from:<hogehoge@gmail.com>   <--なぜか<>で囲まないとエラー
250 2.1.0 OK dy4sm45552168pab.36 - gsmtp
rcpt to:<hogehoge@gmail.com>    <--なぜか<>で囲まないとエラー
250 2.1.5 OK dy4sm45552168pab.36 - gsmtp
data                   <--データ開始
354 Go ahead dy4sm45552168pab.36 - gsmtp
subject:test mail             <--件名
testmail                 <--本文
.                     <--データ終了
250 2.0.0 OK 1450147431 dy4sm45552168pab.36 - gsmtp
quit
221 2.0.0 closing connection dy4sm45552168pab.36 - gsmtp
read:errno=0


これで、gmailにメールが届きます。ご参考まで。

以下のサイトを参考にさせていただきました。ありがとうございます!
http://yukimura1227.blog.fc2.com/blog-entry-43.html

キーワード:telnet,smtp,gmail,tls,587,openssl,smtp.gmail.com,EHLO,AUTH LOGIN,starttls,s_client,subject

1 件のコメント:

Unknown さんのコメント...

投稿失礼します。完全に素人の興味本位なレベルで恐縮です。
こちらのブログを参考に私も全く同じ流れで挑戦してみましたがGoogleアカウントにログインする段階で以下のエラーが表示されてログインできません。直前までの画面遷移はほぼ同じだと思います。

535-5.7.8 Username and Password not accepted. Learn more at
535 5.7.8 https://support.google.com/mail/?p=BadCredentials h186sm2880556pfg.15 - gsmtp

<環境>
・Windows Vista(32bit)
・コマンドプロンプト利用
・Wi-Fi: a-term-g
・「Win32OpenSSL_Light-1_0_2f.exe」をインストールしてSSL接続とエンコードに利用

<試したこと>
・グーグルアカウント内
 -安全性の低いアプリの許可
 -セキリュティを2段階認証に変更
 -アプリ用パスワードをコマンドプロンプトに割当
→いずれも状況変わらず

・その他
 -Proxyソフトを利用してのアクセス
→opensslでのSMTPサーバへのアクセスすらできなくなる

<こうじゃないかなと思っていること>
・Windows Vistaだから
・自前のサーバー(とOS)を持っていないから
・日ごろの行いが悪いから

以上となります。もしも何かお気づきのことがあったら教えていただけると幸いです。繰り返しになりますが全くの素人で、丸一日ググり続けた結果どうにかここまでたどり着きましたのでこれ以上の独自ググりでは限界を感じた次第です。ありがとうございました。