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