SMTP
, POP3
, IMAP
및 JavaMailSenderImpl
에 대해 정리 해보자.
스프링
이 지원하는 JavaMailSenderImpl
(org.springframework.mail.javamail.JavaMailSenderImpl)
클래스
를 이용
하면 메일 보내는 서비스를 간단하게 작성할 수 있다
.
메일 서버(SMTP Server)
설명하기에 앞서 일상 생활에서 나타는 SMTP의 사례를 정리 해보자.
웹 상에서 메일을 주고 받기 위해 이용되는 프로토콜(규약).
RFC2821에 따라 규정된 사용 TCP 포트 번호는 25번으로, 메일 서버간
송 수신뿐만 아니라, 클라이언트 측에서 메일 서버로 메일을 보낼때에도 사용이 된다.
일단 클라이언트가 이메일을 보내면 바로 상대편의 컴퓨터로 메일을 송신하는 것이 아니라,
중간에 메일서버라는 곳을 몇 군데 거치게 된다. 이렇듯이 메일서버에 이메일들이 차곡차곡
보관이되고 그것을 다시 다른 메일 서버에 보내면서 결국 보내고자하는 end-user에게 전해진다.
우선, 두 용어 모두 메일 서버에서 이메일을 읽어로기 위한 프로토콜.
IMAP(Internet Messaging Access Protocol)
즉, PC나 모바일에서 메일을 확인할 때 서버에 저장된 정보를 가져와서 내용을 보여주고
변경 사항을 동기화한다. 그렇기 때문에 여러가지의 디바이스에서 접속하여도 동일한
정보를 확인할 수 있다.
POP3(Post Office Protocol))
여러 기기에서 사용하기 어렵다. 서버에서 다운로드한 것은 삭제한다. 그래서 A 컴퓨터에서 먼저 POP3로 메일을 다운로드한 후, B 컴퓨터에서는 POP3로 메일을 다운로드해 보려고 하면 A 컴퓨터에서 먼저 다운로드한 메일들은 삭제되고 없다. 여러 기기에서 POP3로 메일을 보려면 이 것에 대한 대책을 세워야 할 것이다.
서버가 릴레이를 허용하는 경우
메일 서버
의 계정이 없어도
메일 발송 가능.특정 IP
만 릴레이 허용.해당 메일 서버의 계정
메일 서버
의 계정이 있어서
아이디, 비밀번호 인증 후 메일 전송
하는 방식.<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
<version>1.5.6</version>
</dependency>
javax.mail.internet.MimeMessage을 사용하기 위해 필요.
필자는 위에서 언급했던 첫 번째 방식(릴레이 허용)을 사용하지 않고 두 번째 방식을 사용 하였다.
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<!-- <property name="host" value="smtp.yourEmailDomain.co.kr" /> -->
<!-- <property name="port" value="25" /> -->
<property name="host" value="smtp.gmail.com" />
<property name="port" value="587" />
<property name="username" value="yourUserName" />
<property name="password" value="yourPassword" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="mail.smtp.starttls.enable">true</prop>
</props>
</property>
</bean>
이메일
입력(관리자 이메일을 입력한다 생각하면 된다)비밀번호
입력.서버
.서버
의 포트 번호
.구글은 인증에 TLS를 사용한다. 또한 TLS는 SSL과 같은 것인데, SSL 3.0부터 TLS라 부른다.
추후에 더 자세히 알아보겠지만, TLS는 통신에 사용되는 데이터를 암호화 하는 것이다.
구글 메일의 2차 인증 부분에 문제가 있는 것이다.
개인 구글 계정 설정에서 보안 수준이 낮은 앱 허용을 클릭 한 후 메일을 재 전송 해보자.
@AutoWired
private JavaMailSenderImpl mailSender;
servlet.xml에서 생성한 bean(객체)를 @AutoWired 어노테이션을 사용해 주입 받는다.
@RequestMapping(value = "/test/sendMail")
public String sendMail() {
String from = mailSender.getUsername();
String subject = "[공지] 자바 SMTP 이메일 테스트";
try {
MimeMessage message = mailSender.createMimeMessage();
MimeMessageHelper messageHelper = new MimeMessageHelper(message, true, "UTF-8");
messageHelper.setTo("ym1085@naver.com");
messageHelper.setText("자바 SMTP 메일 테스트입니다.");
messageHelper.setFrom(from);
messageHelper.setSubject(subject);
} catch(Exception e) {
e.printStackTrace();
}
return "Success";
}