1) 구글 계정으로 접속 후 로그인.
: https://myaccount.google.com/
2) [ 보안 ] > [ Google에 로그인 ] > [ 2단계 인증 ]을 클릭 후 등록.
: https://myaccount.google.com/signinoptions/two-step-verification
3) [ 보안 ] > [ Google에 로그인 ] > [ 앱 비밀번호 ]을 클릭.
: https://myaccount.google.com/apppasswords
4) 앱 비밀번호를 생성할 앱 및 기기를 선택.
: [ 앱 선택 ]은 '메일'을 선택.
: [ 기기 선택 ]은 아무거나 선택.
5) 생성 클릭
: 발급된 패스워드가 팝업에 패스워드가 발급되며
: 발급 받은 패스워드는 따로 저장. <--------- 코드에서 사용
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.3.24</version>
</dependency>
<!-- Java Mail API -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
package com.example.demo;
import java.util.Properties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSenderImpl;
@Configuration
public class SpringConfig {
@Bean
public JavaMailSenderImpl javaMailSender() {
JavaMailSenderImpl r = new JavaMailSenderImpl();
r.setHost("smtp.gmail.com");
r.setPort(587);
r.setUsername(""); // gmail계정을 설정합니다.
r.setPassword(""); // <--- 발행된 암호를 여기에 넣어 주세요.
r.setDefaultEncoding("UTF-8");
Properties prop = new Properties();
prop.put("mail.smtp.starttls.enable", true);
prop.put("mail.smtp.auth", true);
prop.put("mail.smtp.ssl.checkserveridentity", true);
prop.put("mail.smtp.ssl.trust","*");
prop.put("mail.smtp.ssl.protocols", "TLSv1.2");
r.setJavaMailProperties(prop);
return r;
}
}
@Controller
public class MailController {
//이메일을 보내기 위해 필요한 MailSender 객체를 멤버변수로 생성
@Autowired
private MailSender mailSender;
public void setMailSender(MailSender mailSender) {
this.mailSender = mailSender;
}
@RequestMapping("/mail")
@ResponseBody
public String mail(String code) {
SimpleMailMessage mailMessage=new SimpleMailMessage();
mailMessage.setFrom("kgukgu33@gmail.com");
mailMessage.setTo("kgukgu33@gmail.com");
mailMessage.setSubject("이메일 인증 코드");
mailMessage.setText("인증 코드: "+code);
try {
mailSender.send(mailMessage);
}catch(Exception e) {
e.getStackTrace();
System.out.println("예외발생: "+e.getMessage());
}
return "OK";
}
}
❓ @RestController:
controller와 responseBody가 합쳐진 것
view로 가는 게 아니라 브라우저에 데이터를 바로 응답함.
package com.example.demo.controller;
import javax.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.Setter;
@RestController
@Setter
public class HtmlMailController {
@Autowired
private JavaMailSender mailSender;
@GetMapping("/sendMailHtml")
public String sendMailHtml() {
//HTML 형태의 이메일을 발송하려면 MimeMessagePreparator 객체가 필요하다. 익명으로 생성
mailSender.send(new MimeMessagePreparator() {
@Override
public void prepare(MimeMessage mimeMessage) throws Exception {
String str="<h2>회원가입 성공</h2>";
str+="<img src='cid:ball'>";
MimeMessageHelper helper=new MimeMessageHelper(mimeMessage, true, "UTF-8");
helper.setFrom("kgukgu33@gmail.com");
helper.setTo("kgukgu33@gmail.com");
helper.setSubject("html형태의 이메일 이미지 첨부파일");
helper.setText(str,true);
helper.addInline("ball", new ClassPathResource("img/ball1.jpg"));
helper.addAttachment("hello.txt", new ClassPathResource("doc/hello.txt"));
}
});
return "OK";
}
}
package com.example.demo.controller;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import kr.co.youiwe.webservice.BitSms;
@RestController
public class VerificationController {
@Autowired
private MailSender mailSender;
public void setMailSender(MailSender mailSender) {
this.mailSender = mailSender;
}
@Autowired
private BitSms sms;
public void setSms(BitSms sms) {
this.sms = sms;
}
//to: 인증번호 보낼 이메일주소/휴대폰 번호
//verifType: 이메일/휴대폰 중 어떤 인증타입인지
@GetMapping("/sendVerifCode")
public String verif(String to, String verifType) {
//랜덤 코드 생성
String code="";
Random r=new Random();
code+=r.nextInt(10);
code+=r.nextInt(10);
code+=r.nextInt(10);
code+=r.nextInt(10);
//이메일로 보내기
if(verifType.equals("email")) {
SimpleMailMessage mailMessage=new SimpleMailMessage();
mailMessage.setFrom("kgukgu33@gmail.com");
mailMessage.setTo(to);
mailMessage.setSubject("인증코드 전송");
mailMessage.setText("인증코드: "+code);
try {
mailSender.send(mailMessage);
}catch(Exception e) {
System.out.println(e.getMessage());
}
//문자로 보내기
}else {
sms.sendMsg("01025598279", to, "인증코드: "+code);
}
return code;
}
}
코드를 이메일/휴대폰번호로 보내고 보낸 code를 리턴해서 view페이지에서 보낸 코드가 무엇인지 확인할 수 있게 함.