bashでgmail.comからメールを送る

サーバー(WEB・MAIL)を運用していると、メールアカウント情報を取られたり、WEBフォームの脆弱性をつかれたり、CMSの管理者アカウントを取られて変なプラグイン入れられたりして、大量のスパムメールが送信される事がある。

 

そんな場合、大概はメールキューが大量に溜まってしまいメールが遅延したり、スパムIPとして登録されちゃったりイイ事なんてこれっぽっちもない(--;)

 

そこで、メールキューをチェックして既定の数値を超えたらメールサービスを強制停止してしまえ!と考えてみた。

しかーし、そうするとメールサービスを止めた事を管理者に通知が出来ない(--;)

別のサーバーからポートが開いてるかチェックして通知するのでも良いのだけど・・・それは負けた気がするので何とかしてみる。

 

telnetを使えば何とかなるかと思ったけど、それはそれで25番ポートで繋がるメールサーバーが必要になる(--;)

 

そこで、gmailSMTPとして利用する方法をgoogle先生に聞いてみた。

はるかなる熊さんのブログに書いてある方法で出来る事が判明!

 

以下のgmailアカウントを使ってメールを送る場合 

 ユーザー :hoge@gmail.com

 パスワード:hogehoge999

 SMTPサーバー:smtp.gmail.com

 

gmailの認証情報はbase64エンコードしておく必要がある。さらっとPerlエンコードしちゃいます

 

 perl -MMIME::Base64 -e 'print encode_base64("\000hoge\@gmail.com\000hogehoge999")'

AGhvZ2VAZ21haWwuY29tAGhvZ2Vob2dlOTk5

 

メールの送信はopensslコマンドを使います。

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

...

...

---

250 CHUNKING

EHLO localhost

250-mx.google.com at your service, [122.213.181.245]

250-SIZE 35882577

250-8BITMIME

250-AUTH LOGIN PLAIN XOAUTH XOAUTH2 PLAIN-CLIENTTOKEN

250-ENHANCEDSTATUSCODES

250 CHUNKING

AUTH PLAIN

334

AGhvZ2VAZ21haWwuY29tAGhvZ2Vob2dlOTk5

235 2.7.0 Accepted

 

後はコマンドラインでメールを送るのと同じ手順でOK(^^)

mail fromはgmailで設定されているデフォルトメールアドレスが利用されるので何を指定してもsmtp.gmail.comを使う限り上書きされないが、メール送信時の必須なので省略は出来ない。

rcpt toで指定されたアドレスはヘッダーにも表示されないので、実際にメールクライアントで表示されるTOのアドレスはTo:で指定したメールアドレスになる。

 

mail from: <hoge@hoge.net>

rcpt to: <your_mail@example.com>

data

From: SYSTEM <hoge@hoge.net>

To: your_mail@example.com

Subject: TEST MAIL


MAIL MESSAGE 

.

QUIT

 

rcpt toで指定したメールアドレスにメールが届いたら成功!

gmail.comにはメール送信の制限があるので、あまり大量のメールを送信するような場合には利用が出来ないので注意が必要。

 

Bashスクリプトで実行する場合は入力毎にsleep 1sなどを指定してwaitさせる必要がある。