[Java] SMTP / POP3 / IMAP

YoungMinKim·2020년 12월 16일
1
post-thumbnail

Goal

SMTP, POP3, IMAPJavaMailSenderImpl에 대해 정리 해보자.

JavaMailSenderImpl

스프링이 지원하는 JavaMailSenderImpl(org.springframework.mail.javamail.JavaMailSenderImpl)
클래스이용하면 메일 보내는 서비스를 간단하게 작성할 수 있다.

메일 발송을 위해 필요한 부분

메일 서버(SMTP Server)

SMTP / POP3 / IMAP란?

설명하기에 앞서 일상 생활에서 나타는 SMTP의 사례를 정리 해보자.

  1. 편지를 쓰고 동네에 있는 우체통에 해당 편지를 넣는다.
    • 여기서 우체통SMTP 서버를 의미한다.
  2. 집배원해당 우체통에 있는 모든 편지가져간다.
    • 집배원POP3 서버를 의미 한다.
  3. 받는이가 사는 동네 우체국으로 편지분배 된다.
    • POP3 서버에 의해 해당 이메일이 전송 된다.

SMTP(simple mail transfer protocol)

웹 상에서 메일을 주고 받기 위해 이용되는 프로토콜(규약).
RFC2821에 따라 규정된 사용 TCP 포트 번호25번으로, 메일 서버간
송 수신뿐만 아니라, 클라이언트 측에서 메일 서버로 메일을 보낼때에도 사용이 된다.

일단 클라이언트이메일보내면 바로 상대편의 컴퓨터로 메일을 송신하는 것이 아니라,
중간에 메일서버라는 곳을 몇 군데 거치게 된다. 이렇듯이 메일서버에 이메일들이 차곡차곡
보관이되고 그것을 다시 다른 메일 서버에 보내면서 결국 보내고자하는 end-user에게 전해진다.

POP3 vs IMAP

우선, 두 용어 모두 메일 서버에서 이메일을 읽어로기 위한 프로토콜.
IMAP(Internet Messaging Access Protocol)

  • 서버에서 이메일을 읽는 프로토콜.
  • 어떤 상황에서든 동일한 내용을 읽어올 수 있다.

즉, PC나 모바일에서 메일을 확인할 때 서버에 저장된 정보를 가져와서 내용을 보여주고
변경 사항을 동기화한다. 그렇기 때문에 여러가지의 디바이스에서 접속하여도 동일한
정보를 확인할 수 있다.

POP3(Post Office Protocol))

  • 사용자의 기기로 이메일을 다운로드하여 읽는 프로토콜.
  • 다운로드한 내용서버에서 삭제되기에 동일한 기기에서만 이메일 확인 가능.

여러 기기에서 사용하기 어렵다. 서버에서 다운로드한 것은 삭제한다. 그래서 A 컴퓨터에서 먼저 POP3로 메일을 다운로드한 후, B 컴퓨터에서는 POP3로 메일을 다운로드해 보려고 하면 A 컴퓨터에서 먼저 다운로드한 메일들은 삭제되고 없다. 여러 기기에서 POP3로 메일을 보려면 이 것에 대한 대책을 세워야 할 것이다.

메일 서버에 접속하는 방법

서버가 릴레이를 허용하는 경우

  • 해당 메일 서버계정이 없어도 메일 발송 가능.
  • 타인에 의해 스팸 메일을 보내는데 악용 될 수 있으므로 특정 IP만 릴레이 허용.

해당 메일 서버의 계정

  • 위에서 말했다시피 해당 메일 서버계정이 있어서 아이디, 비밀번호 인증 후 메일 전송하는 방식.
  • 요즘은 두 번째 방식이 가장 일반적인 방법이다.

메일 발송을 위한 의존성 추가(pom.xml)

<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을 사용하기 위해 필요.

아이디 / 비밀번호 인증 후 발송하는 방식

필자는 위에서 언급했던 첫 번째 방식(릴레이 허용)을 사용하지 않고 두 번째 방식을 사용 하였다.

servlet.xml

<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>
  • yourUserName : Gmail 계정의 이메일 입력(관리자 이메일을 입력한다 생각하면 된다)
  • yourPassWord : Gmail 계정의 비밀번호 입력.
  • host : Google 메일 서버.
  • port : Google 메일 서버포트 번호.

구글은 인증에 TLS를 사용한다. 또한 TLS는 SSL과 같은 것인데, SSL 3.0부터 TLS라 부른다.
추후에 더 자세히 알아보겠지만, TLS는 통신에 사용되는 데이터를 암호화 하는 것이다.

메일 전송이 되지 않을 시

구글 메일의 2차 인증 부분에 문제가 있는 것이다.
개인 구글 계정 설정에서 보안 수준이 낮은 앱 허용을 클릭 한 후 메일을 재 전송 해보자.

메일 발송 API 제작

@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";
}
  • messageHelper.setTo("보내는 사람의 계정");
  • messageHelper.setText("메일의 내용");
  • messageHelper.setFrom("보내는 사람 계정");
  • messageHelper.setSubject("메일 제목");

참고 자료

profile
https://ym1085.github.io

0개의 댓글