개발 Note/JAVA

[JAVA] 메일 발송하기

sylim95 2022. 3. 25. 02:19

웹 개발을 할 때 회원가입 안내나 로그인 비밀번호 체크 등등 메일을 보낼 일이 종종 있다.

JavaMail 라이브러리를 통해 메일 보내는 작업은 기존에도 여러번 했었는데

최근에서야(;;) 새로운 정보를 알게 되어 포스팅 해본다.

 

SMTP란?

Simple Mail Transfer Protocel. 말 그대로 인터넷에서 이메일을 보내기 위해 이용되는 프로토콜이다. 

네이버나 구글은 계정에 SMTP를 제공해줘서 따로 물리적인 서버 공간이 없어도 Java 라이브러리를 통해 메일 전송 구현이 가능하다.

 

[구현하기]

1. MVNRepository에서 JavaMail 라이브러리 다운받기

https://mvnrepository.com/artifact/javax.mail/mail/1.4.7 에서 다운 가능하다.

JAR를 다운받아 프로젝트에 import 시켜도 되고,

환경에 맞게 소스 내에 삽입시켜도 된다.

 

 

2. 계정 POP3 및 IMAP 설정(Google 기준)

1) Gmail 접속 후 우측 상단의 톱니바퀴 모양 -> 모든 설정 보기 클릭

2) 전달 및 POP/IMAP 설정 클릭 ->  POP 사용하기 클릭 -> IMAP 사용 클릭

 

 

3. 소스 작성

 

1) 메일 계정과 비밀번호 설정

// 보내는 사람
private String fromEmail = EmailInfo.MAIL_FROM.getValue();
// 보내는 사람 이름
private String senderName = EmailInfo.MAIL_SEND_NAME.getValue();
// 보내는 사람 메일 계정 비밀번호
private String senderPassword = EmailInfo.MAIL_SEND_PW.getValue();

2) Property 설정

Properties properties = new Properties();
// SMTP 서버 설정
properties.put("mail.smtp.host", "smtp.gmail.com");
// port - gmail: 465, naver: 587
properties.put("mail.smtp.port", 465);
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.trust", "smtp.gmail.com");

3) Session의 인스턴스 생성

Authenticator auth = new SMTPAuthenticator(fromEmail, senderPassword);
Session session = Session.getDefaultInstance(properties, auto);

 

4) Message를 통해 수신자, 내용, 제목 작성 후 Transport를 사용하여 메세지 전달

try {
    MimeMessage message = new MimeMessage(session);
    message.setHeader("content-type", "text/html;charset=UTF-8");
    //발신자
    message.setFrom(senderAddress);
    //수신자(다중 수신자)
    message.setRecipients(Message.RecipientType.TO, receiverAddress);
    //제목
    message.setSubject(MimeUtility.encodeText(subject, "UTF-8", "B"));
    //내용
    message.setContent(content, "text/html;charset=euc-kr");
    
    //전송
    Transport transport = session.getTransport("smtps");
    transport.connect(mailServer, senderName, senderPassword);
    transport.sendMessage(message, message.getAllRecipients());
} catch(UnsupportedEncodingException e) {
	e.printStackTrace();
} catch(MessagingException e) {
	e.printStackTrace();
} catch(AddressException e) {
	e.printStackTrace();
}

 

3. 새로 알게된 것

SSL을 사용할 때와 TLS를 사용할 때 설정이 다르다는 것을 알게되었다.

(그냥 포트를 465와 587로 상이하게 설정한다고 막연하게 생각했음...)

 

그렇다면 SSL과 TLS은 무엇이 다를까?

사실상 같다고 봐도 무관하지만, (SSL 3.0이 버전 업 한 것이 TLS 1.0)

SSL은 통신을 시작할 때부터 암호화된 통신을 하고 TLS는 메시지를 주고 응답을 받아 상호간 암호화된 통신이 된다는 것을 확인한 후에 암호화된 통신을 시작한다고 한다.

 

SSL을 사용할 때는 보통 465 포트, TLS를 사용할 때는 보통 587 포트를 사용한다.

 

 

당연하게 생각했던 것도 이유가 있다. 거창하진 않아도...

꼼꼼히 살펴보는 습관을 가지자🤣🤣