Top > Blog > Programming

Ruby覚書

珍しく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

コメントの投稿