네이버 SMTP 설정
설정을 저장해주면 아래 Pop 서버명같이 작은 정보창이 생김
의존성 설정
//이메일인증
implementation 'org.springframework.boot:spring-boot-starter-mail'
환경설정 -> MailConfig.java OR application.yml 사용
@Configuration
public class MailConfig {
@Value("${spring.mail.password}")
private String password;
@Bean
public JavaMailSender javaMailService() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost("smtp.naver.com");
javaMailSender.setUsername("kilwogus4048@naver.com");
javaMailSender.setPassword(password);
javaMailSender.setPort(465);
javaMailSender.setJavaMailProperties(getMailProperties());
return javaMailSender;
}
private Properties getMailProperties() {
Properties properties = new Properties();
properties.setProperty("mail.transport.protocol", "smtp");
properties.setProperty("mail.smtp.auth", "true");
properties.setProperty("mail.smtp.starttls.enable", "true");
properties.setProperty("mail.debug", "true");
properties.setProperty("mail.smtp.ssl.trust","smtp.naver.com");
properties.setProperty("mail.smtp.ssl.enable","true");
return properties;
}
}
이렇게 Config 파일을 하나만들어서 프로퍼티 설정을 하던지
아니면 설정파일을 안만들고 application.yml에 환경변수 설정을 하면된다. -> 둘다 됨.
application.yml에 적용시
# Naver smtp server 사용
spring:
mail:
host: smtp.naver.com #smtp 서버 주소
port: 465 # 메일 인증서버 포트
username: xxxx #네이버 아이디
password: xxxx #네이버 비밀번호
properties:
mail:
smtp:
starttls:
enable: true
# required: true
auth: true
# connectiontimeout: 5000
# timeout: 5000
# writetimeout: 5000
ssl:
#trust: smtp.naver.com
enable: true #반드시 필요 -> SSL 필요로 되어있으면
위와 같이 application.yml에 추가해주면됨.
MailService.java 메일관련 메소드 파일
@Service
public class MailService {
private final JavaMailSender javaMailSender;
private final MailDao mailDao;
private final RedisUtil redisUtil; //redis 관련
@Autowired
public MailService(JavaMailSender javaMailSender,MailDao mailDao,RedisUtil redisUtil )
{
this.javaMailSender = javaMailSender;
this.mailDao = mailDao;
this.redisUtil = redisUtil;
}
private MimeMessage createMessage(String code, String email) throws Exception{
MimeMessage message = javaMailSender.createMimeMessage();
message.addRecipients(Message.RecipientType.TO, email);
message.setSubject("Planet 인증 번호입니다.");
message.setText("이메일 인증코드: "+code);
message.setFrom("환경변수로 등록한 네이버 아이디@naver.com"); //보내는사람.
return message;
}
public void sendMail(String code, String email) throws Exception{
try{
MimeMessage mimeMessage = createMessage(code, email);
javaMailSender.send(mimeMessage);
}catch (MailException mailException){
mailException.printStackTrace();
throw new IllegalAccessException();
}
}
public String sendCertificationMail(String email) throws BaseException {
// if(userProvider.checkEmail(email) == 1){
// throw new BaseException(BaseResponseStatus.DUPLICATED_EMAIL);
// }
try{
String code = UUID.randomUUID().toString().substring(0, 6); //랜덤 인증번호 uuid를 이용!
sendMail(code,email);
redisUtil.setDataExpire(code,email,60*5L); // {key,value} 5분동안 저장.
return code;
}catch (Exception exception){
exception.printStackTrace();
throw new BaseException(BaseResponseStatus.DATABASE_ERROR);
}
}
}
랜덤 인증코드를 만들고
제목 내용을 정하고
메일을 보내는 일련의 과정을 MailService에 구현 ++ redisUtil은 인증번호의 만료시간을 위한것이고 뒤쪽에서 정리
(보내는 사람은 SMTP 설정을 했고 , 환경변수로 아이디와 비밀번호를 입력했던 그아이디를 적어주면된다)
MailController.java
MailService에서 정의한 메소드들을 사용할 Controller
//인증메일 발송 연습 api
@ResponseBody
@PostMapping("")
public BaseResponse<String> mailAuthentication (@RequestBody PostMailreq postMailreq) throws BaseException
{
if(postMailreq.getEmail() == null){
return new BaseResponse<>(BaseResponseStatus.POST_USERS_EMPTY_EMAIL);
}
if(!ValidationRegex.isRegexEmail(postMailreq.getEmail())){
return new BaseResponse<>(BaseResponseStatus.POST_USERS_INVALID_EMAIL);
}
try{
String verifyCodeId = mailService.sendCertificationMail(postMailreq.getEmail());
return new BaseResponse<>(verifyCodeId);
}
catch (BaseException baseException){
return new BaseResponse<>(baseException.getStatus());
}
}
리턴으로 코드(인증번호)값을 리턴해서 확인해본다.
포스트맨 결과 , 이메일 온거 확인
redis 구현 ( 인증번호 만료기간 정하기 위함)
이메일인증이나 휴대폰인증번호는 만료시간이 있기마련이다. ( 계속 어디다가 저장해놓을수도없으니)
redis 설치
redis -> 데이터가 키 값(key,value) 이루어진 비관계형 데이터베이스
윈도우
다음 블로그에서 따라하면된다. (마이크로소프트에서 redis 쉽게 설치하도록 제공한다고함)
압축파일 풀고 폴더내부에
redis-server.exe를 눌러서 redis 서버를 키고
redis-cli.exe를 눌르면 cmd같은창이뜨는데 거기다가 명령어 입력하면된다.
환경설정같은경우에는
redis.windows.conf 라는 파일을 메모장으로 열어 수정하면 된다.
우분투같은 경우 설치는
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install redis-server
순서로 입력하면 되고
redis 환경설정을 위한 conf 파일수정은
sudo vi /etc/redis/redis.conf
실행은
redis-server 를해주고
명령어입력창은
redis-cli
redis 백그라운드 실행
1. daemon이용
redis-server --daemonize yes
redis-cli ping -> pong이라고 뜨면 성공
2. using systemctl
sudo systemctl start redis
출처,참고,더 자세히보기
redis 정지
1. redis-cli shutdown
2. service redis stop
Ec2에서 redis를 이용하기 위한 설정
sudo vi /etc/redis/redis.conf 를 이용하여 redis 설정파일을 수정하러가서
bind 부분찾아서 -> 명령모드 /찾을검색어 -> 엔터 다음 단어 n 이전단어 N
127.0.0.1 을 0.0.0.0으로 수정해주면되고
EC2는 메모리가 작으므로
maxmemory 부분을 찾아서 500MB로 수정해주면된다.
출처,참고 , 추가적인 설정을 알고싶다면
redis를 설치했고 설정을 바꿔주고 , redis를 실행했으므로
spring에서 이용해보자
0.build.gradle에서 의존성추가
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
1. application.yml에서 환경변수 설정
spring:
redis: # redis 설정
host: 127.0.0.1 # 호스트는 로컬
port: 6379
port는 conf파일안에서 수정가능하다.
2. RedisConfig
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
}
https://jeong-pro.tistory.com/175
3. RedisUtil
@Component
@RequiredArgsConstructor
public class RedisUtil {
private final StringRedisTemplate stringRedisTemplate;
public String getData(String key) {
ValueOperations<String,String> valueOperations = stringRedisTemplate.opsForValue();
return valueOperations.get(key);
}
public void setData(String key, String value) {
ValueOperations<String,String> valueOperations = stringRedisTemplate.opsForValue();
valueOperations.set(key, value);
}
public void setDataExpire(String key, String value, long duration) {
ValueOperations<String, String> valueOperations = stringRedisTemplate.opsForValue();
Duration expireDuration = Duration.ofSeconds(duration);
valueOperations.set(key, value, expireDuration);
}
public void deleteData(String key) {
stringRedisTemplate.delete(key);
}
}
아까 Mailservice에서 JavaMailSender는 메일을 보낼때 필요한 부분이고
RedisUtil은 Redis 데이터베이스를 사용하기 위해 필요한 부분이다.
public String sendCertificationMail(String email) throws BaseException {
try{
String code = UUID.randomUUID().toString().substring(0, 6); //랜덤 인증번호 uuid를 이용!
sendMail(code,email);
redisUtil.setDataExpire(code,email,60*5L); // {key,value} 5분동안 저장.
return code;
}catch (Exception exception){
exception.printStackTrace();
throw new BaseException(BaseResponseStatus.DATABASE_ERROR);
}
}
}
MailService에서 sendCertificationMail 메소드 안에
redisUtil.setDataExpire(code,email,60*5L); // {key,value} 5분동안 저장.
이 있는데
redis 데이터베이스에 code를 key값으로 email을 value값으로 가지는 데이터를 60*5L(5분)동안 저장하라는 뜻이다.
실행결과
메일보내면 인증번호가 redis 데이터베이스에 저장되는걸 확인해보자.
redis-cli에서 명령어
keys * -> 전체 키값 조회
5분뒤
다른 redis-cli 명령어 참고 출처 추가공부
출처,참고,더알아보기
댓글