サーバー(WEB・MAIL)を運用していると、メールアカウント情報を取られたり、WEBフォームの脆弱性をつかれたり、CMSの管理者アカウントを取られて変なプラグイン入れられたりして、大量のスパムメールが送信される事がある。
そんな場合、大概はメールキューが大量に溜まってしまいメールが遅延したり、スパムIPとして登録されちゃったりイイ事なんてこれっぽっちもない(--;)
そこで、メールキューをチェックして既定の数値を超えたらメールサービスを強制停止してしまえ!と考えてみた。
しかーし、そうするとメールサービスを止めた事を管理者に通知が出来ない(--;)
別のサーバーからポートが開いてるかチェックして通知するのでも良いのだけど・・・それは負けた気がするので何とかしてみる。
telnetを使えば何とかなるかと思ったけど、それはそれで25番ポートで繋がるメールサーバーが必要になる(--;)
そこで、gmailをSMTPとして利用する方法をgoogle先生に聞いてみた。
はるかなる熊さんのブログに書いてある方法で出来る事が判明!
以下のgmailアカウントを使ってメールを送る場合
ユーザー :hoge@gmail.com
パスワード:hogehoge999
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させる必要がある。