📢 공지합니다
이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.
이번시간에는 필자가 개발을 하면서 스프링을 통해 네이버와 구글로 메일로 보내는 법을 소개 할 것입니다~
네이버는 앞서 2단계 보안이 해지된채로 설정을 해줘야됩니다. 만약 이과정이 번거로우시면
새계정을 파시는것을 추천드립니다.
네이버 환경설정 - POP3/IMAP 설정에 들어와서 다음과 같이 해줍니다.
그 후 바로 아래에 아이디, 비밀번호, SMTP 서버명, SMTP 포트 번호를 기억해둡시다.
이렇게 하면 세팅이 다 됐습니다! 이제 인텔리제이로 들어가서 작업을 해줘야 됩니다.
implementation 'org.springframework.boot:spring-boot-starter-mail:3.2.5'
메일 의존관계를 위해 Gradle에 다음과 같이 추가를 해줍니다. 현재 2024년 5월 7일 기준으로 최신 버전은 3.2.5입니다.
@Configuration
public class NaverMailConfig {
@Bean
public JavaMailSender javaMailService() {
JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();
javaMailSender.setHost("smtp.naver.com"); // 메인 도메인 서버 주소 => 정확히는 smtp 서버 주소
javaMailSender.setUsername(); // 네이버 아이디
javaMailSender.setPassword(); // 네이버 비밀번호
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"); // smtp 인증
properties.setProperty("mail.smtp.starttls.enable", "true"); // smtp strattles 사용
properties.setProperty("mail.debug", "true"); // 디버그 사용
properties.setProperty("mail.smtp.ssl.trust","smtp.naver.com"); // ssl 인증 서버는 smtp.naver.com
properties.setProperty("mail.smtp.ssl.enable","true"); // ssl 사용
return properties;
}
}
- Config 클래스를 만들어 위와 같이 코드를 작성하면 됩니다.
- ⭐ 중요⭐ 이때 주석에서 보듯이 아이디 및 비번은 앞서 환경설정에 확인한 계정으로 넣어야됩니다!!!
- JavaMailSender @Bean을 수동으로 등록해야지 사용할 수 있습니다. 왜냐하면 설정정보를 추가하기 위해서입니다.
package amcn.amcn.mail;
import amcn.amcn.member.domain.member.Member;
import amcn.amcn.member.repository.MemberRepository;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.InternetAddress;
import jakarta.mail.internet.MimeMessage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;
import java.io.UnsupportedEncodingException;
import java.util.Optional;
import java.util.Random;
@Service
@Slf4j
@RequiredArgsConstructor
public class NaverMailPasswordService {
private final JavaMailSender emailsender;
private String ePw; // 인증번호
// 메일 내용 작성
public MimeMessage createMessage(String to) throws MessagingException, UnsupportedEncodingException, MessagingException {
MimeMessage message = emailsender.createMimeMessage();
message.addRecipients(MimeMessage.RecipientType.TO, to);// 보내는 대상
message.setSubject("AMCN 비밀번호 찾기");// 제목
String msgg = "";
msgg += "<div style='margin:100px;'>";
msgg += "<h1> 안녕하세요</h1>";
msgg += "<h1> 카드뉴스 자동제작 AMCN 입니다</h1>";
msgg += "<br>";
msgg += "<p>아래 코드는 당신의 임시 비밀번호 입니다.<p>";
msgg += "<br>";
msgg += "<p>임시 비밀번호를 활용하여 로그인 후 마이페이지에 들어가서 비밀번호 변경 부탁드립니다. 감사합니다!<p>";
msgg += "<br>";
msgg += "<div align='center' style='border:1px solid black; font-family:verdana';>";
msgg += "<h3 style='color:blue;'>당신의 임시 비밀번호 입니다.</h3>";
msgg += "<div style='font-size:130%; color:red;'>";
msgg += "비밀번호 : <strong>";
msgg += ePw + "</strong><div><br/> "; // 메일에 인증번호 넣기
msgg += "</div>";
message.setText(msgg, "utf-8", "html");// 내용, charset 타입, subtype
// 보내는 사람의 이메일 주소, 보내는 사람 이름
message.setFrom(new InternetAddress(, "AMCN"));// 보내는 사람, 빈칸은 본인 메일 주소
return message;
}
// 랜덤 인증 코드 전송
public String createKey(Member member) {
StringBuffer key = new StringBuffer();
Random rnd = new Random();
for (int i = 0; i < 8; i++) { // 인증코드 8자리
int index = rnd.nextInt(3); // 0~2 까지 랜덤, rnd 값에 따라서 아래 switch 문이 실행됨
switch (index) {
case 0:
key.append((char) ((int) (rnd.nextInt(26)) + 97));
// a~z (ex. 1+97=98 => (char)98 = 'b')
break;
case 1:
key.append((char) ((int) (rnd.nextInt(26)) + 65));
// A~Z
break;
case 2:
key.append((rnd.nextInt(10)));
// 0~9
break;
}
}
return key.toString();
}
// 메일 발송
// sendSimpleMessage 의 매개변수로 들어온 to 는 곧 이메일 주소가 되고,
// MimeMessage 객체 안에 내가 전송할 메일의 내용을 담는다.
// 그리고 bean 으로 등록해둔 javaMail 객체를 사용해서 이메일 send!!
public String sendSimpleMessage(Member member) throws Exception {
ePw = createKey(member); // 랜덤 인증번호 생성
// TODO Auto-generated method stub
MimeMessage message = createMessage(member.getEmail()); // 메일 발송
try {// 예외처리
emailsender.send(message);
} catch (MailException es) {
es.printStackTrace();
throw new IllegalArgumentException();
}
return ePw; // 메일로 보냈던 인증 코드를 서버로 반환
}
}
- 위와 같이 MailService 클래스를 따로 만들어 다음과 같이 작성을 하면됩니다.
- ⭐중요⭐이때 빈칸에는 본인 메일 주소를 적어야 됩니다.
- createMessage 메소드에서는 메일 형식을 바꿀 수 있습니다. 본인 스타일에 맞게 꾸미시면 됩니다. 참고로 저는 서블릿으로 꾸몄어요!!
이렇게 하면 설정이 완료됐습니다. 실제 프로젝트에 적용하면서 보여드리겠습니다.
@GetMapping("/email-auth")
public String getEmail(
Model model,
@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false)
Member loginMember) throws Exception {
Optional<Member> findMember = memberRepository.findMemberId(loginMember.getMemberId());
if (findMember.isPresent()) {
Member member1 = findMember.get();
String authPassword = mailService.sendSimpleMessage(member1.getEmail());
loginMember.setAuthPassword(authPassword);
Member member = new Member();
model.addAttribute("member", member);
} else {
return null;
}
return "email/email";
}
여기는 이메일 컨트롤러입니다. 코드를 자세히 보시면
String authPassword = mailService.sendSimpleMessage(member1.getEmail());
이 코드가 있는제 즉 url로 email-auth로 들어오면 위 코드가 실행되어 본인 계정의 이메일로 메시지가 날라갑니다.
자 한번 사진을 보겠습니다!
제 프로젝트 입니다. 여기서 이 회원은 메일이 chltmdgh517@naver.com이고
이메일 인증을 누르면
email-auth로 들어오게 됩니다. 즉 이 창에 들어오면 메일이 전송됩니다.
그럼 실제 chltmdgh517@naver.com으로 메일이 왔나 확인해볼까요??
놀랍게도 초기에 설정한 아이디로 발송된 메일이 온것을 확인할 수 있습니다.
이로써 스프링을 통해 네이버 메일로 전송하는 법을 알았습니다.
이제 구글 계정으로 메일보내는 법을 알려드리겠습니다.
구글은 먼저 2단계 보안까지 해줘야됩니다.
위 사진과 같이 계정설정에서 보안을 클릭하여 앱 비밀번호를 생성합니다. 총 16자리 나오는데 기억해두셔야됩니다!!!!
그 후 Gmail로 들어가서 전달 및 POP/IMAP를 누르고 위 그림과 같이 설정을 해둡니다!!
그럼 앞서 코드에서 빈칸으로 납둔 아이디하고 비밀번호, 이메일 계정만 구글 계정에 맞게 변화시키면 끝입니다!!!
참고로 naver랑 gogle config를 동시에 하고 싶으시면 빈 이름을 따로 저장하여 실행시켜야 됩니다.
자세한건 아래 블로그 참고!
[10편] 조회 대상 빈이 2개 이상일때
개요: component를 붙여서 똑같은 타입의 조회빈이 2개 이상일 때 해결방법은 작성했다. 다음과 같이 똑같은 타입인데 둘다 @Component 를 붙일시 오류가 뜬다 해결방법은 아래와 같다. @Autowired 오른쪽
balhae.tistory.com
이상입니다!!!
안되시는거 있으시면 댓글 부탁드립니다~~~~
스프링 소셜 로그인 구현하기(네이버, 카카오, OAuth2.0) (0) | 2024.07.09 |
---|---|
스프링과 파이썬 스크립트 연결(TTS 만들기) (0) | 2024.06.11 |
스프링과 Open AI DALL-E-3 API 연결 (0) | 2024.05.30 |
KoBart 모델을 활용한 요약 모델 만들기 (1) | 2024.05.30 |
스프링 & AJAX를 활용한 실시간 메일 인증 (1) | 2024.05.15 |