📌 고정 게시글

📢 공지합니다

이 게시글은 메인 페이지에 항상 고정되어 표시됩니다.

최코딩의 개발

스프링 메일 보내기 (네이버, 구글) 본문

개발 팁

스프링 메일 보내기 (네이버, 구글)

seung_ho_choi.s 2024. 5. 7. 16:41
728x90

이번시간에는 필자가 개발을 하면서 스프링을 통해 네이버와 구글로 메일로 보내는 법을 소개 할 것입니다~ 

 

네이버

네이버는 앞서 2단계 보안이 해지된채로 설정을 해줘야됩니다. 만약 이과정이 번거로우시면 

새계정을 파시는것을 추천드립니다.

 

네이버 환경설정 - POP3/IMAP 설정에 들어와서 다음과 같이 해줍니다. 

그 후 바로 아래에 아이디, 비밀번호, SMTP 서버명, SMTP 포트 번호를 기억해둡시다. 

 

이렇게 하면 세팅이 다 됐습니다! 이제 인텔리제이로 들어가서 작업을 해줘야 됩니다. 

 

1. Gradle 작업

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

 

메일 의존관계를 위해 Gradle에 다음과 같이 추가를 해줍니다. 현재 2024년 5월 7일 기준으로 최신 버전은 3.2.5입니다.

2. Congfig

@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을 수동으로 등록해야지 사용할 수 있습니다.  왜냐하면 설정정보를 추가하기 위해서입니다.

 

3. MailService

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를 동시에 하고 싶으시면 빈 이름을 따로 저장하여 실행시켜야 됩니다. 

자세한건 아래 블로그 참고!

https://balhae.tistory.com/37

 

[10편] 조회 대상 빈이 2개 이상일때

개요: component를 붙여서 똑같은 타입의 조회빈이 2개 이상일 때 해결방법은 작성했다. 다음과 같이 똑같은 타입인데 둘다 @Component 를 붙일시 오류가 뜬다 해결방법은 아래와 같다. @Autowired 오른쪽

balhae.tistory.com

 

이상입니다!!! 

 

안되시는거 있으시면 댓글 부탁드립니다~~~~

728x90