프로젝트를 진행하며, 메일을 발송해야하는 기능이 필요했습니다.
이번 글에서는 스프링 메일발송 기능을 공부하며, 정리한 내용을 담아봤습니다.
먼저, 프로젝트에서 메일을 발송하는데 있어서 여러 전제조건이 필요하지만 가장 핵심기능인 메일발송에 대해서 알아보겠습니다.
스프링에서는 SMTP릴레이를 이용한 메일 전송기능을 제공하고 있습니다.
SMTP는 Simple Mail Transfer Protocol의 약자로 전자 메일 전송 프로토콜입니다.
SMTP Relay는 SMTP프로토콜로 이메일을 송수신하는 메일서버를 경유하여 다른 메일 서버로 메일을 보내는 것을 의미합니다.
다음 그림처럼 유저가 A라는 메일서버를 통해 B라는 메일서버로 전자메일을 보낼 수 있습니다.

하지만, A라는 메일서버가 사용자를 구분하지 않고 모든 메일을 릴레이를 할수도 있는데, 이를 오픈릴레이 또는 익명릴레이라고 하며, 스팸메일을 발송하는데 이용될 수 도 있습니다.

이런 경우를 대비해 보통은 특정 IP또는 계정을 통하여 릴레이가 되게하는데 대표적으로 네이버, 구글, 다음 등이 있습니다.
구글의 이메일 서비스인 Gmail을 통해 메일을 전송하기 위해서는 먼저 "보안 수준이 낮은 앱 허용" 설정을 사용으로 변경해야 합니다.

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-mail'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
spring:
mail:
host: smtp.gmail.com
port: 587
username: {mail_address}
password: {mail_password}
properties:
mail:
smtp:
auth: true
starttls:
enable: true
저는 API요청을 통해 메일을 전송할 것이기 때문에, RestController클래스를 하나 작성하였습니다.
@RequiredArgsConstructor
@RestController
public class RestController {
private final MailService mailService;
@PostMapping("/sendmail")
public String send(@RequestBody MailDto dto) {
mailService.sendMail(dto);
return "success";
}
}
다음으로 클라이언트로부터 요청을 받으면 비즈니스로직을 수행할 MailService클래스입니다.
@RequiredArgsConstructor
@Service
public class MailService {
private final JavaMailSender javaMailSender;
public void sendMail(MailDto dto) {
try {
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(dto.getReceiver());
message.setFrom(dto.getSender());
message.setText(dto.getText());
message.setSubject(dto.getTitle());
javaMailSender.send(message);
} catch (MailParseException e) {
e.printStackTrace();
} catch (MailAuthenticationException e) {
e.printStackTrace();
} catch (MailSendException e) {
e.printStackTrace();
} catch (MailException e) {
e.printStackTrace();
}
}
}
JavaMailSender는 스프링부트의 starter-mail이 제공하는 인터페이스로 MailSender를 상속받으며, 구현제는 JavaMailSenderImpl입니다.
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class MailDto {
private String title;
private String text;
private String receiver;
private String sender;
}
어플리케이션을 실행하고 아래와 같은 경로로 JSON데이터를 담아 요청을 합니다.
http://localhost:8080/sendmail
{
"title" : "TestTitle",
"text" : "TextText",
"sender" : {보내는 이메일 주소}",
"receiver" : {받는 이메일 주소}
}

정상적으로 메일이 발송이 된것을 확인할 수 있습니다.
스프링에서는 MimeMessageHelper를 이용하여 MIME을 포함한 메일을 발송할 수 있습니다.
이는 현재 프로젝트에 당장 필요한 기능은 아니여서 추후에 따로 정리하여 올리도록 하겠습니다.
좋은 글 감사합니다! 덕분에 고민하던 문제가 잘 해결됐습니다! 정말 감사합니다!