SVX日記
2005-04-15(Fri) Rubyで添付メール送るライブラリ発掘
今日はセッセセッセと、昨日のインポートスクリプトを利用して、過去のメールをGmailへとインポートする。Web上にもあるケド……とは思ったが、各種メーリングリストの内容も併せてインポートしてみた。検索能力の高さを考えると、いつかMLで見た情報を……って時に重宝するに違いないからだ。
You are currently using 70 MB (3%) of your 2099 MB.
いーかげん、インポートしツカレたのにもかかわらず、いまだGoogleは挑戦的なメッセージを繰り出してくる。たった3%だって……。ちなみに、Gmailの容量は、この4月1日に1Gから2Gに拡張され、それからも徐々に容量は増加しているらしい。すると、ハンパの99MBというのはそれからの増加分であり、今回転送した70MBはその増加分にも満たないというコトか!? Google恐るべし……。
ちなみに、昨日紹介した「Google GMail Loader」であるが、敵を知ろうと(?)サイトを見て回ったトコロ、Windows版のスクリーンショットでちょっと見慣れたアイコンを見てしまった。左上のアイコンはTkを使ってるシルシである。どーやら、Python/Tkで開発されたらしい。なんと、敵はPythonか……にしても、そのサイズはなんだよ。Pythonの処理系を含んでのサイズなのだろうが、3.6Mバイトって……。
一方でLinux版はバイトコンパイルされたPythonのプログラムだが、サイズは一気に縮んで1/10の360kバイト。それでも360kバイトかよ。ちなみにオイラの作ったimport2gmailは641バイト。扱えるファイルの種類やエラー処理に違いはあれど、さらにその1/500以下だ。ま、単純に比較するのはヘンだけども。
さて、それはそうと、メールのインポートが終わったので、次はバックアップストレージとして活用するためのスクリプトの開発である。とりあえず、スクリプトから添付ファイル付きのメールを飛ばす必要があるのだが、Ruby本体に添付のライブラリ集には、大したライブラリが含まれていない。
唯一あるのが、mailread.rbライブラリのMailクラスだが、これはメールを読み出すだけで、メールを送信する機能がなく、net/smtp.rbライブラリのNet.SMTPクラスはメールを送信するだけで、メールの内容を操作する機能がない。添付ファイル付きのメールを飛ばすのに必要なのは、まさにこの間をウマくつなぐクラスなのである。
ところが実はオイラ、かなり以前に職場でテストプログラム用に既にクラスを組んでるんだよね……ゴソゴソ……さんざん探し回ったトコロ、なんとか出てきた。ちょっと昔に組んだヤツだが、手前味噌ながら非常によくできたクラスだと思う。サンプルプログラムと一緒にまとめて置いておく。email.rbライブラリのEmailクラス、それを継承したEncodedEmailクラス、更にそれを継承したAttachedEmailクラスだ。
#!/usr/bin/env ruby
require 'email'
require 'kconv'
#-------------------------------------------------------------------------------
#
# send attached mail
#
mail = AttachedEmail.new
mail.smtpServer = "smtp.provider.co.jp"
mail['To'] = "hoge@gmail.com"
mail['From'] = "hoge@itline.jp"
mail['Subject'] = "■■■■■■■■ 添付メールテスト ■■■■■■■■".mime_encode
block1 = Email.new
block1['Content-Type'] = "Text/Plain; charset=ISO-2022-JP"
block1 << "This is attached mail test."
block1 << ""
block1 << "添付メールもこんなに簡単".tojis
block1 << ""
block1 << "=== Hogeta Hogeo ==="
block2 = EncodedEmail.new
#lock2['Content-Type'] = "Image/Jpeg; name=\"xxxx.jpg\"" # 画像を添付する場合
block2['Content-Type'] = "Application/Octet-Stream; name=\"#{"添付Mail.rb".mime_encode}\""
block2['Content-transfer-encoding'] = "base64"
block2 << open('attachfile.dat').read
mail << block1 << block2
mail.send
ほとんどの指定は、メールを送るのに必須の情報を渡しているダケで、コマンド的にはnewして、<<で添付して、sendで送るという3段階だけだ。また、メールを送るだけじゃなくて受けるのも簡単。クラスをnewするときにファイルハンドラを渡してやるダケ。
#!/usr/bin/env ruby
require 'email'
require 'kconv'
#-------------------------------------------------------------------------------
#
# receive attached mail
#
mail = AttachedEmail.new(STDIN)
mail.header.each {|k, v|
print "#{k}: #{v.mime_decode.toeuc}\n"
}
mail.block.each {|b|
print $/
p b.decode
}