とりあえずRubyの参考書を読みながらメールフォームを作成してみました。普段はPerlでオブジェクト指向なモジュールを使って色々書いてますが自分でクラスやメソッドを定義することなんてなかったので今回かなり手こずりました。
メールフォームを表示して受け取ったデータをSendmailに渡して送信するだけのメールフォームです。確認画面はおろかメールアドレスのチェックなんて一切しません。。。
実用的には全く役に立たないが、Rubyを勉強しようかな?って人には役に立たないかもしれない。。。。
うん。役に立たない。。。
mailform.yml (設定ファイル)
# サイトのタイトル Title: Ruby製のメールフォーム # 管理者のメールアドレス(お問い合わせ送信先) To: mogumogu@gokugoku.oe # メールの件名 Subject: Ruby製のメールフォーム
mailform.rb (メールフォームのindex)
#!/usr/bin/ruby -w require 'contform.rb' require 'viewform.rb' require 'sendform.rb' cont = Cont.new puts cont.Output exit
contform.rb (メールフォームの大元のクラス)
class Cont require 'cgi' require 'yaml' require 'kconv' # 変数Yamlに設定ファイルのパスを格納 Yaml = 'mailform.yml' #インスタンス変数生成 def initialize begin # YAML.load_fileメソッド呼び出し 設定内容をインスタンス変数に格納 @yaml = YAML.load_file(Yaml) rescue # 例外発生時の処理(errorメソッドの呼び出し) error('YAMLファイルが読み込めませんでした。') end # 各種オブジェクトを設定を渡しながら生成する @cgi = CGI.new @view = View.new(@yaml) @send = Send.new(@yaml) end # フォーム画面表示 def Output # 送信する if(@cgi['page'] == 'sendmail') puts "content-type:text/htmlnn" # メール送信 @send.sendmail(@cgi['from'], @yaml['To'], nil, nil, @yaml['Subject'], @cgi['textdata']) # メール送信完了のメッセージを引数として返す return @view.Success else # フォームを表示する puts "content-type:text/htmlnn" return @view.TopPage end end # エラー出力 def error(errstr) puts "content-type:text/htmlnn" puts <<-__END エラーが発生しました! #{errstr} __END exit end end
viewform.rb (メールフォームのHTML関連表示クラス)
class View def initialize(yaml) @yaml = yaml end def TopPage # メールフォームの表示 html = <<-__EOT <HTML> <HEAD> <TITLE>#{@yaml['Title']}</TITLE> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> <script type="text/javascript"> <!-- function check(){ if(window.confirm('送信してよろしいですか?')){ return true; }else{ window.alert('キャンセルされました'); return false; } } // --> </script> </HEAD> </BODY> <p>#{@yaml['Title']}</p> <form action="mailform.rb" method="post" onSubmit="return check()"> <INPUT TYPE="hidden" NAME="page" VALUE="sendmail"> <p>メールアドレス</p> <input type="text" name="from" size="35"> <p>お問い合わせ用メッセージ</p> <textarea name="textdata" rows="6" cols="50"></textarea><br> <input type="submit" value="送信する" onClick="disp()"><input type="reset" value="リセット"> </BODY> </HTML> __EOT end def Success # 送信成功画面 html = <<-__EOT <HTML> <HEAD> <TITLE>#{@yaml['Title']}</TITLE> <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> </script> </HEAD> </BODY> <p>#{@yaml['Title']}</p> <p>送信しました</p> </BODY> </HTML> __EOT end end
sendform.rb (メールフォームのメール送信クラス)
class Send def initialize(yaml) @yaml = yaml end # メール送信メソッド def sendmail(from, to, cc, bcc, subject, body) path = "/usr/sbin/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.0n" io.print "Content-Type: text/plain; charset=iso-2022-jpn" io.print "Content-Transfer-Encoding: 7bitn" io.print "n" io.print "#{body}n" } end end
そういえば、Javaとは違ってクラス名とファイル名が違っても怒られないんですね~
0 Comments.