티스토리 뷰

공부 이야기

[JSP] 이메일 보내기4

판다(panda) 2011. 9. 11. 00:00
이메일 보내기를 본격적으로 시작해 보겠습니다..

우선 게시판 만들기 처럼.. 기본 폼부터 만들어보죠..

우선 주소록 부터 만들어 볼까 합니다..

기본적으로 저장되어있는 사람을 선택해서 메일을 보낼겁니다..

주소록이니까.. 참고 형태는 다음입니다;..

이정도만 만들면.. 좋겠지만;.. 이정도면 완전 전문가;..



겨우 게시판 이렇게 밖에 못 만드는 저에게;.. 위에 다음 주소록은 신의 영역!..


저는 이렇게 만들어봤습니다.. 우선 주소록에 들어간 사람을 검색할 수 있는 폼과..
그리고 등록된 수신자들이 나오는 리스트..



"뭐야 전에 올린거랑 틀리잖아!".. 라고 말씀하셔도 어쩔 수 없습니다;..


요 전 글에도 써놨지만.. 불필요한 부분을 싹 제거하고.. 테이블도 새로 작성하기 위해서..
또 파란이미지는 제가 만든 이미지이지만.. 검은색 이미지는 제가 어디서 얻어온거라서.. 올리기도 그렇고 말이죠..


뭐 미적 감각이 뛰어나시거나(직접 만드셔서 하시면 됩니다)..
그냥 이미지 필요없이 input type=button 으로 만드셔도 되지만..
이런것도 해보고 해야죠;.. 게시판에는 전부 버튼 타입이라.. 이미지 버튼은 안해보셨을것 같아서..
이번에는 이걸로 해보자!.. 란 생각에 올려봤습니다..


그럼 코딩 시작합니다..

우선 mail_address.jsp 파일을 생성합니다..

폼 코딩이라서 간단합니다.. 기존 게시판 만들기에서 하셨던 방법 그대로 진행하시면 됩니다..

우선 제가 게시판 모든 페이지에 넣었던;.. 페이지 설정을 해줍니다;..
<%@ page contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR" %>
<%@ page language="java" import="java.util.*, java.sql.*, javax.servlet.http.*" %>

어떤 파일이 어디서 사용되는지 정확하게 몰라서;.. 나중에는 인터넷에서 보이는데로 다 넣었습니다;..
<%@ page language="java" contentType="text/html;charset=euc-kr" %>
<%@ page import="java.text.DecimalFormat, java.util.Date, java.text.SimpleDateFormat" %>
<%@ page import="java.sql.*,java.util.*,java.io.*,util.*,javax.mail.*,javax.mail.internet.*,javax.activation.*" %>
<%@ page import="sun.net.smtp.SmtpClient" %>
<%@ page import = "oracle.sql.CLOB" %>
<%@ page import = "oracle.jdbc.driver.OracleResultSet" %>
<%@ page import = "com.oreilly.servlet.MultipartRequest" %>
<%@ page import = "com.oreilly.servlet.multipart.DefaultFileRenamePolicy" %>
<%@ page import = "com.oreilly.servlet.multipart.FileRenamePolicy" %>
<%@ page import = "com.oreilly.servlet.ParameterParser" %>
<%@ page import = "common.FinalVars" %>
<%@ page import = "util.*" %>

하지만.. 아직 초반이고;.. 안되는 부분은 없기에.. 위에 2줄로만 진행하겠습니다..

검색을 위해서 폼을 만듭니다.. mailSearchForm 입니다..
<form name="mailSearchForm" method="get" action="/email/mail_address.jsp">

아래는 검색어를 입력할 창입니다..
<table width="600" height="160" border="0" cellpadding="0" cellspacing="0">
 <tr>
  <td align="center" valign="top">
   <table width="600" border="0" cellspacing="0" cellpadding="0"><br>
    <tr><td height="25"><strong>주소록 관리</strong></td></tr>
   </table>
   <table width="600" border="1" cellspacing="0" cellpadding="0">
    <tr><td><br>
     <table width="500" border="0" cellspacing="0" cellpadding="0">
      <tr>
       <td width="100" height="25"><font color="A79B7C">&#8226;</font>&nbsp;이름</td>
       <td><input type="text" name="user_name" size="40" maxlength="50"></td>
      </tr>
      <tr>
       <td><font color="A79B7C">&#8226;</font>&nbsp;이메일</td>
       <td><input type="text" name="user_email" size="40" maxlength="50"></td>
      </tr>
      <tr>
       <td colspan="2" align="right"><img src="/email/img/bt_mail_search.png"></td>
      </tr>
     </table>
    </td></tr>
   </table>
  </td>
 </tr>
</table>

그림에는 없는데..
중간에 등록되 이메일 숫자와 등록 버튼을 넣었습니다..

<table width="600" border="0" cellpadding="0" cellspacing="0">
 <tr>
  <td height="2"><b>등록된 이메일 : 0</b></td>
  <td align="right"><a href="/email/user_insert.jsp" title="등록"><img src="/email/img/bt_mail_insert.png" border="0" alt="등록" align="absmiddle"></a><br></td>
 </tr>
</table>


다음은 등록된 이메일이 나오는 리스트입니다..
게시판 만들기에서 글 목록이 나오는 리스트라고 생각하시면 됩니다..

<table width="600" border="0" cellpadding="0" cellspacing="0" bgcolor="cccccc">
 <tr><td height="2"></td></tr>
</table>
<table width="600" border="0" cellpadding="1" cellspacing="1" bgcolor="DDDDDD">
 <tr align="center" bgcolor="efefef" height="25">
  <td width="50"><b>번호</b></td>
  <td width="100"><b>이름</b></td>
  <td width="200"><b>이메일</b></td>
  <td width="100"><b>핸드폰</b></td>
  <td width="150"><b>편집</b></td>
 </tr>
 <tr align="center" bgcolor="#FFFFFF" height="20">
  <td colspan="5">등록된 수신자가 없습니다</td>
 </tr>
</table>
</form>

이제 대충 리스트 페이지는 완료된것 같으니..
이메일을 등록하는 페이지와 테이블을 만들어 봅시다..

이메일 보내기1 에서 올렸던 테이블에서 불필요한건 싹 제거했습니다..
악!.. 등록일자도 지워버렸군요;..


5. REG_DATE                          DATE                                                 NOT NUL        Default : sysdate 를..

등록해줍니다..
유저의 핸드폰 번호는 있을수도 있고 없을수도 있으니까 NOT NULL 체크를 안했구요..
나머지는 있어야 하는것들이니까 NOT NULL에 체크를 했습니다..

유저 번호와, 이메일은 중복되면 안되기 때문에 KEY 값으로 잡아줬습니다..

토드를 안쓰셔서.. CREATE TABLE 을 하셔야 한다면.. 이메일 보내기1 에 있는 테이블을 참조하세요..
토드를 쓰시면 테스트도 할 수 있고.. 따로 타이핑 안하셔도 되니까 왠만하면 토드 사용을 추천해드립니다..

유저 번호를 NUMBER 로 잡아줬는데.. 자동으로 1씩 카운트 시켜서 따로 적어줄 필요없게 만들겁니다..
게시판 글 썼을때 자동으로 번호 생기게 한것 처럼 시퀀스 하나 만들어주겠습니다..

시퀀스 만들기도 토드를 사용하면 참 쉽습니다.. 시작 번호 1, 최소 값 1, 맥스 값 9999..
맥스값에 99999999999999999999999999999 넣어도 되긴하는데.. 과연 이메일 주소를 9999까지 쓸까요?;..
뭐 지우고 쓰고 지우고 쓰고 하면 9999값을 다 사용하겠지만;.. 9999만 해도 충분할것 같습니다..
"안돼!.. 9999 채우면 에러가 날꺼야!".. 하시는 분들은 999999999999999999999999 넣으시구요;..



나는 스키마가 STUDY 가 아닌데 하시는 분들이 계실겁니다;..


처음 오라클 접속하실때.. SYS, SYSTEM, SCOTT 어떤걸로 들어오셨습니까?..
들어오신 아이디로 스키마가 생성될겁니다.. 저는 STUDY란걸 하나 만들어줬구요..
그 안에다가 테이블 만들고 놀겁니다.. 잘못해서 다른쪽 건드리면 골치아프거든요;..

mail_address.jsp 에서 눌리는 버튼은 아마 등록 버튼 한개일겁니다.. 검색버튼은 아직 안되요!..
등록버튼을 눌렀을때.. /email/user_insert.jsp 으로 이동하라고 해놨기 때문에..

user_insert.jsp 페이지를 만듭니다.. 이건 제 JSP 글의 필수죠;..
<%@ page contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR" %>
<%@ page language="java" import="java.util.*, java.sql.*, javax.servlet.http.*" %>

mail_address 에서 그대로 긁어와서;.. 폼네임과 타겟 위치를 변경해주고..

<form name="userInserForm" method="get" target="action" action="/email/user_insert_act.jsp">
<table width="600" height="160" border="0" cellpadding="0" cellspacing="0">
 <tr>
  <td align="center" valign="top">
   <table width="600" border="0" cellspacing="0" cellpadding="0"><br>
    <tr><td height="25"><strong>이메일 등록</strong></td></tr>
   </table>
   <table width="600" border="1" cellspacing="0" cellpadding="0">
    <tr><td><br>
     <table width="500" border="0" cellspacing="0" cellpadding="0">
      <tr>
       <td width="100" height="25"><font color="A79B7C">&#8226;</font>&nbsp;이름</td>
       <td><input type="text" name="user_name" size="40" maxlength="50"></td>
      </tr>
      <tr>
       <td><font color="A79B7C">&#8226;</font>&nbsp;이메일</td>
       <td><input type="text" name="user_email" size="40" maxlength="50"></td>
      </tr>
      <tr>

검색버튼 대신에.. 핸드폰 번호 입력칸을 만들어줍니다..

       <td><font color="A79B7C">&#8226;</font>&nbsp;핸드폰</td>
       <td><input type="text" name="user_hp" size="40" maxlength="20"></td>

      </tr>
     </table>
    </td></tr>
   </table>
  </td>
 </tr>
</table>

이건 게시판에서 긁어왔습니다;.. 버튼 방식으로는 이렇게 간단하게 하면 되죠..
<table cellspacing = 0 cellpadding = 0 border = 0 width=500>
 <tr><td>
 <center>
  <input type=button value="등록" OnClick="window.location='user_insert_act.jsp'">
  <input type=reset value="취소">
  <input type=button value="목록" OnClick="window.location='mail_address.jsp'">
 </center>
 </td></tr>
</table>
</form>

하지만.. 이미지를 입혀서 버튼을 사용할것이기 때문에.. 위에 방식은 안쓰겠습니다..

<table width="600" border="0" cellpadding="0" cellspacing="0">
 <tr>
  <td align="center">
   <a href="/email/user_insert_act.jsp"><img src="/email/img/bt_mail_insert.png" border="0" alt="등록" align="absmiddle" ></a>&nbsp;&nbsp;
   <a href="javascript:document.userInserForm.reset();"><img src="/email/img/bt_mail_cancel.png" border="0" alt="취소" align="absmiddle"></a>&nbsp;&nbsp;
   <a href="/email/mail_address.jsp"><img src="/email/img/bt_mail_list.png" border="0" alt="목록" align="absmiddle"></a>&nbsp;
  </td>
 </tr>
</table>
</form>

를 해주면 등록을 눌렀을때.. /email/user_insert_act.jsp 로 이동.. 취소를 눌렀을때 폼값 초기화..
목록을 눌렀을때 /email/mail_address.jsp 로 돌아가게 됩니다..

여기서.. 등록을 눌렀을때.. 아무런 제한이 걸려있지 않아서.. 그냥 빈 페이지가 계속 불려지게 됩니다..
나중에 DB에 연결했을때.. 시퀀스 값이 계속 올라가는것을 확인하실 수 있습니다..

이런 경우를 방지하기 위해서.. 많은 방법이 있지만..
저는 이미 게시판 만들기에서 사용 했던.. 자바스크립트로.. 빈칸일때 등록 제한을 하겠습니다..

user_insert.jsp 상단에 자바 스크립트를 넣어줍니다..
빈칸일때 포커스 이동으로 자동 칸 이동을 하게 해놓았고..

<script language="javascript">
 function writeCheck()
 {
  var form = document.userInserForm;
  
  if( !form.user_name.value )
  {
   alert( "이름을 적어주세요" );
   form.user_name.focus();
   return;
  }

  if( !form.user_email.value )
  {
   alert( "이메일을 적어주세요" );
   form.user_email.focus();
   return;
  }

이메일 주소에.. @ 가 없을때 정확한 이메일 주소를 적어달라고 나옵니다..

  if( form.user_email.value.indexOf("@")== -1 )
  {
   alert( "정확한 이메일을 적어주세요" );
   form.user_email.focus();
   return;
  }

아래도 마찬가지인데요.. 아래는 # 이 포함되었을때 정확한 이메일 주소를 적어달라고 나옵니다..
 
  if (form.user_email.value.indexOf("#")>= 0)
  {
   alert( "정확한 이메일을 적어주세요" );
   form.user_email.focus();
   return;
  }

  form.submit();
 }
</script>

사실 !, $, %, ^, &, *, (, ) 등의 특수 기호와 한글이 이메일 주소에 포함되면 안되는데..

위에 코드를 복사 붙여넣기.. 특수 기호 다 넣어서 노가다 하시거나;..

온키프레스로 onKeypress="if (event.keyCode==39) event.returnValue = false;" 입력 제한을 하셔도 됩니다..

keyCode 값은 검색하시면 나올겁니다..

자바스크립트 잘 찾아보시면 한글 제한, 특수문자 제한 관련 스크립트가 있을겁니다.. 저는 찾기 귀찮아서;..

자바스크립트를 넣었으니.. 등록 버튼이 눌렸을때 자바 스크립트가 실행되야겠죠?..

   <img src="/email/img/bt_mail_insert.png" border="0" alt="등록" align="absmiddle" OnClick="writeCheck();">&nbsp;&nbsp;

등록을 눌렀을때.. 온클릭으로 writeCheck(); 실행되고.. form.submit(); 이 실행되면서 taget action 으로..

user_insert_act.jsp 로 값들이 넘어가서 DB로 저장됩니다..

무지하게 길게 쓴것 같은데.. 이제 페이지 2개 폼만 만들었네요;..

이제 DB 저장되는걸 해보죠.. user_insert_act.jsp 가 없으니까 새로 만들어 줍니다..

<%@ page contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR" %>
<%@ page language="java" import="java.util.*, java.sql.*, javax.servlet.http.*" %>
<%!
 Connection DB_Connection() throws ClassNotFoundException, SQLException, Exception
 {
  String url = "jdbc:oracle:thin:@127.0.0.1:1521:ORACLE";
  String username = "study";
  String userpass = "study";
  Class.forName("oracle.jdbc.driver.OracleDriver");
  Connection conn = DriverManager.getConnection(url, username, userpass);
  return conn;
 }
 
 String TO_DB( String str ) throws Exception
 {
  if( str == null )
   return null;
  return new String( str.getBytes( "8859_1" ), "euc-kr" );
 }
%>

게시판 만들기를 안보고 이메일 보내기 글을 처음 보시는 분들 이게 뭘까 하시는 분들도 계실겁니다..
게시판 만들기 보면 오라클 메소드 설명까지 주석 붙여놓았으니까 참고하시면 됩니다..

TO_DB 도 빼고 진행할께요.. 글씨 깨지는 분들은 넣으시면 되겠습니다..
아직 저도 확인을 안해봐서.. 확인해보고 깨지면 그때 넣도록 하겠습니다..

저는 util.java 라는 파일을 만들어서 null값 처리를 해줬는데.. 요것 포함하며 내용이 약간 길어지니까;..
빼고 진행하겠습니다;..

<%
 Connection conn = DB_Connection();
 Statement stmt = null;
 ResultSet rs = null;
 StringBuffer query = null;

 String totalCount = "";
 String user_seq = "";

 String user_email = request.getParameter( "user_email" );
 String user_name = request.getParameter( "user_name" );
 String user_hpno = request.getParameter( "user_hp" );

 try {
  stmt = conn.createStatement();
  query = new StringBuffer();

  query.append("SELECT COUNT(*) TOTAL FROM STUDY.EMAIL_USER \n");
  rs = stmt.executeQuery(query.toString());

  if (rs.next()) {
   totalCount = rs.getString("TOTAL");
  }
  rs.close();

  query.setLength(0);
  query.append("INSERT \n")
    .append("INTO STUDY.EMAIL_USER (USER_SEQ, USER_EMAIL, USER_NAME, USER_HP) \n")
    .append("VALUES ( STUDY.USER_SEQ.NEXTVAL, '").append(user_email).append("', '")
    .append(user_name).append("', '").append(user_hpno).append("') \n");
  stmt.executeUpdate(query.toString());
  stmt.close();
 }
 catch( Exception e ) {
  out.println( e.toString() );
 }
 finally {
  conn.close();
  stmt.close();
  rs.close();
 }
%>

그리고 저장 되었을때 윈도우창으로 알려주고 페이지 이동하는걸 해보겠습니다..
이것 역시 게시판 만들기때 사용한건데.. 똑같은거 또 쓰면 그게 붙여넣기지 공부겠습니까!..
<html>
<head>
 <script language=javascript>
  self.window.alert("이메일 주소를 저장하였습니다.");
  location.href="/email/mail_address.jsp";
 </script>
</head>
</html>

위에 자바 스크립트는 안쓰고.. try 문에.. 직접 알림창과 이동 페이지를 넣겠습니다..
중간 중간에.. 굵은 글씨 부분을 추가합니다.. 
  query.setLength(0);
  query.append("INSERT \n")
    .append("INTO STUDY.EMAIL_USER (USER_SEQ, USER_EMAIL, USER_NAME, USER_HP) \n")
    .append("VALUES ( STUDY.SEQ_USER_SEQ.NEXTVAL, LOWER('").append(user_email).append("'), '")
    .append(user_name).append("', '").append(user_hpno).append("') \n");

인서트 완료 하면 저장했다고 알려주고..

  out.print("<SCRIPT> alert('저장하였습니다.'); </SCRIPT>");
  stmt.executeUpdate(query.toString());
  stmt.close();
 }
 catch( Exception e ) {
out.println( e.toString() );
}
 finally {
  conn.close();
  stmt.close();
  rs.close();

try 구문을 완료하면 페이지를 이동합니다..
  out.print("<SCRIPT> parent.location.href='/email/mail_address.jsp';</SCRIPT>");
 }
%>


우선 EMAIL_USER TABLE 에 있는 값을 카운트 해줬습니다.. 이게 등록된 이메일 숫자를 표시해 주는 겁니다..
그리고 인서트 구문으로 입력받은 내용을 DB에 저장해줬습니다..

테스트 결과..



시퀀스도 제대로 등록되고.. 모든게 다 등록되는데.. 이름이 깨지는군요;..


아까 빼줬던 TO_DB 를 사용하겠습니다.. 글씨가 제대로 나오시는 분들은 안해도 됩니다..
 String user_name = request.getParameter( "user_name" );
 user_name = TO_DB( user_name );


음.. 글씨가 제대로 나오는군요..



그런데.. ssppmm@tistory.comSSPPMM@TISTORY.COM 은 같은 주소입니다..
이거 분명 중복 방지를 하기 위해 key 값으로 지정해줬는데 말이죠..

오라클은 대/소문자 차이를 구별하기 때문에.. 어쩔수가 없습니다.. 대문자를 소문자로 바꿔서 저장하던지..
소문자를 대문자로 바꿔서 저장하던지 해야할것 같군요..

user_insert_act.jsp 수정하겠습니다..

게시판 글 검색할때도 대문자, 소문자 구별 없이 검색을 하기 위해서 UPPER, LOWER 를 사용했는데요..
이번에는 LOWER 로 입력받은 값은 소문자로 저장하겠습니다..

인서트 쿼리문 중에서 굵은 글씨 부분만 바꾸면 됩니다!.. 쉽죠?..
 query.append("INSERT \n")
.append("INTO STUDY.EMAIL_USER (USER_SEQ, USER_EMAIL, USER_NAME, USER_HP) \n")
.append("VALUES ( STUDY.USER_SEQ.NEXTVAL, LOWER('").append(user_email).append("'), '")
.append(user_name).append("', '").append(user_hpno).append("') \n");

우선 테스트를 하기 위해서 소문자, 대문자를 넣어보겠습니다..

ㅜ_-) 전 바본가 봅니다.. 블로그에서 LOWER 썼다고;.. 서버에 반영되는건 아닌데 말이죠;..
블로그에 쓴것만 생각하고 user_insert_act.jsp 수정안했네요;..

계속 이거 왜이러지; 하고 고민하고 있었습니다;..

자.. 소문자, 대문자 2개를 입력했습니다..



엥;.. 에러가 나와야 하는데.. 안나오고 등록되는군요;..



이게 저같은 초보가 쉽게 저지르는 실수입니다.. PRIMARY KEY랑 UNIQUE 랑은 다른건데 말이죠;..
중복키 값은 유니크 설정이 안되나봅니다;..

테이블을 만들때 USER_EMAIL 만 KEY 값으로 지정해줘도 되구요..

아니면 유니크 값으로 따로 설정해 주셔도 됩니다..



저는 그냥 테이블 다시 만들었습니다;.. 따라서 테이블 만드신분들 죄송요;..
이런 실수도 해봐야지.. 다음부터 아 중복 안되는군아.. 라는것을 실감하고 안하실겁니다;..
저는 같은 실수 반복하는 멍청이에요;.. 이거 저혼자 만들때도 똑같은 상황이였거든요;..

그땐 유니크 값으로 USER_EMAIL 을 설정해줬지만.. 이번에는 USER_SEQ 를 KEY에서 뺐습니다..
어짜피.. 시퀀스로 1씩 계속 증가하는 값이기 때문에 중복 될 수 없거든요..

오늘 한 일은..
아무것도 안뜨고 폼만 있는 목록 페이지.. 그리고 글쓰기 페이지.. DB에 저장하는 페이지..
총 3개의 파일을 작성해봤습니다..

원래.. 다음 주에나 13일에 올리려고 날짜도 바꾸면서 인서트 했는데.. 비와서 놀러를 안가다 보니.. 할 일이 없어서;..
놀면 뭐합니까;.. 이럴때 공부라도 해야죠;..

오늘은 이메일 저장한것까지만 해봤습니다.. 게시판 만들기 해보신분들은.. 에이.. 이거 뭐 똑같잖아 하실겁니다;..

하지만 이렇게 나눠서 써줘야.. 저도 블로그에 글 좀 많이 올리고.. 방문자 분들도 다시 오시고.. 저한텐 일석이조라 ㅎㅎ..

오늘의 소스입니다..


다음은 게시판 만들기에서 했던것 처럼.. 주소록 목록에 이메일이 표시되고.. 그 이메일 내용을 수정하는것을 하겠습니다..
아직까지느 게시판 만들기랑 똑같다고 보시면 됩니다..

앞으로 할 내용은..
주소록 - 이메일등록, 이메일리스트, 이메일수정, 이메일삭제, 이메일검색..
주소록 - 그룹등록, 그룹수정, 그룹삭제, 그룹에 유저 추가..
순으로 진행할껍니다..

그 다음 여러분이 기다리고 기다리시던 이메일 발송!..
메일발송 - 전체메일 보내기, 그룹메일 보내기, 개인메일 보내기..
메일발송 - 주소록열어 메일 보낼 사람 선택하기, 미리보기, 스마트에디터 추가하기..
순으로 진행될겁니다..

마지막으로..
메일발송 - 발송메일 확인하기, 발송메일 수신확인 하기..
순으로 끝낼겁니다..

대충 생각해보니까.. 앞으로 5-6번 올리면 끝날것 같네요.. 그럼 이메일 보내기10이 끝이겠군요..
앞에 1,2,3은 쓸때 없는 내용이라;.. 지울까 했는데.. 글번호가 시컨스 자동 증가인가봅니다..
지우면 그번호 사용했다고 인식하고 다음번호 주더라구요..

글 지우고 다시 글 쓸때 번호가 1 증가된것을 보고 혹시나 해서 지우고 다시 쓰니까 또 1증가했더라구요;..
그래서 지금도 글번호는 1943번이지만.. 제가 작성한 글은 1941개입니다..

jsp 와 관련 없는 잡소리는 여기서 그만하고;.. 이메일 보내기4를 마치겠습니다..
제가 추석때 안바쁘면 보내기5를 올려드리구요.. 바쁘면.. 추석지나고.. 수요일이나 목요일에 올려드리겠습니다..


저작권 표시 꼭!.. 상업적 이용 절대 불가!.. 컨텐츠 변경 안됨!..