[#46732] ヒアドキュメント内の変数展開が正常に行われない — ShingoKintaka <kamuycikap@...>

Ruby  :1.8.7 (Ubuntu9.10)

12 messages 2010/01/05
[#46733] Re: ヒアドキュメント内の変数展開が正常に行われない — rubikitch@... 2010/01/06

From: ShingoKintaka <kamuycikap@tulip.ocn.ne.jp>

[#46800] DLモジュールの使い方 — kouichi_someya@...

染谷と申します。

12 messages 2010/01/20
[#47678] プログラム実行時に「[BUG] Segmentation fault」 — 染谷 康一 <kouichi_someya@...> 2010/12/09

染谷と申します。

[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

In This Thread