개발꿀팁
SMTP서버를 활용한 메일 보내기
프로젝트 중 단체메일 보내기, 문의사항이 있을 시 답변 메일을 보내는 형태의 메일보내기가 필요했다. springboot에서 메일전송 시 가장 무난하게 쓰이는 SMTP를 사용했고, 공용메일로 구글메일을 사용하고 있어 지메일을 활용했다.
1. 준비
build.gradle
build.gradle에 dependencies를 아래와 같이 추가한다.
implementation "org.springframework.boot:spring-boot-starter-mail"
2. 코드 구현
application.yml
SMTP 서버를 설정해야 한다. 나는 yml을 사용하여 세팅하였다.
username의 경우 '@gamil.com'을 제외한 아이디만을 적어야 한다.
spring:
mail:
host: smtp.gmail.com
port: 587
username: {YOUR_GMAIL_ADDRESS}
password: {YOUR_GMAIL_PASSWORD}
properties:
mail:
smtp:
auth: true
starttls:
enable: true
발신할 때 사용하는 SMTP 서버 설정 정보와 메일수신 시 사용하는 서버정보이다.
3. 간단한 메일 보내기 - SimpleMailMessage
MailRequestDto
메일을 발송할 때 필요한 정보를 Dto로 받아준다.
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
public class MailRequestDto {
private String sender; //보내는사람
private String email; //받는사람
private String title; //제목
private String cont; //내용
}
Controller
위에 작성한 Dto를 @RequestBody로 받는다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class MailController {
private final MailService mailService;
@PostMapping("/mail")
public void mail (@RequestBody MailRequestDto mailDto,
) throws MessagingException {
mailService.answerMail(mailDto);
}
}
Service
간단한 text 형태의 메일은 SimpleMailMessage를 사용하여 작성할 수 있다.
< Spring 프레임 워크에서 Java 메일 지원을위한 인터페이스 및 클래스 >
- MailSender: 기본 이메일 전송 기능을 제공하는 최상위 인터페이스
- JavaMailSender: MIME 메시지(첨부 파일, HTML 이메일 등)까지 지원하는 확장된 인터페이스
- JavaMailSenderImpl: 실제 구현체
- SimpleMailMessage: 텍스트 기반 이메일 생성에 사용
- MimeMessageHelper: HTML 및 첨부 파일 포함 이메일 생성에 도움
- MimeMessagePreparator: MIME 메시지 생성을 쉽게 할 수 있도록 돕는 콜백 인터페이스
받는 사람의 경우 배열로 받는다. 단체메일 등을 보낼 때 참고하면 좋을 것 같다.
@Service
@Transactional
@AllArgsConstructor
public class MailService {
private final InquiryRepository inquiryRepository;
private JavaMailSender mailSender;
public void answerMail(mailRequestDto mailDto) throws MessagingException {
// 메일 보내기
try {
SimpleMailMessage message = new SimpleMailMessage();
message.setFrom(mailDto.getSender()); // 보내는 사람
message.setTo(mailDto.getEmail()); // 받는 사람 String[] to
message.setSubject(mailDto.getTitle()); // 제목
message.setText(mailDto.getCont()); // 내용
mailSender.send(message);
} catch (MailException exception) {
throw new ApiException(ErrorCode.INVALID_EMAIL);
}
}
}
처음 try-catch를 사용하지 않고 코드를 작성하였을 때 아래와 같은 오류가 발생했었는데, 받는사람의 메일이 올바르지 않을 때 발생한다. try-catch를 통해 예외처리를 해주면 더이상 오류가 발생하지 않는다.
모든게 완벽하게 작성되었다면 빌드 시 아래와 같은 에러메세지가 뜨는데 연결한 구글 계정의 2단계 인증이 필요하기 때문이다.
아래 절차에 따라 2단계인증을 하면 문제없이 메일이 발송된다.
3. 테스트
포스트맨에서 테스트를 하면 아래와 같은 결과가 나온다.
<참고>
'개발 하나둘셋 > Java & Spring' 카테고리의 다른 글
Docker 알아보기! Dockerfile 만들기, 이미지와 컨테이너 빌드하기 (1) | 2022.09.16 |
---|---|
SpringBoot 슬랙 Slack알림보내기 ChatPostMessageRequest (0) | 2022.06.15 |
spring 게시판 기간조회 동적으로 처리하기 querydsl (0) | 2022.05.18 |
spring 게시판 기간조회 방법! String -> LocalDateTime 변환 (0) | 2022.04.25 |
스프링 DI ,IOC, AOP (0) | 2022.04.11 |