コンピュータネットワーク基礎
Aクラス 宿題 2005.07.08

Back


解答は,解答用紙(フォーム)解答用紙(CGI)に記入して, メールに添付して提出すること.解答用紙に学生番号と氏名を必ず記入し,ファ イル名を適切なものに修正しておくことに注意!

設問

次に示すようなフォームページを作成せよ.

フォームのソースファイルとメール転送のCGIスクリプトを用意し,申込者 が記入して送信すると,申込者に確認のメールを返すような仕組とする.宿題の HTMLファイルとCGIスクリプトを 提出後に縄手の方で動作確認するので,その返信メールも採点対象とする.

  1. ページのタイトルは「コンピュータネットワーク基礎2005.07.08Aクラス宿 題」とし,2行に分ける.

  2. メールアドレス記入欄に入力したアドレスにフォームの内容を転送する.

  3. 返信メールの差出人は自分とする.その場合, s0340**@matsu.shimane-u.ac.jp からのメールと表示されるよう にする.

  4. 返信メールのサブジェクト(件名)は「ネットA宿題_s0340**」とする.
  5. 「どれか一つを選択」部分の選択肢項目は以下の表の通りとし,送信メール にもその項目名をそのまま記入するようにする.項目名は 「gundam」とする.

    Strike
    Freedom
    Justice
    Saviour
    Destiny
    Infinite

  6. 上述のように,「送信」ボタンをクリックしてメールを送信する先は,

    アドレス欄に入力したアドレスとする.

  7. メール送信完了後に表示されるメッセージHTMLは「宿題提出完了」というタ イトルと本文とする.エラーメッセージなどは本日の授業で行った mail.cgi と同じでよい.


解答例 HTMLファイル

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=EUC-JP">
<title>コンピュータネットワーク基礎2005.07.08Aクラス宿題</title>
</head>
<body>

<table border=0 cellspacing=0 cellpadding=3 width=100%>
	<tr>
	<td bgcolor="#ddffee">
		<b>コンピュータネットワーク基礎2005.07.08<br>Aクラス宿題</b>
	</td>
	</tr>
</table>

<br>
宿題スクリプト返信フォーム
<form action="taska.cgi" method="POST">
■メールアドレス記入欄<br>
<textarea name="to" cols="50" rows="1"></textarea><br>
<br>
■どれか一つを選択<br>
<select name="gundam">
<option value="Stike">Strike
<option value="Freedom">Freedom
<option value="Justice">Justice
<option value="Saviour">Saviour
<option value="Destiny">Destiny
<option value="Infinite">Infinite
</select><br><br>
■テスト例文記入欄<br>
<textarea name="comment" cols="50" rows="5"></textarea><br>
<input type="submit" value="送信">
<hr size="3" color="#DFD8DF">
</form>
</body>
</html>

CGIスクリプト

#!/usr/bin/ruby -Ke
# このCGIがHTMLとして読み込む物だとブラウザに指示

require "cgi" # cgiライブラリの読込
require "net/smtp" # SMTPライブラリの読込
require "kconv" # kconvライブラリの読込
require "base64" # base64ライブラリの読込
require "timeout" # timeoutライブラリの読込

# フォームデータの読出し
form = CGI.new

print "Content-type: text/html\n\n"

to = form["to"][0].to_s
answer = form["answer"][0].to_s
comment = form["comment"][0].to_s

# (1)初期設定
MailSubject = "s0340**A宿題" # 送信メールのSubject
MailFrom = "nawate@mag.shimane-u.ac.jp"
MailTo = to
MailServer = "localhost" # メールサーバーのホスト名

error_message = "" # エラーメッセージ

# (2)メールテキスト作成メソッド
def make_mail_text(subject, from, to, body)
# このメソッドの初期設定
	char_set = 'iso-2022-jp'
	len = 15
	mail_subject = ''
# Subject部分の作成
# =?(CharactorSet)?B?(BASE64エンコードされた文字列)?=\n の形式のテキスト
	subject.scan(/.{1,#{len}}/s) do |str|
		str_jis = Kconv::tojis($&)
		mail_subject += " =?" + char_set + "?B?" + encode64(str_jis).chomp + "?=" + "\n"
	end
# メールのテキストの作成
	mail_text = <<-EndOfMail
Subject:#{mail_subject}To: #{to}
From: #{from}
Content-Type: text/plain; charset=#{char_set}
MIME-Version: 1.0

#{Kconv::tojis(body)}
	EndOfMail
	return(mail_text)
end

# (3)メールの送信
def send_mail(host, src, from, to)
	timeout(20) do
		Net::SMTP.start( host, 25 ) do |session|
			session.send_mail( src, from, to )
		end
	end
end

# (4)エラー表示
def error_print(message)
	print <<-EOF # HTMLの表示
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>RubyCGI練習フォームエラー</title>
</head>
<body>

<table border=0 cellspacing=0 cellpadding=3 width=100%>
	<tr>
	<td bgcolor="#DFD8DF">
		<b>フォーム練習ページ</b>
	</td>
	</tr>
</table>

<h2>エラー</h2>

理由:<br>
#{message}<br><br>
以上のエラーが発生した為にアンケートの送信を取りやめました。<br>
エラー内容を確認した後、前の画面に戻って送信をやり直してください。<br>

<form><input type=button value="戻る" onclick="javascript:history.back()">
<hr size="3" color="#DFD8DF">

</form>
</body>
</html>
	EOF
	exit
end


# (5)フォームチェック
# 受け取るフォームデータのチェック
error_message += "・答に異常があります。<br>\n" if !(answer =~ /^[012345]$/)
# エラーがあったら
error_print(error_message) if error_message != ""

# (6)メール送信
# メールの本文の作成
mail_body = <<EOF
answer:
#{answer}

comment
#{comment}
EOF
mail_src = make_mail_text(MailSubject, MailFrom, MailTo, mail_body) # メールソースの作成
# smtpでメールの送信と例外処理
begin
	send_mail(MailServer, mail_src, MailFrom, MailTo)
rescue
	error_message += "・メール送信に失敗しました。<br>\n"
end
# エラーがあったら
error_print(error_message) if error_message != ""

# (7)ありがとうメッセージの表示
print <<EOF # HTMLの表示
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>宿題提出完了</title>
</head>
<body>

<table border=0 cellspacing=0 cellpadding=3 width=100%>
	<tr>
	<td bgcolor="#DFD8DF">
		<b>練習フォーム</b>
	</td>
	</tr>
</table>

<h2>完了</h2>

宿題提出完了

<hr size="3" color="#DFD8DF">

</body>
</html>
EOF


コンピュータネットワーク基礎
Bクラス 宿題 2005.07.08


解答は,解答用紙(フォーム)解答用紙(CGI)に記入して, メールに添付して提出すること.解答用紙に学生番号と氏名を必ず記入し,ファ イル名を適切なものに修正しておくことに注意!

設問

次に示すようなフォームページを作成せよ.

フォームのソースファイルとメール転送のCGIスクリプトを用意し,申込者 が記入して送信すると,申込者に確認のメールを返すような仕組とする.宿題の HTMLファイルとCGIスクリプトを 提出後に縄手の方で動作確認するので,その返信メールも採点対象とする.

  1. ページのタイトルは「コンピュータネットワーク基礎2005.07.08Bクラス宿 題」とし,2行に分ける.

  2. メールアドレス記入欄に入力したアドレスにフォームの内容を転送する.

  3. 返信メールの差出人は自分とする.その場合, s0340**@matsu.shimane-u.ac.jp からのメールと表示されるよう にする.

  4. 返信メールのサブジェクト(件名)は「ネットB宿題_s0340**」とする.
  5. 「どれか一つを選択」部分の選択肢項目は以下の表の通りとし,送信メール にもその項目名をそのまま記入するようにする.項目名は 「gundam」とする.

    Strike
    Freedom
    Justice
    Saviour
    Destiny
    Infinite

  6. 上述のように,「送信」ボタンをクリックしてメールを送信する先は,

    アドレス欄に入力したアドレスとする.

  7. メール送信完了後に表示されるメッセージHTMLは「宿題提出完了」というタ イトルと本文とする.エラーメッセージなどは本日の授業で行った mail.cgi と同じでよい.


解答例

HTMLファイル

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=EUC-JP">
<title>コンピュータネットワーク基礎2005.07.08Bクラス宿題</title>
</head>
<body>

<table border=0 cellspacing=0 cellpadding=3 width=100%>
	<tr>
	<td bgcolor="#eeffcc">
		<b>コンピュータネットワーク基礎2005.07.08<br>Bクラス宿題</b>
	</td>
	</tr>
</table>

<br>
宿題スクリプト返信フォーム
<form action="taska.cgi" method="POST">
■メールアドレス記入欄<br>
<textarea name="to" cols="50" rows="1"></textarea><br>
<br>
■どれか一つを選択<br>
<select name="gundam">
<option value="Stike">Strike
<option value="Freedom">Freedom
<option value="Justice">Justice
<option value="Saviour">Saviour
<option value="Destiny">Destiny
<option value="Infinite">Infinite
</select><br><br>
■テスト例文記入欄<br>
<textarea name="comment" cols="50" rows="5"></textarea><br>
<input type="submit" value="送信">
<hr size="3" color="#DFD8DF">
</form>
</body>
</html>

CGIスクリプト

#!/usr/bin/ruby -Ke
# このCGIがHTMLとして読み込む物だとブラウザに指示

require "cgi" # cgiライブラリの読込
require "net/smtp" # SMTPライブラリの読込
require "kconv" # kconvライブラリの読込
require "base64" # base64ライブラリの読込
require "timeout" # timeoutライブラリの読込

# フォームデータの読出し
form = CGI.new

print "Content-type: text/html\n\n"

to = form["to"][0].to_s
answer = form["answer"][0].to_s
comment = form["comment"][0].to_s

# (1)初期設定
MailSubject = "s0340**B宿題" # 送信メールのSubject
MailFrom = "nawate@mag.shimane-u.ac.jp"
MailTo = to
MailServer = "localhost" # メールサーバーのホスト名

error_message = "" # エラーメッセージ

# (2)メールテキスト作成メソッド
def make_mail_text(subject, from, to, body)
# このメソッドの初期設定
	char_set = 'iso-2022-jp'
	len = 15
	mail_subject = ''
# Subject部分の作成
# =?(CharactorSet)?B?(BASE64エンコードされた文字列)?=\n の形式のテキスト
	subject.scan(/.{1,#{len}}/s) do |str|
		str_jis = Kconv::tojis($&)
		mail_subject += " =?" + char_set + "?B?" + encode64(str_jis).chomp + "?=" + "\n"
	end
# メールのテキストの作成
	mail_text = <<-EndOfMail
Subject:#{mail_subject}To: #{to}
From: #{from}
Content-Type: text/plain; charset=#{char_set}
MIME-Version: 1.0

#{Kconv::tojis(body)}
	EndOfMail
	return(mail_text)
end

# (3)メールの送信
def send_mail(host, src, from, to)
	timeout(20) do
		Net::SMTP.start( host, 25 ) do |session|
			session.send_mail( src, from, to )
		end
	end
end

# (4)エラー表示
def error_print(message)
	print <<-EOF # HTMLの表示
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>RubyCGI練習フォームエラー</title>
</head>
<body>

<table border=0 cellspacing=0 cellpadding=3 width=100%>
	<tr>
	<td bgcolor="#DFD8DF">
		<b>フォーム練習ページ</b>
	</td>
	</tr>
</table>

<h2>エラー</h2>

理由:<br>
#{message}<br><br>
以上のエラーが発生した為にアンケートの送信を取りやめました。<br>
エラー内容を確認した後、前の画面に戻って送信をやり直してください。<br>

<form><input type=button value="戻る" onclick="javascript:history.back()">
<hr size="3" color="#DFD8DF">

</form>
</body>
</html>
	EOF
	exit
end


# (5)フォームチェック
# 受け取るフォームデータのチェック
error_message += "・答に異常があります。<br>\n" if !(answer =~ /^[012345]$/)
# エラーがあったら
error_print(error_message) if error_message != ""

# (6)メール送信
# メールの本文の作成
mail_body = <<EOF
answer:
#{answer}

comment
#{comment}
EOF
mail_src = make_mail_text(MailSubject, MailFrom, MailTo, mail_body) # メールソースの作成
# smtpでメールの送信と例外処理
begin
	send_mail(MailServer, mail_src, MailFrom, MailTo)
rescue
	error_message += "・メール送信に失敗しました。<br>\n"
end
# エラーがあったら
error_print(error_message) if error_message != ""

# (7)ありがとうメッセージの表示
print <<EOF # HTMLの表示
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
<title>宿題提出完了</title>
</head>
<body>

<table border=0 cellspacing=0 cellpadding=3 width=100%>
	<tr>
	<td bgcolor="#DFD8DF">
		<b>練習フォーム</b>
	</td>
	</tr>
</table>

<h2>完了</h2>

宿題提出完了

<hr size="3" color="#DFD8DF">

</body>
</html>
EOF


Back