JavaMail API와 STMP

Simple Mail TRansfer Protocol의 약자로 메일을 전송할 때 사용되는 프로토콜이다. JavaMail API는 기본적으로 STMP 프로토콜을 지원해준다.

JavaMailAPI pom.xml에 추가

1
2
3
4
5
6
<!-- Java Mail API -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.3</version>
</dependency>

JavaMail API를 사용하여 메일을 전송하는 과정

  1. javax.mail.Session 클래스의 인스턴스를 구한다.
  2. javax.mail.Message 클래스를 사용하여 전송하고자 하는 메일 메세지를 작성한다.
  3. javax.mail.Transport 클래스를 사용하여 작성한 메일을 전송한다.

세션 생성

JavaMail API는 메일과 관련된 모든 작업을 처리하기 위해서는 먼저 세션을 생성해야합니다. STMP와 관련된 세션을 생성하기 위해서는 STMP서버와 관련된 정보를 지정해주어야 합니다. 일반적으로, java.util.Properties 클래스를 사용하여 세션을 생성할 때 필요한 값을 설정한 후, javax.mail.Session을 사용하여 세션을 생성한다.

1
2
3
4
5
6
7
8
9
// 세션을 생성할 때 필요한 메일 연결에 관련된 설정 정보를 설정
Properties props = System.getProperties();
props.put("mail.transport.protocol", "smtp");
props.put("mail.smtp.port", PORT);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");

// 설정에 맞는 Session객체를 생성
Session session = Session.getDefaultInstance(props);

메세지 작성

메세지 작성은 javax.mail.Message 클래스를 통해서 이루어진다. 대부분의 이메일은 다양한 Mime 타입을 지원하기 때문에, MimeMessage 클래스를 사용해야 할 것이다. MIME(Multipurpose Internet Mail Extensions) MimeMessage 클래스는 Message 클래스를 상속받았으며, Message 메시지는(즉, MimeMessage 클래스는) 보내는 사람, 받는 사람, 제목, 내용과 같이 메일과 관련된 내용을 지정할 수 있도록 해 준다.

1
2
3
4
5
6
// 메세지를 작성
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress(FROM,FROMNAME));
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(addressTO));
msg.setSubject(Subject);
msg.setContent(Body,"text/html; charset=UTF-8");

InternetAddress 클래스는 이메일 주소를 나타낼 때 사용되는 클래스로서, Message 클래스의 수취인과 발신인을 지정할 때 사용된다. Message 클래스는 setRecipients() 메소드와 setFrom() 메소드를 사용하여 수취인과 발신인을 설정하며 setSubject() 메소드와 setContent() 메소드를 사용하여 메시지의 제목과 내용을 설정할 수 있다.

메세지 전송

메세지 전송은 Transport 클래스의 send() 메소드를 호출함으로써 이루어진다.

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
// Create a transport.
Transport transport = session.getTransport();

// 메세지 전송
try
{
System.out.println("Sending...");

// AWS에서 사용하는 SMTP username, password 자격증명으로 연결한다.
transport.connect(HOST, SMTP_USERNAME, SMTP_PASSWORD);

// 이메일 전송
transport.sendMessage(msg, msg.getAllRecipients());
System.out.println("Email sent!");
}
catch (Exception ex) {
System.out.println("The email was not sent.");
System.out.println("Error message: " + ex.getMessage());
System.out.println(addressTO);
}
finally
{
// Close and terminate the connection.
transport.close();
}

sendMessage(Message msg, Address[] addresses) 지정된 주소 목록으로 메시지를 보냅니다. 전송 상태를 나타내는 적절한 TransportEvent가이 Transport에 등록 된 모든 TransportListener에 전달됩니다. 또한 주소 중 하나라도 유효하지 않으면 SendFailedException이 발생합니다. 메시지가 여전히 유효한 주소로 성공적으로 전송되는지 여부는 전송 구현에 따라 다릅니다. 연결이 죽거나 연결 상태가 아닐 때 MessagingException이 발생합니다.

작성중..