메일로 임시 비밀번호를 전송하는 것을 구현해보았다.
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
https://blog.huiya.me/14?category=753937
https://www.thymeleaf.org/doc/articles/springmail.html
'Framework > Spring Boot' 카테고리의 다른 글
DTO (0) | 2022.05.24 |
---|---|
[Error] Error creating bean with name 'emailConfig': Injection of autowired dependencies failed; (0) | 2022.03.04 |
[Error] HTML 템플릿 메일 전송시 내용 깨짐 (0) | 2022.03.03 |
[Error] Error creating bean with name 'emailConfig': Injection of autowired dependencies failed; (0) | 2022.02.19 |
redirect (0) | 2022.02.13 |