JSの設定

2010年7月11日日曜日

willcomのメールフィルタリングの不自由さを解決する

いかに、携帯(PHS)に残したいメールだけ(自動的にフィルタリングして)残すかという話。
willcomのメール設定では、fromアドレスを指定してメールの受信を拒否することができる。
アスタリスクが使えるので、例えば「*@*.com」みたいな条件を設定することができるが、
正規表現までは使えないので加減が難しい。そもそも、fromアドレスだけじゃなく本文もフィルタリング条件にしたい。

これを実現するために、知人には携帯アドレスではなく例えばGMailのアドレスを伝えることにし、そこに届いたメールは一旦全て自宅サーバに転送してしまい、思う存分フィルタリングをかけた上で好きなものだけ携帯に送るようにしてはどうか。間にGMailを挟むことで可用性が向上する上、第一フィルタリングをGMailで設定することによって自宅サーバの負荷を抑えられる。
メールの種類によって読む端末を分けたい場合にも有効で、GmailならiPadやiPhoneを初めとする無線LAN対応機器を使い通信料を発生させずに読むことができる。


「思う存分フィルタリング」のやり方。
だいたいここに書いてあることと同じだが、procmailrcの内容を以下のように変えている。これにより、メールソースを渡しつつfoward.rbを実行することができる。


MAILDIR=$HOME/Maildir/
DEFAULT=$MAILDIR
RubyDir=$HOME/scripts/ruby
TmpDir=$HOME/tmp/
LOGFILE=$MAILDIR/proc/`date +%Y-%m`.log
LOCKFILE=$HOME/.lock
VERBOSE=ON

:0 Hc :
* .
|cat > $TmpDir/mail; $RubyDir/forward.rb


メールソースをrubyで扱うのにtmailというライブラリが便利なのでこれを利用する。メールを送信するにはnet/smtpを使うが、認証がうまくいかなかったのでaction_mailerを使うことにした。
gem install tmail
gem install action_mailer

以下、forward.rb の例。


#!/usr/bin/ruby

require 'rubygems'
require 'action_mailer'
require 'tmail'
require 'kconv'

〜中略〜
mail = TMail::Mail.load(mail_path)
# 前述のprocmailrcの「cat > $TmpDir/mail」で保存した一時ファイルを指定している
subject = mail.subject
body = mail.body
〜中略〜

# 日本語文字化け対策つきメール送信メソッドの定義
class HogeMailer < ActionMailer::Base
@@default_charset = 'iso-2022-jp'
@@encode_subject = false
def hogeMessage(recipient, mySubject, myBody)
from 'from@from.com'
recipients recipient
subject '=?ISO-2022-JP?B?' + Kconv.tojis(mySubject).split(//,1).pack('m').chomp + '?='
body Kconv.tojis(myBody)
end
end


#認証とかの情報設定
ActionMailer::Base.smtp_settings = { :address => '127.0.0.1',
:port => 25,
:domain => 'XXX',
:user_name => 'XXX',
:password => 'XXX',
:authentication => :login}

#送信!
HogeMailer.deliver_hogeMessage('to@to.com', mail.subject, mail.body)


上記では単に転送しているだけだが、mail.fromやmail.bodyを正規表現などでフィルタリングしたあと
複数の宛先に投げ分ければよい。また、大量のスパムメールが直接携帯アドレスに届くような場合には、willcom側の設定で例えば「*.com」を拒否しておき、forward.rbの中でfromアドレスを「.com」→「.etc」のように書き換えた上で転送するなど、色々応用がきく。