[USports] Email 전송
프로젝트에서 이메일 인증과, 임시 비밀번호를 이메일을 통해 는 것이 있다
구글 SMTP 서버를 이용하였다
- 프로젝트 용 이메일을 새로 만들고, 프로젝트를 위해, 원래 비밀번호가 아닌, 프로젝트 용 비밀번호를 개인 설정에서 받을 수 있다
하기 전에 2차 인증까지 설정을 해야 한다!
Google 계정 관리에 들어가기
- 검색에서 앱 비밀번호를 치고, 들어가기
- 그러면 계정 비밀번호를 입력하라고 뜬다
App Name에 어플리케이션 이름 입력하기
앱 비밀번호를 받고, 꼭 복사하기 (잊어버리면, 또 다시 앱을 입력해야 한다)
- 그리고 외부에 노출하지 말기!
Gmail의 설정에 들어가서 전달 및 POP/IMAP에 들어가기
아래와 같이 설정하기
build.gradle
아래 추가
implementation 'org.springframework.boot:spring-boot-starter-mail'
application-private.properties
해당 내용들은 외부에 공개를 안 하는게 좋다
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=이메일
spring.mail.password=앱 비밀번호
spring.mail.properties.mail.smtp.auth=true
# SMTP서버가 TLS를 사용하여 안전하게 연결을 요구한다
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# 클라이언트가 SMTP 서버로부터 응답을 대기해야 하는 시간
# 서버에서 응답이 가지 않을 경우를 대비
spring.mail.properties.mail.smtp.timeout=5000
# 클라이언트가 SMTP 서버와의 연결을 설정하는데 대기하는 시간
spring.mail.properties.mail.smtp.connectiontimeout=5000
# 클라이언트가 작업을 완료하는데 대기해야 하는 시간 (Millisecond)
spring.mail.properties.mail.smtp.writetimeout=5000
# 이메일 인증 코드의 만료 시간 (Millisecond)
spring.mail.auth-code-expiration-millis=1800000
EmailConfig
@Configuration
public class EmailConfig {
@Value("${spring.mail.host}")
private String host;
@Value("${spring.mail.port}")
private int port;
@Value("${spring.mail.username}")
private String username;
@Value("${spring.mail.password}")
private String password;
@Value("${spring.mail.properties.mail.smtp.auth}")
private boolean auth;
@Value("${spring.mail.properties.mail.smtp.starttls.enable}")
private boolean starttlsEnable;
@Value("${spring.mail.properties.mail.smtp.starttls.required}")
private boolean starttlsRequired;
@Value("${spring.mail.properties.mail.smtp.connectiontimeout}")
private int connectionTimeout;
@Value("${spring.mail.properties.mail.smtp.timeout}")
private int timeout;
@Value("${spring.mail.properties.mail.smtp.writetimeout}")
private int writeTimeout;
// 이메일 보내는 객체
@Bean
public JavaMailSender javaMailSender() {
JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
mailSender.setHost(host);
mailSender.setPort(port);
mailSender.setUsername(username);
mailSender.setPassword(password);
mailSender.setDefaultEncoding("UTF-8");
mailSender.setJavaMailProperties(getMailProperties());
return mailSender;
}
private Properties getMailProperties(){
Properties properties = new Properties();
properties.put("mail.smtp.auth", auth);
properties.put("mail.smtp.starttls.enable", starttlsEnable);
properties.put("mail.smtp.starttls.required", starttlsRequired);
properties.put("mail.smtp.connectiontimeout", connectionTimeout);
properties.put("mail.smtp.timeout", timeout);
properties.put("mail.smtp.writeTimeout", writeTimeout);
return properties;
}
}
Controller
- 메일이 잘 보내지는지 확인하는 컨트롤러
@RestController
@RequiredArgsConstructor
@RequestMapping("/member")
public class MailController {
private final MailService mailService;
/**
* 메일 보내기
* @param email
* @return 인증 번호
*/
@PostMapping("/mail/{email}")
public String MailSend(
@PathVariable("email") String email
){
int number = mailService.sendEmailAuthMail(email);
String num = " " + number;
return num;
}
}
MailServiceImpl
createMail()
- MimeMessage의 객체를 만들어서, 매일 소재목, 내용을 넣을 수 있다
sendEmailAuthMail()
- createMail에서 만든 메일 내용을 JavaMailSender를 통해 보내게 된다
@Service
@RequiredArgsConstructor
@Slf4j
public class MailServiceImpl implements MailService {
private final JavaMailSender javaMailSender;
private static final String senderEmail = "jejoonproject@gmail.com";
public MimeMessage createMail(String mail, String value, String title, StringBuilder content) {
MimeMessage message = javaMailSender.createMimeMessage();
try {
StringBuilder body = new StringBuilder();
body.append("<h1>").append(value).append("<h1>").append(content);
message.setRecipients(MimeMessage.RecipientType.TO, mail);
message.setSubject(title);
message.setText(String.valueOf(body), "UTF-8", "html");
} catch(MessagingException e) {
e.printStackTrace();
}
return message;
}
@Override
@Async
public int sendEmailAuthMail(String email) {
String number = "1004";
String title = MailConstant.MEMBER_EMAIL_AUTH_TITLE;
StringBuilder content = MailConstant.AUTH_EMAIL_CONTENT;
MimeMessage message = createMail(email, number, title, content);
javaMailSender.send(message);
return Integer.parseInt(number);
}
}
'프로젝트 > USports' 카테고리의 다른 글
[USports] Websocket 소개 (0) | 2023.12.18 |
---|---|
[USports] Member OAuth2 (0) | 2023.12.09 |
[USports] Member 단위 테스트 (1) | 2023.12.07 |
[USports] Login 구현 (1) | 2023.12.05 |
[USports] Redis + Login (9) | 2023.12.05 |