Framework/Spring Boot

JavaMailSender를 이용한 메일 전송

잔망루피 2022. 3. 3. 20:40

메일로 임시 비밀번호를 전송하는 것을 구현해보았다.

 

implementation 'org.springframework.boot:spring-boot-starter-mail'

build.gradle의 dependencies에 추가

 

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=발송할이메일
spring.mail.password=비밀번호
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true	// TLS-protected 연결 허용

application-mail.properties를 생성한 후 위의 내용을 추가했다.

application.properties에서는 spring.profiles.include=mail을 사용해서 import 할 수 있도록 한다.

gmail로 전송할 것이다.

비밀번호는 보안 수준이 낮은 앱 허용보다 앱 비밀번호 사용을 추천

 

@Configuration
public class EmailConfig {
    @Value("${spring.mail.username}")
    private String username;

    @Value("${spring.mail.password")
    private String password;

    @Bean
    public JavaMailSender getJavaMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
        mailSender.setHost("smtp.gmail.com");
        mailSender.setPort(587);

        mailSender.setUsername(username);
        mailSender.setPassword(password);

        Properties props = mailSender.getJavaMailProperties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.debug", "true");

        return mailSender;
    }
}

빈 등록

@Value 어노테이션으로 properties 파일에서 값을 가져온다.

컨트롤러 유닛 테스트 코드를 작성 후 실행하니 Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.mail.javamail.JavaMailSender' available: 가 떴었는데 위와 같이 JavaMailSender 빈을 등록해주면 된다.

어플리케이션 실행 시에는 문제가 되지 않아서 위와 같은 JavaMailSender 빈을 등록하는 configuration 파일을 작성하지 않았었는데 테스트 할때 문제가 되었다.

@ActiveProfiles 어노테이션을 사용해서 해당 properties를 활성화할려고 했으나 잘 되지 않았다.

 

 

@Service
@RequiredArgsConstructor
public class EmailServiceImpl {
    private final JavaMailSender emailSender;
    private final UserService userService;
    private final SpringTemplateEngine templateEngine;

    public void sendMail(String address, String username, User user) throws MessagingException {
        HashMap<String, String> map=new HashMap<>();
        String new_password=makePassword();     // 임시 비밀번호 발급

        MimeMessage message = emailSender.createMimeMessage();
        MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8");

        //메일 제목 설정
        helper.setSubject("'Board 관리자' 님이 발송한 임시 비밀번호입니다.");

        //수신자 설정
        helper.setTo(address);

        //템플릿에 전달할 데이터 설정
        final Context context = new Context();
        context.setVariable("name", username);
        context.setVariable("password", new_password);

        map.forEach((key, value)->{ context.setVariable(key, value); });

        //메일 내용 설정 : 템플릿 프로세스
        String html = this.templateEngine.process("newPasswordMail", context);
        helper.setText(html, true);

        // 비밀번호 갱신
        user.setPassword(new_password);
        userService.joinUser(user);

        //메일 보내기
        emailSender.send(message);

    }

    // 임시 비밀번호 생성
    public String makePassword(){
        String pw="";
        for(int i=0; i<12; i++){
            pw+=(char)((Math.random()*26)+97);
        }
        return pw;
    }

}

이메일 서비스

임시 비밀번호를 생성해 메일로 전송한다.

참고로 HTML 템플릿을 전송하기 위해서는 TemplateEngine을 빈으로 등록해야 한다.

 

context.setVariable("name", username);
context.setVariable("password", new_password);

HTML에서 name, password에 username, new_password가 들어간다.

<span th:text="${name}">testID</span>

타임리프 사용 예시

${name}이 서버에서 받은 username이 대입됨

 

 

 


👇 참고

https://www.baeldung.com/spring-email

 

https://bamdule.tistory.com/238?category=324205 

 

[SpringBoot] 이메일 전송 (Gmail SMTP Server)

1. Gmail SMTP Server 구글 계정만 있으면 Gmail SMTP Server를 통해 무료로 이메일을 전송할 수 있습니다. Gmail SMTP Service 설정 정보는 다음과 같습니다. 2. pom.xml (dependency) org.springframework.bo..

bamdule.tistory.com

 

https://blog.huiya.me/14?category=753937 

 

[Spring Boot] html 템플릿 메일 보내기 - Thymeleaf

스프링부트에서 메일을 보내야 할 필요가 생겼다. 개발하면서 필요했던 요구사항은 아래와 같다. 가입 환영 메일, 이메일 인증 메일, 기타 등등 여러 종류의 메일 발송 가능할것. 단순 텍스트

blog.huiya.me

 

https://www.thymeleaf.org/doc/articles/springmail.html

 

Sending email in Spring with Thymeleaf - Thymeleaf

Using Thymeleaf for processing our email templates would allow us to use some interesting features: Also, given the fact that Thymeleaf has no required dependencies on the servlet API, there would be no need at all to create or send email from a web applic

www.thymeleaf.org

 

반응형