스프링 프레임워크에서 메일서버(SMTP server)를 이용하여 메일을 전송하는 방법에 대해 알아보자
일반적으로 전자 메일 전송을 위한 표준 프로토콜이다
(이메일을 송신하는 서버)
1 . 연결 설정 단계 : SMTP 클라이언트가 TCP를 이용해 SMTP 서버와 세션을 설정
2 . 연결 설정이 완료되면 SMTP 서버에 메일을 보내는 데이터 전송 단계를 진행 (송신자, 수신자의 주소 및 메일 제목과 같은 헤더 정보)
3 . 메일 전송을 완료하면 TCP 연결을 종료하는 연결해제 단계가 진행되며 SMTP가 종료됨
이메일을 수신하는 서버(자신에게 온 메일을 받아오려면 POP3서버에 자신의 계정을 가지고 있어야함)
smtp서버와 pop3서버가 조금 헷갈린다...
->
SMTP 서버: "우체국의 발송 창구"와 같습니다.
당신이 친구에게 편지를 보내고 싶을 때, 그 편지를 쓴 후에 우체국의 발송 창구에 가서 편지를 넣습니다.
SMTP 서버는 이 편지(이메일)를 적절한 받는 사람에게 전달하는 역할을 합니다.
POP3 서버: "우체국의 수령 창구"나 "당신의 우편함"과 같습니다.
누군가 당신에게 편지를 보냈다면, 그 편지는 당신의 우편함(POP3 서버)에 보관됩니다.
당신이 편지(이메일)를 확인하고 싶을 때, 우편함을 열어 편지를 확인합니다.
POP3는 편지를 "수령"하는 역할을 합니다.
JavaMailSender
implementation 'org.springframework.boot:spring-boot-starter-mail'
spring:
mail:
host: smtp.gmail.com
port: 587
username: {YOUR_GMAIL_ADDRESS}
password: {YOUR_GMAIL_PASSWORD}
properties:
mail:
smtp:
auth: true
starttls:
enable: true
mail.smtp.auth: true
이 설정은 SMTP 서버에 접속할 때 인증을 필요로 한다는 것을 나타냄.true로 설정되면, 이메일을 보낼 때 username과 password 정보를 제공해야 SMTP 서버에 로그인하고 메일을 보낼 수 있음.여기서는 Gmail 계정의 이메일 주소와 비밀번호가 필요하므로 인증이 필수적
mail.smtp.starttls.enable: true
STARTTLS는 SMTP 서버와의 통신을 암호화하기 위한 기술.
true로 설정하면, 이메일 클라이언트와 SMTP 서버 간의 모든 통신은 암호화되어 중간에서 데이터를 가로채기가 힘들어짐.
포트 587은 일반적으로 STARTTLS를 사용한 SMTP 연결에 사용됨. 따라서 starttls.enable을 true로 설정하는 것은 이 포트에서 이메일을 보낼 때 필요한 보안 조치
@RequiredArgsConstructor
@Component
public class MailComponents {
//메일 전송을 위해 mailSender를 빈으로 등록(의존성 주입)
private final JavaMailSender javaMailSender;
public void sendMailTest() {
SimpleMailMessage msg = new SimpleMailMessage();
msg.setTo("test@naver.com");
msg.setSubject("안녕하세요.");
msg.setText(" 안녕하세요. 이메일 테스트입니다 ");
javaMailSender.send(msg);
}
}
public boolean sendMail(String mail, String subject, String text) {
boolean result = false;
MimeMessagePreparator msg = new MimeMessagePreparator() {
@Override
public void prepare(MimeMessage mimeMessage) throws Exception {
//멀티파트 메세지를 허용하겠다
MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
mimeMessageHelper.setTo(mail);
mimeMessageHelper.setSubject(subject);
mimeMessageHelper.setText(text, true);
}
};
try {
javaMailSender.send(msg);
result = true;
} catch (Exception e) {
System.out.println(e.getMessage());
}
return result;
}
- mimeMessageHelper.setText( (String),true) : html를 사용하겠다
- mimeMessageHelper.setFrom() : 메일주소에 이름과 이메일 주소 모두 표기하겠다