티스토리 뷰
반응형
# 개요
네이버 메일을 이용해서 스프링 부트에서 메일을 보내는 기능을 구현한다
(Gmail은 5/30 이후로 정책이 바뀌어서 이제 손 쉽게 메일을 보내기 어려워졌다)
# 환경설정
Gradle 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-mail'
네이버 메일 설정
SMTP 사용을 사용함으로 설정해준다
application.yml
spring:
mail:
host: smtp.naver.com
port: 465
username: 아이디@naver.com
password: 비밀번호
properties:
mail.smtp.auth: true
mail.smtp.ssl.enable: true
mail.smtp.ssl.trust: smtp.naver.com
mail.smtp.starttls.enable: true
[주의]
- 네이버 설정에 포트가 587로 되어있어서 587로하면 SSL오류가 뜬다. 그러니 465로 설정해주자
- 아이디 적는칸에는 @naver.com을 꼭 붙혀준다
# 메일 구현 (JavaMailSender)
@Service
@RequiredArgsConstructor
public class EmailService {
private final JavaMailSender mailSender;
private static final String ADMIN_ADDRESS = "ektour0914@naver.com";
@Async
public void sendMail(EstimateRequest form) throws UnsupportedEncodingException, MessagingException {
MimeMessage message = mailSender.createMimeMessage();
message.addRecipients(Message.RecipientType.TO, ADMIN_ADDRESS);
message.setSubject("[이케이하나관광 견적요청]");
String text = "";
text += form.getName() + " " + form.getPhone() + "\n";
text += form.getTravelType() + " " + form.getVehicleType() + " " + form.getVehicleNumber() + "\n";
text += form.getDepartPlace() + " ~ " + form.getArrivalPlace() + "\n";
text += "경유지(" + form.getStopPlace() + ")\n";
text += form.getDepartDate() + " ~ " + form.getArrivalDate() + "\n";
message.setText(text, "utf-8");
message.setFrom(new InternetAddress(ADMIN_ADDRESS, form.getName()));
mailSender.send(message);
}
}
JavaMailSender 메시지 형식으로는 SimpleMessage와 MimeMessage가 있는데, MimeMessage는 HTML같은 추가적인 정보를 담고 싶을때 사용하면 된다.
private MimeMessage createMessage(String email, String authToken) throws MessagingException, UnsupportedEncodingException {
MimeMessage message = emailSender.createMimeMessage();
message.addRecipients(Message.RecipientType.TO, email);
message.setSubject("TeamOne 회원가입 인증 메일이 도착했습니다.");
String text="";
text+= "<div style='margin:100px;'>";
text+= "<div align='center' style='border:1px solid black; font-family:verdana';>";
text+= "<h3 style='color:blue;'>회원가입 코드입니다.</h3>";
text+= "<div style='font-size:130%'>";
text+= "CODE : <strong>";
text+= authToken+"</strong><div><br/> ";
text+= "</div>";
message.setText(text, "utf-8", "html");
message.setFrom(new InternetAddress("teamoneauth@gmail.com","TeamOne"));
return message;
}
이런식으로 HTML을 넣을수도 있다. 메일을 보내면 HTML이 랜더링되서 발송된다.
[주의]
- setFrom을 설정할때, yml 설정파일에 없는 메일 전송자를 넣으면 오류가 발생하니 주의할 것 (메일 발송 주체 == From을 맞춰야함)
- MimeMessage를 사용하면 HTML을 넣을 수 있고, setText에 타입을 html로 지정하면 됨
- 메일 보내는걸 비동기적으로 처리하고 싶으면 @Async
반응형