珍しくRubyでCGIなんぞ作ったので、忘れないようにメモを…
CGIからメールを送る
Rubyには TMail とか ActionMailer などのメール送信ライブラリがあるようですが、試してみたところ、そもそも配備対象のレンタルサーバーからはSMTPでの送信が出来ませんでした。 ポートが閉じられてるらしい。。。
レンタルサーバーの説明書を読むと sendmail は使えるようだったので、そいつでメール送信するとうまく行きました。 下記がそのメソッドです。
require 'kconv' def sendmail(from, to, cc, bcc, subject, body) path = "/usr/lib/sendmail" # sendmailのパス subject = subject.tojis subject = [subject].pack('m') # Base64 subject.gsub!(/\n/, "") subject = "=?ISO-2022-JP?B?#{subject}?=" body = body.tojis IO.popen("#{path} -t", "r+") { |io| io.print "From: #{from}\n" io.print "To: #{to}\n" io.print "Cc: #{cc}\n" if cc != nil io.print "Bcc: #{bcc}\n" if bcc != nil io.print "Subject: #{subject}\n" io.print "MIME-Version: 1.0\n" io.print "Content-Type: text/plain; charset=iso-2022-jp\n" io.print "Content-Transfer-Encoding: 7bit\n" io.print "\n" io.print "#{body}\n" } end
JIS変換で文字化け
前述のメール送信で、件名をJISに変換してますが、テストしてたらここで微妙に文字化けが発生してました。 調べてみるとどうも件名を定義しているスクリプトの文字コードがShift_JISなのに、オプションを指定せずに Ruby のインタプリタを実行していたのが原因らしい。説明はリファレンスマニュアルにありました。
FAQ::日本語の取り扱い – Rubyリファレンスマニュアル
こうすれば良いんですね。
#!/usr/local/bin/ruby -Ks
CGI実行時に発生したエラーを見る
begin ~ rescue(例外処理)end で、例外処理に以下のようなコードを実行させると、例外発生時にバックトレースが見れました。
require "cgi" require "erb" # 同一ディレクトリのrbファイルを参照 Dir.glob("*.rb").each do |file| require file end begin print "Content-type: text/html\n\n" cgi = CGI.new # 以下、CGIの処理... rescue Exception => e #例外を取得 print "Content-Type: text/plain\n\n" puts "Error:" puts e puts "" puts "backtrace:" print e.backtrace end