📝 SMTP란?
- 스프링에서는 SMTP Relay를 이용한 메일 전송 기능을 제공하고 있습니다.
- 여기서 SMTP는
Simple Mail Transfer Protocol
의 약자로, 전자 메일 전송 프로토콜을 의미합니다. - SMTP Relay란 메일 서버 외부에서 메일 서버를 경유하여 다른 메일 서버로 메일을 보내는 것을 의미하며, 이때 경유한 서버를 메일 릴레이 서버라고 합니다.
- 모든 전자 메일 메시지를 릴레이하는 것을 오픈릴레이라고 하는데, 오픈릴레이 메일 서버는 스팸 메일 발신자의 메일 서버로 사용될 수도 있기 때문에 보통은 특정 IP 또는 계정을 통하여 릴레이 되도록 구현합니다.
📝 SMTP 사용하기
- 이제 SMTP를 사용해 우리 프로젝트에서 이메일을 전송하는 방법에 대해 알아보겠습니다.
📜 의존성 추가
- 우선 아래와 같이 의존성을 추가해줍니다.
Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
<version>VERSION 명</version>
</dependency>
Gradle
implementation 'org.springframework.boot:spring-boot-starter-mail:VERSION 명'
📜 application.yml
- 다음으로
application.yml
파일에 아래 설정을 추가해줍니다.
spring:
mail:
host: smtp.gmail.com
port: 587
username: {mail_address}
password: {mail_password}
properties:
mail:
smtp:
auth: true
starttls:
enable: true
- 여기서는 예제에서 흔히 볼 수 있는
587
포트를 사용하였지만, 만약 사내 SMTP 서버를 사용하는 등 다른 SMTP 서버를 이용할 경우 해당 SMTP 서버를 확인하여spring.mail.port
부분에 지정해주어야 합니다. - 또한 구글이나 네이버의 SMTP를 사용할 경우
spring.mail.username
과spring.mail.password
를 작성하여야 합니다.
📜 Controller
- 다음으로 API 요청을 통한 메일 전송을 구현하기 위해 아래와 같은 RestController를 구현해줍니다.
@RequiredArgsConstructor
@RestController
public class RestController {
private final MailService mailService;
@PostMapping("/sendmail")
public String send(@RequestBody MailDto dto) {
mailService.sendMail(dto);
return "success";
}
}
📜 Service
- 이후 클라이언트 요청을 받아 비즈니스 로직을 수행하는 Service를 구현해줍니다.
- 여기서의 비즈니스 로직이란 메일 전송을 의미할 것입니다.
@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
는 메일 발송 기능을 정의한MailSender
인터페이스를 상속받는 인터페이스로,MailSender
는SimpleMailMessage
를 전달받아 메일을 발송하는 기능을 정의하고 있습니다.SimpleMailMessage
는 단순 텍스트 구성 메일 메시지를 생성할 때 사용하며, 위에서 사용한 각각의 메소드는 순서대로 수신자, 발신자, 메일 내용, 메일 제목을 설정하는 메소드입니다.
package org.springframework.mail;
public interface MailSender {
void send(SimpleMailMessage simpleMessage) throws MailException;
void send(SimpleMailMessage[] simpleMessages) throws MailException;
}
- 또한
MailSender
인터페이스를 상속받은JavaMailSender
는 Java Mail API의MimeMessage
를 이용해서 메일을 발송하는 추가적인 기능을 정의하고 있으며,JavaMailSender
인터페이스의 구현체로는JavaMailSenderImpl
클래스가 제공되고 있습니다.
package org.springframework.mail.javamail;
import java.io.InputStream;
import javax.mail.internet.MimeMessage;
import org.springframework.mail.MailException;
import org.springframework.mail.MailSender;
public interface JavaMailSender extends MailSender {
MimeMessage createMimeMessage();
MimeMessage createMimeMessage(InputStream contentStream) throws MailException;
void send(MimeMessage mimeMessage) throws MailException;
void send(MimeMessage[] mimeMessages) throws MailException;
void send(MimeMessagePreparator mimeMessagePreparator) throws MailException;
void send(MimeMessagePreparator[] mimeMessagePreparators) throws MailException;
}
📜 MailDto
- DTO 구성은 아래와 같으며, 이후 테스트를 수행하여 이메일이 전송되는 것을 확인합니다.
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class MailDto {
private String title;
private String text;
private String receiver;
private String sender;
}
'🥑 Web Technoloy' 카테고리의 다른 글
Lombok이란? (1) | 2023.06.04 |
---|---|
Spring AOP(Aspect Oriented Programming) (0) | 2023.06.03 |
Spring Interceptor 개념 정리, 적용법 (0) | 2022.11.15 |
OAuth 2.0 개념 정리 (0) | 2022.11.11 |
스프링 부트 Spring Security (0) | 2022.11.10 |