상세 컨텐츠

본문 제목

gmail SMTP를 사용한 회원가입 이메일인증

Spring/SMTP

by Chan.94 2021. 9. 20. 09:31

본문

반응형

SMTP란

SMTP는 Simple Mail Transfer Protocol의 약자로, 인터넷에서 이메일을 보내기 위해 사용되는 프로토콜이다. 

SMTP는 이메일 클라이언트나 다른 SMTP 서버로부터 이메일을 수신하는 메일 서버로 이메일을 전송하는 데 사용된다.


gmail 설정

(1) 2단계 인증 사용설정

 

(2) 앱 비밀번호 생성 (yml의 비밀번호가 됨)

 

pom.xml

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-mail</artifactId>
</dependency>

 

application.yml

spring:
  mail:
    smtp:
      auth: true
      starttls:
        enable: true
        required: true
    transport:
      protocol: smtp
    host: smtp.gmail.com
    port: 587
    username: 아이디    #gmail ID
    password: 비밀번호  #gmail 앱 비밀번호

 

MailConfiguration.java

@Configuration
public class MailConfiguration {
    
    @Value("${spring.mail.smtp.auth}")
    private String smtpAuth;
    
    @Value("${spring.mail.transport.protocol}")
    private String transportProtocol;
    
    @Value("${spring.mail.smtp.starttls.enable}")
    private String smtpStarttlsEnable;
    
    @Value("${spring.mail.smtp.starttls.required}")
    private String smtpStarttlsRequired;
    
    @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;
    
    @Bean
    public JavaMailSender javaMailSender(){
        JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl();

        javaMailSender.setHost(host);              // SMTP 서버명
        javaMailSender.setUsername(username);     // 아이디
        javaMailSender.setPassword(password);     // 비밀번호
        javaMailSender.setPort(port);             // SMTP 포트
        javaMailSender.setDefaultEncoding("UTF-8");
        javaMailSender.setJavaMailProperties(this.getMailProperties());

        return javaMailSender;
    }

    private Properties getMailProperties(){
        Properties properties = new Properties();
        properties.setProperty("mail.smtp.auth", smtpAuth);                         // SMTP 인증
        properties.setProperty("mail.transport.protocol", transportProtocol);         // 프로토콜 설정
        properties.setProperty("mail.smtp.starttls.enable", smtpStarttlsEnable);    // SMTP strattles 사용
        properties.setProperty("mail.smtp.starttls.required", smtpStarttlsRequired);

        return properties;
    }
}

 

STARTTLS는 기존의 안전하지 않은 연결의 위험을 줄이고 SSL/TLS이 쓰이는 안전한 연결로 업그레이드하도록 도와준다.


 

MailUtils.java

public class MailUtils {
    private JavaMailSender mailSender;
    private MimeMessage message;
    private MimeMessageHelper messageHelper;

    public MailUtils(JavaMailSender mailSender) throws MessagingException {
        this.mailSender = mailSender;
        message = this.mailSender.createMimeMessage();
        messageHelper = new MimeMessageHelper(message, true, "UTF-8");
    }

    public void setSubject(String subject) throws MessagingException {
        messageHelper.setSubject(subject);
    }

    public void setText(String htmlContent) throws MessagingException {
        messageHelper.setText(htmlContent, true);
    }

    public void setFrom(String email, String name) throws UnsupportedEncodingException, MessagingException {
        messageHelper.setFrom(email, name);
    }

    public void setTo(String email) throws MessagingException {
        messageHelper.setTo(email);
    }

    public void send() {
        mailSender.send(message);
    }	
}

테스트

@RequestMapping("/devlog/mail")
@RestController
@RequiredArgsConstructor
public class SmtpTestController {

    private final JavaMailSender javaMailSender;
	
    @Value("${spring.mail.username}")
    private String mailUsername;
    
    @PostMapping(value = "/generatekey-send", produces = MediaType.APPLICATION_JSON_VALUE)
    public void send(String targetEmail) throws Exception{
        String sAuthCode = UUID.randomUUID().toString();
        
        MailUtils sendMail = new MailUtils(javaMailSender);
        sendMail.setSubject("이메일 인증");
        String msg = "";
        msg += "<h1>안녕하세요</h1>";
        msg += "<br>";
        msg += "<p>아래 인증코드를 페이지에 입력해주세요</p>";
        msg += "<br>";
        msg += "<br>";
        msg += "<div align='center' style='border:1px solid black'>";
        msg += "<h3 style='color:blue'>인증코드 입니다</h3>";
        msg += "<div style='font-size:130%'>";
        msg += "<strong>" + sAuthCode + "</strong></div><br/>" ;
        msg += "</div>";

        sendMail.setText(msg);
        sendMail.setFrom(mailUsername, "DevLog");
        sendMail.setTo(targetEmail);
        sendMail.send();
    }
}

 

 

 

반응형

댓글 영역

>