読者です 読者をやめる 読者になる 読者になる

新人SEの学習記録

14年度入社SEの学習記録用に始めたブログです。気づけば社会人3年目に突入。

JSP・サーブレットの学習:問い合わせフォームとJavaMail

[JSP&サーブレット] JSPサーブレットの学習

参考書籍

つくって覚えるJava Servlet入門

つくって覚えるJava Servlet入門

内容:3章 問い合わせフォームを作ってみよう

  • 作成リスト
    • 問い合わせフォーム (inquiry.html)
      • GETで送るだけ
    • フォーム送信内容確認 (CheckInquiry.java)
      • 件名と内容の表示
      • その際、改行文字を
        に変換
      • また、HTML特殊文字を無害なエンティティに変換
    • メール送信 (SendInquiry.java)
  • 問い合わせフォーム
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>お問い合わせフォーム</title>
</head>
<body>
■お問い合わせ内容を入力してください。
<br>
<br>
<form action="CheckInquiry" method="GET">
お問い合わせタイトル:
<br>
<input type="text" name="title" size="50">
<br>
<br>
お問い合わせ内容詳細:
<br>
<textarea name="message" cols="40" rows="5"></textarea>
<br>
<br>
<input type="submit" value="お問い合わせ内容の確認">
</form>
</body>
</html>
  • フォーム内容表示
public class CheckInquity extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 受け取るデータの文字コードをUTF-8にする
		request.setCharacterEncoding("UTF-8");

		// パラメータの値を取り出し、変数に代入
		String title = request.getParameter("title");
		String message = request.getParameter("message");

		// 特殊文字を変換
		title = replaceInput(title);
		message = replaceInput(message);
		
		// message内の改行をhtmlでも改行されるように<br>に変換する
		String messageHtml = message.replaceAll("\r\n|[\n\r\u2028\u2029\u0085]", "<br>");

		// 出力先のコンテンツタイプをセット
		response.setContentType("text/html; charset=UTF-8");
		
		// 出力先を取り出し、変数outに代入する
		PrintWriter out = response.getWriter();
		
		// 出力内容をセットする
		out.println("<html><body>");
		out.println("お問い合わせタイトル:" + title);
		out.println("<br><br>");
		out.println("お問い合わせ内容:<br>");
		out.println(messageHtml);
		
		// メール送信が面へのFORMタグ
		out.println("<form action=\"SendInquiry\" method=\"POST\">");
		out.println("<input type=\"hidden\" name=\"title\" value=\"" + title + "\">");
		out.println("<input type=\"hidden\" name=\"message\" value=\"" + message + "\">");
		out.println("<input type=\"submit\"value=\"お問い合わせ内容の送信\">");
		out.println("</form>");
		out.println("</body></html>");
	}

	private String replaceInput(final String inputData) {
		String outputData = inputData;
		outputData = outputData.replace("&", "&amp;").replace("\"", "&quot;");
		outputData = outputData.replace("<", "&lt;").replace(">", "&gt;").replace("'", "&#039;");
		return outputData;
		
	}
}
  • メールの送信
    • gmailから送ろうとしたのでちょっと面倒(SMTP認証が要る)
public class SendInquiry extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		
		String title = request.getParameter("title");
		String message = request.getParameter("message");
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		// メールの送信
		try {
			// メール関係プロパティの作成
			Properties property = new Properties();
			property.setProperty("mail.smtp.host", "smtp.gmail.com");
			property.setProperty("mail.smtp.port", "587");
			property.setProperty("mail.smtp.starttls.enable", "true");
			property.setProperty("mail.smtp.auth", "true");

			// メールセッションを確立(パスワード含む)
			Session session = Session.getDefaultInstance(property, new javax.mail.Authenticator() 
		    {
		        protected PasswordAuthentication getPasswordAuthentication() 
		        {
		            return new PasswordAuthentication("XXX@gmail.com","XXXXXXXX");
		        }
		   });

			//送信メッセージを作成
			MimeMessage mimeMessage = new MimeMessage(session);

			// To&Fromアドレスのセット
			InternetAddress toAddress = new InternetAddress("<送信先アドレス>", "<送信先名>");
			mimeMessage.setRecipient(Message.RecipientType.TO,  toAddress);
			InternetAddress fromAddress = new InternetAddress("<送信元アドレス>", "<送信元名>");
			mimeMessage.setFrom(fromAddress);

			// 件名と本文のセット
			mimeMessage.setSubject(title, "ISO-2022-JP");
			mimeMessage.setText(message, "ISO-2022-JP");
			// メールの送信
			Transport.send(mimeMessage);
			
			// 送信OK
			out.println("<html><body>");
			out.println("■お問い合わせ内容を担当者へ送信しました。");
			out.println("</body><html>");
		} catch (Exception e) {
			// 送信エラー
			out.println("<html><body>");
			out.println("■お問い合わせ内容の送信に失敗しました。");
			out.println("<br>エラー内容:" + e);
			out.println("</body><html>");		
		}
	}
}
所感
  • 何かイマイチ?
    • JSPのことが全く無かったり(サーブレットでhtmlの記述をしている)、
    • 重要なところがオレンジ色の文字で見づらかったり…
    • JavaMailでのメールなどは役に立ったので、とりあえずこの本をやりきる