Rubyで日本語の添付ファイル付きメールを送信する

Rubyでのメールライブラリとしては、tmailが有名なようです。
Ruby on RailsのActionMailerもtmailを使用しています。

ですが…、tmailドキュメントが少ない。
日本語メールの送信や、添付ファイルの送信に苦労しました…orz

自分が使いやすいように日本語や添付ファイルを扱いやすいようにしたJMailというクラスをつくりましたので載せておきます。
tmailのキモは、たぶん、メール全体も、そのメールの本文も、添付ファイルも同じようにTMailのオブジェクトで扱うということ。

TMailのメンバー変数(Rubyではメンバー変数とは呼ばない?)にpartsというものがあり、これにTMailのオブジェクトをドンドコpushすることでマルチパートのメールを作成できます(たぶん)。

#!/usr/bin/ruby
require 'rubygems'
require 'tmail'
require 'net/smtp'
require 'kconv'
require 'base64'
# 日本語メールクラス
class JMail
# 初期化処理
def initialize()
@mail = TMail::Mail.new
@mail.mime_version = '1.0'
end
# アカウントの設定
def set_account(smtp_server, from_address)
@smtp_server = smtp_server
@mail.from = from_address
@mail.reply_to = from_address
end
# 宛先を設定する。
def set_to(to_address)
@mail.to = to_address
@to_address = to_address
end
# タイトルを設定する。
def set_subject(subject)
work = Kconv.tojis(subject).split(//,1).pack('m').chomp
@mail.subject = "=?ISO-2022-JP?B?"+work.gsub('\n', '')+"?="
end
# 本文を設定する。
def set_text(text)
main_text = TMail::Mail.new
main_text.set_content_type 'text', 'plain', {'charset'=>'iso-2022-jp'}
main_text.body = Kconv.tojis(text)
@mail.parts.push main_text
end
# メールを送信する。
def send()
@mail.date = Time.now
@mail.write_back
Net::SMTP.start(@smtp_server) do |smtp|
smtp.sendmail(@mail.encoded, @mail.from, @to_address)
end
end
# ファイルを添付する。
def set_attach(file_path)
attach = TMail::Mail.new
%r|(^.*)/(.+$)|.match(file_path)
file_path, file_name = $1, $2
tmp_file_path = File.expand_path(file_name,file_path)
attach.body = Base64.encode64 File.read(tmp_file_path)
attach.set_content_type 'application','zip','name'=>file_name
attach.set_content_disposition 'attachment','filename'=>file_name
attach.transfer_encoding = 'base64'
@mail.parts.push attach
end
end
SMTP_SERVER   = 'smtp.sample.com'
TO_ADDRESS    = 'to@sample.com'
FROM_ADDRESS  = 'from@sample.com'
TITLE         = '日本語タイトル'
MAIN_TEXT     = '日本語本文'
FILE_PATH     = 'sample.zip'
jmail = JMail.new()
jmail.set_account(SMTP_SERVER, FROM_ADDRESS)
jmail.set_to(TO_ADDRESS)
jmail.set_subject(TITLE)
jmail.set_text(MAIN_TEXT)
jmail.set_attach(FILE_PATH)
jmail.send