(ruby)(net/smtpの send_mailを使って 手っ取り早く SMTP-AUTH認証で プレーンテキストのメールを送る)

 自分用のメモです

 とりあえず rubyからメールを送る方法 を 確立しようと思い
付け焼刃ですが yahooメールなどから送信できるものを書いてみました
SMTP-AUTHで認証しているサーバなら ある程度はこれで行けると思いますが
もっと詳細に設定しないとダメな サーバもあるかもしれません
そういうのは また追々チャレンジしてみます

 まず 関数を定義したファイルを一個用意
ファイル名:rapidmail.rb / ファイルエンコーディングUTF-8

require 'net/smtp' require 'nkf' def rapidmail(smtp_server, smtp_port, user_id, user_password, send_from, send_to, subject, message, helo_domail = 'localhost.localdomain', auth_type = nil) buf = NKF.nkf('-Wm0j' , "From: <#{send_from}>\n" << "To: <#{send_to}>\n" << "Subject: #{NKF.nkf('-WMm0j', subject)}\n" << "Date: #{Time.now}\n" << "Mime-Version: 1.0\n" << "Content-Type: text/plain; charset=ISO-2022-JP\n" << "Content-Transfer-Encoding: 7bit\n" << "\n" << "#{message}" ) if RUBY_VERSION == '1.9.1' then buf = buf.force_encoding('US-ASCII') end smtp = Net::SMTP.new(smtp_server, smtp_port) smtp.start(helo_domail, user_id, user_password, auth_type) smtp.send_mail(buf, send_from, send_to) smtp.finish() end
 force_encoding('US-ASCII') の所が目に付くと思いますが
本来なら send_mailに ISO-2022-JP(JIS)を投げ込んでもいいはずなんですが
1.9.1で ISO-2022-JP を send_mailに投げ込むと 処理の途中で
「US-ASCII と ISO-2022-JP の互換性がありません」みたいな感じの 英文のエラーを出して止まってしまいます
おそらくこれは 1.9.1が抱える問題だと思うんですが
メールを送れない事には話になりませんよね? 笑)

 よって 副作用の危険性もあるかもしれませんが、 ちょっとした裏技を使っています
これは force_encoding('US-ASCII') によって見かけ上「このデータはUS-ASCIIですよ」と主張することで
エラーを免れる事が出来ているんだと 推測します (あくまでも推測ですよ? 笑)
データ内容が破壊されない保障は無いと思うのでちょっと怖いですけどね 笑)

 この症状は 他のバージョンのrubyエンコーディングが関係するケースで 発生する可能性がありますので
似たようなケースで詰まってしまった時は force_encodingを実装しているバージョンなら
このような裏技を試してみるといいかもしれません

 さて、 利用する場合ですが 上で作ったスクリプトを requireして 関数を呼び出します
ファイル名:<特に指定無し> / ファイルエンコーディングUTF-8

#!/usr/bin/ruby -Ku require 'rapidmail' message = <<EOMES まいどおさがわせしてます これはテストメールです this is test message. EOMES rapidmail( '<SMTPサーバのアドレス>', <SMTPサーバの待ち受けポート>, '<メールアカウントのID>', '<メールアカウントのPassword>', '<メールアカウント(=送信元)のメールアドレス>', '<送信先のメールアドレス>', '<メールの題名>', message )