さくらサーバ上のRubyでメール処理

さくらサーバ上の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)

参考