[ruby-list:46740] Re: ヒアドキュメント内の変数展開が正常に行われない
From:
rubikitch@...
Date:
2010-01-06 05:16:08 UTC
List:
ruby-list #46740
From: ShingoKintaka <kamuycikap@tulip.ocn.ne.jp>
Subject: [ruby-list:46739] Re: ヒアドキュメント内の変数展開が正常に行われない
Date: Wed, 6 Jan 2010 13:32:43 +0900
> るびきちさん、書き込みありがとうございます。
> プログラムを記入します。
> 下記のcgiをhtmlファイルに記述されているformのactionで呼び出しております。
前のメールで省略された部分に原因がありました。
> name_kanji = @NameKanji.toeuc
> message =<<-"EOF"
> <html>
原因はここです。
toXXXメソッドは文字コードを推測するため、短すぎる文字列は正しく判定できないことがあります。
HTMLがEUC-JPならばスクリプトもEUC-JPにしたほうがいいと思います。
あるいは、スクリプトもHTMLもUTF-8に統一するか。
> inqmail = InquiryMail.new
> inqmail.GetForm
> inqmail.DataCheck
> inqmail.SendMail
> inqmail.TransmissionEndMessage
あとはちょっとしたところで、Rubyでのメソッド名は単語を _ でつなげるスタイルをとります。
とりあえず、修正したスクリプトと実行結果はこんな感じ。
INJECTORはテストのためとりあえずcatにしています。
#!/usr/local/bin/ruby187 -Ku
# -*- coding: utf-8 -*-
#=問合せフォームによるメール配信
#
# Authors:: Shingo Kintaka
# Version:: 1.0 2010-01-02 S.Kintaka
# Copyright:: Copyright (C) S.Kintaka , 2006. All rights reserved.
# 問合せフォームの値を取得し、メール本文に情報を記述して送信する。
#==開発履歴
# K20100102_00 新規開発
require "cgi" # CGIクラス
require 'kconv' # 漢字コード変換用
require "net/smtp" #
FROM_ADDR = "InquiryForm@foo-bar.jp"
TO_ADDR = "myaddress@foo.bar.jp"
SUBJECT = "御客様からの問合せ"
#INJECTOR = "/usr/sbin/sendmail -i -t"
INJECTOR = "cat > /tmp/mail" # テスト用
#
#= お問い合わせフォームからパラメータを取得しメールで送信する
#
class InquiryMail
# アクセサメソッド
attr_accessor :InquiryCommodity # お問い合わせ商品
attr_accessor :ContentOfInquiry # お問い合わせ内容
attr_accessor :NameKana # お名前(カナ)
attr_accessor :NameKanji # お名前(漢字)
attr_accessor :TelephoneNumber # 電話番号
attr_accessor :EmailAddress # E-Mailアドレス
attr_accessor :ZipCode # 郵便番号
attr_accessor :AdministrativeDivisions # 都道府県
attr_accessor :LocalAuthorityCounty # 市町村郡
attr_accessor :HouseNumber # 番地
#
# initialize
#
def initialize
@cgi = CGI.new
end
#
# フォーム情報を取得する
#
def get_form
@InquiryCommodity = @cgi["InquiryCommodity"] # お問い合わせ商品
@ContentOfInquiry = @cgi["ContentOfInquiry"] # お問い合わせ内容
@NameKana = @cgi["NameKana"] # お名前(カナ)
@NameKanji = @cgi["NameKanji"] # お名前(漢字)
@TelephoneNumber = @cgi["TelephoneNumber"] # 電話番号
@EmailAddress = @cgi["EmailAddress"] # E-Mailアドレス
@ZipCode = @cgi["ZipCode"] # 郵便番号
@AdministrativeDivisions = @cgi["AdministrativeDivisions"] # 都道府県
@LocalAuthorityCounty = @cgi["LocalAuthorityCounty"] # 市町村郡
@HouseNumber = @cgi["HouseNumber"] # 番地
end
#
# 入力データのチェック
#
def data_check
# print @InquiryCommodity , "<br>"
# print @ContentOfInquiry , "<br>"
# print @NameKana , "<br>"
# print @NameKanji , "<br>"
# print @TelephoneNumber , "<br>"
# print @EmailAddress , "<br>"
# print @ZipCode , "<br>"
# print @AdministrativeDivisions , "<br>"
# print @LocalAuthorityCounty , "<br>"
# print @HouseNumber , "<br>"
# 必須項目をチェックして正しければtrueを返し、間違って入ればfalseを 返す。
end
#
# メール配信
#
def send_mail
mail = <<EOF
From: #{FROM_ADDR}
To: #{TO_ADDR}
Subject: #{SUBJECT}
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
○御客様問合せ商品
#@InquiryCommodity
○お客様問合せ内容
#@ContentOfInquiry
○お名前(カナ)
#@NameKana
○お名前(漢字)
#@NameKanji
○電話番号
#@TelephoneNumber
○メールアドレス
#@EmailAddress
○郵便番号
#@ZipCode
○都道府県名
#@AdministrativeDivisions
○市町村郡
#@LocalAuthorityCounty
○番地
#@HouseNumber
EOF
IO.popen(INJECTOR, "w") {|pipe| pipe.print mail.tojis }
end
#
# メール送信後メッセージ表示
#
def transmission_end_message
# name_kanji = @NameKanji.toeuc
@cgi.out("type"=>"text/html", "charset"=>"euc-jp") {
name_kanji = @NameKanji
<<-"EOF".toeuc
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=euc-jp">
<title>お問合せフォーム</title>
</head>
<body>
#{name_kanji}様<br>
御問い合わせありがとうございました。<br>
<br>
内容を確認後、#{name_kanji}様宛のメール#{@EmailAddress}に返信 させて頂きます。<br>
※返信は2〜6営業日以内とさせて頂きます。<br>
<br>
<a href="http://www.google.jp/">TOPページに戻る</a>
</body>
</html>
EOF
}
end
#
# エラー処理
#
def error_cgi
print "*** CGI Error List ***<br>"
print "#{CGI.escapeHTML($!.inspect)}<br>"
$@.each { |x|
print CGI.escapeHTML(x), "<br>"
}
end
end
#
# MainProgram
#
if __FILE__ == $0
begin
inqmail = InquiryMail.new
inqmail.get_form
inqmail.data_check
inqmail.send_mail
inqmail.transmission_end_message
rescue
inqmail.error_cgi
end
end
$ curl --data InquiryCommodity=1 --data ContentOfInquiry=2 --data NameKana=kana --data NameKanji=漢字 --data TelephoneNumber=021 --data EmailAddress=hogehoge@example.org --data ZipCode=12345 --data AdministrativeDivisions=Tokyo --data LocalAuthorityCounty=hoge --data HouseNumber=133 http://localhost:9998/testmail.cgi 2&> /dev/null | nkf -w
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=euc-jp">
<title>お問合せフォーム</title>
</head>
<body>
漢字様<br>
御問い合わせありがとうございました。<br>
<br>
内容を確認後、漢字様宛のメールhogehoge@example.orgに返信 させて頂きます。<br>
※返信は2〜6営業日以内とさせて頂きます。<br>
<br>
<a href="http://www.google.jp/">TOPページに戻る</a>
</body>
</html>
$ nkf -w /tmp/mail
From: InquiryForm@foo-bar.jp
To: myaddress@foo.bar.jp
Subject: 御客様からの問合せ
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
○御客様問合せ商品
1
○お客様問合せ内容
2
○お名前(カナ)
kana
○お名前(漢字)
漢字
○電話番号
021
○メールアドレス
hogehoge@example.org
○郵便番号
12345
○都道府県名
Tokyo
○市町村郡
hoge
○番地
133
$ nkf --guess /tmp/mail
ISO-2022-JP
--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/
Twit: http://twitter.com/rubikitch/
『Ruby逆引きハンドブック』 http://d.hatena.ne.jp/rubikitch/20090525/rubybook