さくらサーバ上のRubyでメールの処理を行うにはどうしたらよいのか、知りたくて調べてみました。
mailfilter
さくらサーバにメールが届いた場合、mailfilterを使ってプログラムにメールを渡します。
まずはさくらサーバの管理画面でメールアドレスを作成します。
さくらインターネットサーバコントロールパネル
例えばfoomail@foo.sakura.ne.jpを作成したとします。
メールアドレスを作成後、ホームディレクトリのMailBoxに以下のようなファイルを作成ます。アクセス権はchmod 600にする必要があります。
$HOME/MailBox/foomail/.mailfilter
cc "| /home/foo/mailcatch.rb"
メールボックスにメールを残さなくて良い場合は"cc"を"to"に変更します。
macilcatch.rbは例えばこんな感じ。標準入力からメールを読み取ることができます。
#!/usr/local/bin/ruby message = STDIN.read File.open("/home/foo/foomail" , "w").write(message)
参考
TMailのインストール
受信したメールを解析するにはTMailを使います。
Rubyには添付ライブラリに"mailread"というライブラリが付属していますが、イマイチ(というか全然)使えません。
Ruby Reference Manual - るりま
そこで調べてみるとどうやらTMailというのを使っている人が多そうです。
TMail — A Ruby Email Handler
さっそくダウンロードしてさくらサーバにインストールしてみましょう。しかしルート権限がないので、ホームディレクトリ以下にインストールする必要があります。
mkdir -p $HOME/local/lib/ruby/site_ruby/1.8/i386-freebsd7 tar zxvf tmail-1.2.3.1.tgz cd tmail-1.2.3.1 ./setup.rb all --prefix=$HOME/local --siterubyver=$HOME/local/lib/ruby/site_ruby/1.8/ --siterubyverarch=$HOME/local/lib/ruby/site_ruby/1.8/i386-freebsd7/
参考
TMailでメール解析
では早速、受信したメールを解析してみます。
.mailfilterからメールの内容を標準入力で受け取ることを想定しています。
#さくらサーバではホーム以下にtmailをインストールしたのでパスを通す必要があります。 #ENV["HOME"]は使えない $:.push("/home/foo/local/lib/ruby/site_ruby/1.8") require "tmail" mail = TMail::Mail.parse(STDIN.read) puts mail.from puts mail.date.strftime("%Y-%m-%d %H:%M:%S") puts mail.body
参考
TMailとSMTPでメール送信
TMailとSMTPを使ってメールを送信します。
#!/usr/local/bin/ruby #さくらサーバではホーム以下にtmailをインストールしたのでパスを通す必要があります。 #ENV["HOME"]は使えない $:.push("/home/foo/local/lib/ruby/site_ruby/1.8") require 'tmail' require 'net/smtp' require 'kconv' def sendmail(to , from , subject , body , smtpserver = "localhost") mail = TMail::Mail.new mail.to = to mail.from = from mail.reply_to = from mail.subject = Kconv.tojis(subject).gsub("\n" ,"") mail.body = Kconv.tojis(body) mail.date = Time.now mail.mime_version = '1.0' mail.set_content_type('text', 'plain', {'charset'=>'iso-2022-jp'}) Net::SMTP.start(smtpserver) {|smtp| smtp.sendmail(mail.encoded , mail.from , to) } end to = 'hogemail@example.jp' from = 'foomail@foo.sakura.ne.jp' subject = '件名' body = "本文" sendmail(to , from , subject , body)
参考