ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] Java Mail API를 이용한 Naver SMTP MailSender 만들기
    Dev Log 2019. 4. 30. 20:13

    오늘 갑자기 다량으로 메일을 보낼 일이 생겨서, 이왕 이렇게 된거 Mail sender를 만들기로 마음을 먹었습니다.

    기존에 엑셀시트를 PDF파일로 변경하여 파일을 생성하였는데, 이제는 갑자기 그 PDF파일을 메일로 전송할 수 있게 해달라고 하더군요...허허..허..

    그래서 다시 키보드를 부여잡고 열심히 개발을 하였습니다.

     

    일단 제 개발환경은 다음과 같습니다.

    Java 8 + IntelliJ + Gradle

     

    그럼 개발을 한번 해볼까요~?

    1. mvnreposiroty.com 에서 JavaMail API를 Import합니다.

    https://mvnrepository.com/search?q=javamail 페이지에 접속하시면 두번째에 "JavaMail API"가 짜잔 하고 있습니다.

    Javamail이라고 검색하시면 해당 API들이 보여집니다.

    저는 거기서 가장 핫한 녀석인 1.4.7 버전의 JavaMail API를 선택하였습니다.

    그리고 build.gradle파일에 import를 해줍니다.

    참 쉽죠? 아주 간단합니다. API만 Import해주면 되는 세상입니다 하하

     

    2. Mail Sender를 만들어봅시다!

    필요한 것은 두 가지입니다.

    첫번째는 Naver SMTP 서버 정보를 가져옵니다!

    자신 계정을 로그인 한 뒤 메일에 접속하여 다음과 같이 내 메일함 옆에 있는 설정 아이콘을 클릭합니다.

    클릭해서 들어가면 메일 설정 파트가 나오는데 여기서 "POP/IMAP" 메뉴를 클릭합니다.

    여기서 우리가 필요한 부분은 네이버 메일 SMTP를 사용하시려면 다음과 같습니다.

    - SMTP 서버명 : smtp.naver.com

    - SMTP 포트 : 587

    이 부분입니다! 저는 SMTP를 사용하여 Sender를 개발하였기 때문에, 다른 부분은 딱히 필요가 없었습니다.

     

    참고로 이 내용은 개인 계정을 사용하실 경우 네이버에서 제공하는 '2차 인증'을 사용안함으로 설정한 상태에서 진행하였습니다. '2차 인증' 사용 계정을 이용할 시 인증관련된 에러가 발생하니 참고부탁드립니다!

     

    3. 이제 개발을 합시다.

    준비는 다 끝났습니다. 그럼 이제 개발을 해보도록 하지요!

    코드는 다음과 같습니다.

     

    ...더보기
    public class MailSender {
    	// 1. 계정 정보를 입력하고 encoding 설정을 합니다.
        private final String user = "Sender Email";   // Sender Email
        private final String password = "Sender Password";       // Sender Password
        private final String ENC_TYPE = "EUC-KR";           // Content Encoding
    
        private Properties prop;    // SMTP Setting information
    
        public MailSender() {
            this.prop = getProperties();
        }
    
    	// 2. 아까 확인했던 SMTP 정보를 기입합니다.
        private Properties getProperties() {
            Properties prop = new Properties();
            prop.put("mail.smtp.host", "smtp.naver.com");
            prop.put("mail.smtp.port", 587);
            prop.put("mail.smtp.auth", "true");
    
            return prop;
        }
    
    	// 3. SMTP정보를 기반으로 인증을 받아 Session을 생성합니다.
        private Session getSession() {
            return  Session.getDefaultInstance(prop, new Authenticator() {
                @Override
                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(user, password);
                }
            });
        }
        
        // 4. Mail을 전송하는 부분입니다.
        public void send(String pdfPath) {
            try {
                Session session = getSession();
                MimeMessage message = new MimeMessage(session);
                message.setFrom(new InternetAddress(user));
                // Receiver mail
                message.addRecipient(Message.RecipientType.TO, new InternetAddress("Receiver Email"));
                // Suject
                message.setSubject("제목");
                // Text
                MimeBodyPart content = new MimeBodyPart();
                content.setText("내용");
                // Attach pdf File
                File pdf = new File(pdfPath);
                MimeBodyPart attach = new MimeBodyPart();
                // 아래 fds는 설명드린 PDF 첨부를 위한 코드입니다.
                FileDataSource fds = new FileDataSource(pdf.getAbsolutePath()); // Load PDF
                attach.setDataHandler(new DataHandler(fds));
                attach.setFileName(MimeUtility.encodeText(fds.getName(), ENC_TYPE, "B"));
    
                // Write contents(Text & File)
                Multipart mp = new MimeMultipart();
                mp.addBodyPart(content);
                mp.addBodyPart(attach);
                message.setContent(mp);
    
                // Send the message
                Transport.send(message);
                System.out.println("전송 완료!");
            } catch (Exception e) {
                System.out.println("전송 실패!");
                e.printStackTrace();
            }
        }
    }
    

     

    4번을 좀 자세히 보겠습니다.

    Session은 3번에서 SMTP 기반으로 생성한 Session을 가져옵니다. 여기서 사용되는 Session은 HttpSession이 아니고

    java.mail.Session입니다.

    MimeMessage는 메일의 전반적인 내용을 말합니다. 생성 후 Form을 통해 InternetAddress로 발송하려는 User정보를 기입하고, AddRecipient를 통해 수신자의 정보를 입력받습니다.

    해당 부분에는 여러 메일 주소를 기입할 수 있으나 이번 버전은 건당 발송하는 것으로 했습니다 :-)

     

    setSubject()로 제목을 생성하고 내용을 담을 MimeBodyPart를 새로 생성합니다.

    content에는 setText()로 내용을 기입합니다.

    첨부할 파일을 불러오기 위해 Path를 기입한 File 객체를 만들고 MimeBodyPart를 새로 만들어(attach) 해당 파일을 첨부합니다.

    FileDataSource를 이용해 절대 주소를 입력받고 attach.setDataHandler에 설정하여 첨부파일을 생성합니다.

    그리고 파일 명칭을 설정하기 위해 setFileName 메소드를 호출합니다.

    여기서 주의할 점은 파일 명이 한글일 경우 깨질 수 잇기 때문에 MimeUtility.encodeText메소드를 사용해 한번 인코딩 변환을 해준 뒤 입력해야 한다는 것입니다 :-)

     

    모두 완료가 되었습니다. 이제 Multipart의 Body에 content와 attach를 추가하고 마지막으로 message.setContent에 Multipart를 파라미터로 넘겨줍니다.

     

    Transport의 send를 사용해 메일을 전송하면 끝이납니다!

     

    간단하게 Naver의 SMTP를 이용한 메일 발송 기능을 구현해봤습니다 :-)

    조금이라도 여러분께 도움이 되셨길 간절히 바라봅니다..하하..

    그럼 다들 화이팅 하세요!

     

     

Designed by Tistory.