とりあえず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とは違ってクラス名とファイル名が違っても怒られないんですね~
最近のコメント