ruby でメールを送受信する


mutt というメーラを愛用していることは何度も書いた。で、受信は fetchmail + procmail で Maildir 形式に振り分け、送信は IM でやってたのだが、最近は送受信とも ruby で書かれた mailclient.rb で行なっている。

個人的に、どうも IM というのが好きになれないうえに、実質 imput しか使っていないので、なんとか捨てたいなぁと常々思ってはいたのだ。mew を使っている人ならもう IM しか選択肢がないのかも知れぬが、こっちはなにしろ mutt だもんね。なんでも使えるぜ。

まず、ruby をインストールしよう。パッケージ置き場からどうぞ。首尾よく ruby が rpm --rebuild でき、インストールもできたなら、あおきさんのページへ行き、inetclient version 1.0.10 をいただいてこよう。次は、やまだ あきらさんrfc822.rbをゲットだ。最後に前田 修吾さんmailclient.rbをゲット。これで必要なファイルは揃う。なお、rfc822.rb は obsolete 寸前で やまだ あきら さんのホームページにも現在はリンクはないし、mailclient.rb も ruby-list ML に前田さんが流してくださっただけで、前田さんのホームページには置かれるつもりはないようなので、オレのページに置いておくことにする。

inetc.tar.gz を展開すると、inetc-1.0.10 というディレクトリが掘られ、ドキュメント類などとともに inetclient.rb, popclient.rb, smtpclient.rb, must.rb という4つのファイルがあるはずだ。これを /usr/lib/ruby (または /usr/local/lib/ruby ね。適宜読み換えるべし) にコピーする。たぶんパーミッションが 600 になっていると思うので、644 にしておこう。

次に rfc822.rb も同様に /usr/lib/ruby にコピーしよう。そして PATH の通ったディレクトリに mailclient.rb を コピーし、さらに同じ mailclient.rb を imput.rb としてコピーしておこう。つまり、同じ内容で名前の異なるものを mailclient.rb と imput.rb として PATH の通ったところにおく、と(最初からそう書かんかい>オレ)いうことね。あ、chmod +x も忘れずに。

そしたら、おもむろに mkdir -p ~/spool/mqueue などとして送信キューを掘ろう。

で、設定ファイルとして以下のような内容の ~/.mailclient.rb というファイルを用意する。

SPOOL_DIR = "~/spool/mqueue"
SMTP_SERVER = "smtp.best.com"
MDA = "/usr/bin/procmail"
POP[0] = {
  :SERVER => "shell8.ba.best.com",
  :USER => "hoshina",
  :PASSWORD => "ほげほげ"
}
SMTP_TIMEOUT = 60
POP3_TIMEOUT = 60

簡単でしょ?読んだままだよ。SPOOL_DIR は今掘ったからいいとして、SMTP_SERVER と POP[0]の:SERVER と :USER は適宜、自分の ISP に合わせよう。:PASSWORD ももちろん"ほげほげ"ぢゃダメだよ(笑)

これで、mailclient.rb の設定はおしまい。念のため、procmail による受信時に振り分ける設定も書いておく。

#VERBOSE=on
PATH=$HOME/bin:/usr/bin:/bin:.
MAILDIR=$HOME/Mail      # You'd better make sure it exists
LOGFILE=$MAILDIR/from
LOCKFILE=$HOME/.lockmail
DEFAULT=$HOME/Maildir/

:0
* ! ^Lines:
{
  # Count number of lines
  :0B
  * 1^1 ^.*$
  { }
  LINES = $=
	  
  # Add Lines: header
  :0 fhw
  | formail -a "Lines: $LINES"
}		
		
:0
* To: .*ppxp
ppxp/

:0
* X-ML-Name: gorou
gorou/
… 以下、えんえんと続く(笑)

と、こんな感じ。大きな注意点としては3つあって、1つは procmail 3.10 ではどうも Maildir 形式に対応していないようだ、ということ。 procmail-3.11pre7 がパッケージ置き場にあるので、そちらは対応している。

2つ目は、受信時に振り分ける場合に、実際にメールが保存されるディレクトリが掘られていないのに ~/.procmailrc に指定だけはある、という状態だと、メールがどっかいっちゃう(笑)こと。そう。procmail はディレクトリを自動で掘るまでは面倒見てくれないのだ。上記の例だと、少なくとも

mkdir -p ~/Mail/ppxp/{cur,new,tmp}
mkdir -p ~/Mail/gorou/{cur,new,tmp}

だけはあらかじめやっとく必要がある。

3つ目は、振り分けるフォルダの名前(つまりはディレクトリの名前なのだが)の最後に、必ず / を付けておくこと。ppxp/ とか gorou/ とか。こうしないと MH 形式になってしまうらしい。

ここまでの準備が滞りなくできていれば、おもむろに mailclient.rb とすれば ISP の POP3 鯖からメールを引っ張ってくるはずだ。mutt から mailclient.rb を使うために、~/.muttrc に設定しよう。必要なもの、便利なものだけ抜粋すると、

mailboxes ! +gorou +package +x-tt +ppxp +ruby-list +s-lang +mutt-jp +linux-users
set nomove
set nomsgid
set mbox_type=Maildir
set folder=~/Mail
set spoolfile=~/Maildir
set sendmail="~/bin/imput.rb"
macro index G "!mailclient.rb\n" 
macro pager G "!mailclient.rb\n"

といったところか。

1行目は、フォルダの名前を +フォルダ名 として並べて書いている。これを書いておくと、新着メールがどこに振り分けられたのかわからなくても困らなくなる呪文だ。c を押すと、開くフォルダを聞いてくる、というのが mutt の標準の動きだが、この時に未読のメールがあるフォルダを自動的に表示してくれるようになる。スペースを押すことによって、次の未読メールがあるフォルダを次々に候補として出してくれるのだ。便利。

2行目は mutt を抜けるときに 読んだメッセージを /home/toru/mbox に移しますか? などといち〜ち聞かないように黙らせる呪文。3行目はお約束で、ダイアルアップな人が mutt を使う場合に、mutt が Message-ID を捏造しないようにする。ISP の SMTP鯖に FQDN を付けさせるようにしようね。

4,5,6行目は ~/.procmailrc に合わせただけ。7行目がいよいよ mailclient.rb(送信用途なので imput.rb にリネームした方だが)を使う指定だ。オレの場合は ~/bin に置いているが、適宜環境に合わせて変えるべし。フルパスじゃなくてもいいし。だが、この imput.rb は、実際には即座に送信はしないので注意が必要だ。先程掘った ~/spool/mqueue に送信待ちメールを溜めるだけ。

8,9行目では mutt を開いているときに G を押すと mailclient.rb を実行するように指定している。mailclient.rb は ISP の POP3 鯖にメールを取りに行くのだが、その際に、送信待ちメールがあった場合は実際に smtp で投げるという動作をする。

かな漢字変換も ruby、メールの送受信も ruby、掲示板の書き込みも ruby、近いうちに掲示板サーバ自体も ruby になるだろう。わはは。ruby だよ人生は(受け売り)


メール 戻る