티스토리 뷰

반응형

# 개요

네이버 메일을 이용해서 스프링 부트에서 메일을 보내는 기능을 구현한다

(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
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크