본문 바로가기

Learning/JSP

checkbox에서 유저의 메일주소를 가져온 뒤 자바메일 발송하기 (javax.mail)

1. 메이븐 기반 프로젝트이므로 pom.xml에 javax.mail 디펜던시 추가

 

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>
cs

 

 

2. selectbox 선택부분

  • jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<table class="table table-hover">
            <colgroup>
            <col width="5%"/>
            <col width="5%"/>
            <col width="10%"/>
            <col width="10%"/>
            <col width="40%"/>
            <col width="10%"/>
            <col width="20%"/>
        </colgroup>
        <thead>
            <tr>
                <th scope="col"><input type="checkbox" name="select_all" id="select_all" value="select_all"></th>
                <th scope="col">No.</th>
                <th scope="col">이름</th>
                <th scope="col">아이디</th>
                <th scope="col">주소</th>
                <th scope="col">전화번호</th>
                <th scope="col">이메일</th>
            </tr>
        </thead>
        <tbody>
                <c:forEach items="${list}" var="list" varStatus="st">
                    <tr>
                        <td><input type="checkbox" name="select_tch" id="select_tch" value="${list.userno}"></td>
                        <td>${rowNo-st.index}</td>
                        <td>${list.name}</td>
                        <td>${list.userid}</td>
                        <td>${list.address}</td>
                        <td>${list.phone}</td>
                        <td>${list.email}</td>
                    </tr>
                </c:forEach>
        </tbody>
</table>
cs

 

  • javascript

맨 윗줄 checkbox를 체크하면 전체선택이 되도록, 한번더 누르면 전체선택이 해제되도록 설정

 

1
2
3
4
5
6
7
8
//전체선택 구현 (id=select_all을 누르면 모든 checkbox 타입의 input box의 checked를 true로 바꿔라)
    $("#select_all").on("click",function(){
        if($("input:checkbox[id = 'select_all']").prop("checked")){
            $("input[type=checkbox]:not(:disabled)").prop("checked"true);
        }else{
            $("input[type=checkbox]:not(:disabled)").prop("checked"false);
        }
    });
cs

 

교사 승인 버튼을 눌렀을 경우 체크박스의 value (user의 userno, email값)를 배열에 담고 json형태로 바꿔서 넘기기

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//교사 승인 버튼을 눌렀을경우 체크박스의 value(user의 userno), email 값을 배열에 담고 json형태로 바꿔서 넘긴다.
    $("#tchProveBtn").click(function(){
        var checkbox = $("input[name='select_tch']:checked");
        var jarr = [];
        
        $(checkbox).each(function(i){
            var tr = checkbox.parent().parent().eq(i);
            var td = tr.children();
            
            var userno = $(this).val(); //체크박스의 value값
            var email = td.eq(6).text(); //0번째부터 시작이므로 마지막 줄의 td의 값
            
            jarr.push({"userno": userno, "email": email}); //배열에 userno와 email을 담는다.
        });
        var jStr = JSON.stringify(jarr); //json형태 문자열로 바꾸기
        
        if(jarr.length >= 1){
//json형태 data를 컨트롤러로 넘긴다.
            $.ajax({
                url: "tchProve.do",
                type: "post",
                data: {
                    "jStr": jStr
                },
                success: function(val){
                    if(val>=1){
                        alert("교사 승인이 완료되었습니다.");
                        location.href="/mvnschool/tchWaitList_pre.do";
                    }
                }
            })
        }
    }); //tchProveBtn
cs

userno는 dao에서 update를 하기 위해 필요한 값이고

email은 수신자 메일주소이다.

 

 

  • Controller.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//교사 승인 -> dao를 통해 role이 2로 업데이트되고, 해당회원의 이메일로 메일 발송
    @RequestMapping(value="tchProve.do", method = RequestMethod.POST)
    @ResponseBody
    public int tchProve(@RequestParam(value="jStr"String jStr) throws AddressException, MessagingException{
        int result = -1;
        JSONArray jsonArr = new JSONArray(jStr);

//이메일 주소들을 List에 담는다.
        List<String> emailList = new ArrayList<>();
        for(int i=0; i<jsonArr.length(); i++){
            JSONObject jsonObject = jsonArr.getJSONObject(i);
            String userno = (String) jsonObject.getString("userno");
            String email = (String) jsonObject.getString("email");
            emailList.add(email);
            result = userDAO.tchProve(userno);
        }
        
        //이메일로 메일 발송
        SendEmail.sendEmail(emailList);
        
        return result;
    }
cs

JSONArray를 통해 받아온 jStr을 다시 JSON 배열 형태로 풀어준다. 

그 배열의 크기만큼 반복문을 돌려서 JSONObject로 하나씩 뽑아낸다. 

 

userno는 dao와 연결시키고,

email은 List에 담은 후 자바메일 발송을 위해 만들어놓은 클래스의 함수와 연결시킨다.

 

 

  • dao
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//교사 승인
    public int tchProve(String userno){
        Connection conn = null;
        Statement st = null;
        int result = 0
        try {
            conn = getConnection();
            String sql = "update user_haksa set role =2 where userno='"+userno+"'";
            st = conn.createStatement();
            result = st.executeUpdate(sql);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            closeConnection(conn, st, null);
        }
        return result; 
    }
cs

 

 

  • SendEmail.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package com.mvnschool.vo;
 
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
 
public class SendEmail {
    static String host = "smtp.naver.com";
    static int port = 465;
    static String username = "네이버아이디@naver.com";
    static final String password = "네이버비밀번호";
    
    static String subject = "교사 승인";
    static String contents = "교사 승인 알람 메일";
 
    public static void sendEmail(List<String> emailList) throws AddressException, MessagingException{
        //서버정보 설정
        Properties props = System.getProperties();
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.port", port);
        props.put("mail.smtp.auth""true");
        props.put("mail.smtp.ssl.enable""true");
        props.put("mail.smtp.ssl.trust", host);
        
        //세션 생성 & 발신자 smtp 서버 로그인 인증
        Session session = Session.getInstance(props, new javax.mail.Authenticator(){
            protected javax.mail.PasswordAuthentication getPasswordAuthentication(){
                return new javax.mail.PasswordAuthentication(username, password);
            }
        });
        session.setDebug(true); //디버그 모드
        
        //MimeMessage 생성 & 메일 세팅
        Message mimeMessage = new MimeMessage(session);
        mimeMessage.setFrom(new InternetAddress(username)); //발신자
        
        System.out.println("mailSession success");
        
        //가져온 리스트의 사이즈만큼 InternetAddress 배열 크기 정하기
        InternetAddress[] addArray = new InternetAddress[emailList.size()];
        for(int i=0; i<emailList.size(); i++){ //배열에 이메일을 저장
            addArray[i] = new InternetAddress(emailList.get(i));
        }
        mimeMessage.setRecipients(Message.RecipientType.TO, addArray);
        mimeMessage.setSubject(subject); //메일 제목
        mimeMessage.setText(contents); //메일 내용
        
        //메일 보내기
        Transport.send(mimeMessage);
        System.out.println("success sending email");
        
    }
}
cs

⇒ 자바메일 설정하는 동안 만났던 오류들
1. ssl관련 에러

("mail.smtp.ssl.enable", "true" , "mail.smtp.ssl.true", "smtp.naver.com" 처럼 설정을 해주니까 해결)


2. username과 password 관련 에러

(발신자 smtp 서버 로그인 인증을 해야함. Authenticator만들기. 관련 주석의 밑에줄)

 

3. 그 외

메일을 보낼때 mimeMessage에 addRecipients말고 setRecipients(Message.RecipientType.TO, addArray)를 하니까

(List로 가져온 메일 주소 String을 배열 []로 풀어서 저장) 잘 보내짐.