[Spring Boot] 이메일 보내기

고운·2023년 5월 23일
0

Spring Boot

목록 보기
12/13
post-custom-banner

구글 설정

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) 생성 클릭
   : 발급된 패스워드가 팝업에 패스워드가 발급되며
   : 발급 받은 패스워드는 따로 저장.                           <--------- 코드에서 사용

pom.xml

<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>

SpringConfig

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;
	}
	
}

EmailController

@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로 가는 게 아니라 브라우저에 데이터를 바로 응답함.

HTML, 첨부파일 있는 메일 보내기

(참고: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/mail/javamail/MimeMessageHelper.html)

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";
	}
}

인증코드 보내기

Controller (Ajax로 활용)

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페이지에서 보낸 코드가 무엇인지 확인할 수 있게 함.

profile
백엔드 개발자
post-custom-banner

0개의 댓글