家庭用Faxをe-mailに転送機能が付いたブラザー複合機買った。A3の印刷が出来るってことで買った。楽しみにしてたブラザーのFAX→メール転送機能はSTMP over SSLに非対応だった。残念だった。非常に残念だった。仕方ないから返品しようかと思ったけど、それくらいRubyで何とかすればいいじゃない?っていう悪魔のささやきが聞こえた。
SMTPをフォワードするためのSMTPを書いた。
SMTPって最近規制が多いので従来のパッケージでは動かないことも多いので、いい機会だからプロキシサーバーを書いておいた。
これを使えば、任意のメールサーバーをリレーできる。PostfixやQmailで設定してもいいけどさ、Postfix面倒だし。C言語があまりできない僕は、デバッグが大変なのでRubyでパパっとやることにした。
GmailにforwardするだけのSMTPサーバー
#!/usr/bin/env ruby # coding: utf8 require 'rubygems' require 'net/smtp' require 'mini-smtp-server' require "tlsmail" class GMailForwarderServer < MiniSmtpServer def new_message_event(message_hash) puts :recieved puts :mail puts "-"*100 puts message_hash.inspect puts "-"*100 puts :forwarding mail_to = message_hash[:to].match( %r"<([^>]+)>").to_a[1] puts mail_to mail_from = message_hash[:from].match( %r"<([^>]+)>").to_a[1] puts mail_from mail_encoded = message_hash[:data] puts mail_encoded Net::SMTP.enable_tls(OpenSSL::SSL::VERIFY_NONE) puts :tls_enabled Net::SMTP.start( "smtp.gmail.com", 587, "local","account@gmail.com", "**gmail-password**", "plain" ){|smtp| smtp.sendmail( mail_encoded, mail_from, mail_to ) } puts :forwarded end end server = GMailForwarderServer.new(25,"localhost", 1) server.start server.join
実運用時のポイント
init.dの init スクリプトに登録した。 (upstartでもいい。upstartならdaemonsパッケージも不要だしね。)
Daemons.run_proc("smtp_proxy_server"){ server = GMailForwarderServer.new(25,"192.168.119.22", 1) server.start server.join }
この時に localhostだと、外部からの接続を受け付けないので注意です。
メールのプロキシサーバーってひとつ持ってると便利ですよ。
メールのプロキシサーバーってひとつ持ってると便利ですよ。
- メールが来たら◯◯するとか
- ◯◯が終わったらメールするとか。
そういう処理をメールに集約できるので、処理のメッセージングがとても便利です。
railsアプリでメール送信時にSMTPがちゃんと動作するか見るとか。
キャリア絵文字を変換するためにGmailにわざと転送(プロキシ)するとか。
何かと便利です。
本気モードでPostfix使えばキューも付いてくるのである意味分散処理的だし。
処理のメッセージングなんてメールでいいんですよ。
家電向け
メール機能が付いてるけど、SMTPSやAUTHに非対応の家電をちゃんと活用するのに便利。
プロキシをクラウド側やVPSで起動しておいてもいいですね。