[스프링부트] 이메일 발송하기

2023. 5. 7. 23:47스프링부트 프로젝트

1, 앱 비밀번호 설정

구글 계정 - 보안 - 2단계인증 선택 후 진행

 

2.build.gradle 설정

dependencies에 추가

implementation 'org.springframework.boot:spring-boot-starter-mail' /* 이메일 전송 */

 

3. application.properties

application.properties에 아래와 같이 설정

# Mail Setting

# 이메일의 기본 인코딩 방식을 UTF-8로 설정
spring.mail.default-encoding=UTF-8	
# 이메일 발송에 사용될 SMTP 서버 호스트 주소를 설정, 구글의 SMTP 서버를 사용
spring.mail.host=smtp.gmail.com
# SMTP 서버와 통신에 사용될 포트 번호를 설정
spring.mail.port=587
#  이메일 발송에 사용될 계정의 이메일 주소를 설정
spring.mail.username= 자신 구글 계정
# 이메일 발송에 사용될 계정의 비밀번호를 설정
spring.mail.password= 2차비밀번호
# TLS 암호화를 사용하여 이메일을 전송
spring.mail.properties.mail.smtp.starttls.enable=true
# TLS 암호화를 필수로 사용
spring.mail.properties.mail.smtp.starttls.required=true
# SMTP 인증을 사용
spring.mail.properties.mail.smtp.auth=true
#  디버깅을 위한 설정으로, 이메일 발송 과정에서 발생하는 문제를 추적
spring.mail.properties.mail.debug=true
# 이메일 본문의 인코딩 방식을 UTF-8로 설정
spring.mail.properties.mail.mime.charset=UTF-8
#  이메일을 전송할 프로토콜을 SMTP로 설정
spring.mail.properties.mail.transport.protocol=smtp

 

4. MailDto

아래와 같이 MailDto.java 작성

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class MailDto {
    private String emailAddr;	// 받는 사람 
    private String emailTitle; // 메일 제목 
    private String emailContent;// 메일 내용
}

 

5. EmailService

아래와 같이 EmailService.java 작성

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import com.comverse.Iedu.domain.MailDto;

import lombok.AllArgsConstructor;

@Service
@AllArgsConstructor
public class EmailService {

	@Autowired
    private JavaMailSender emailSender;

    public void sendSimpleMessage(MailDto mailDto) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("jjh4523a@gmail.com");
        message.setTo(mailDto.getEmailAddr());
        message.setSubject("[문의사항 답변입니다] " + mailDto.getEmailTitle());
        message.setText("[문의사항 답변입니다] " + mailDto.getEmailContent());
        emailSender.send(message);
    }
}

 

6. Controller

아래와 같이 Controller.java 작성

private final EmailService emailService;

public BoardController(EmailService emailService) {
    this.emailService = emailService;
}
    
// 문의 답변 작성
@PostMapping("/addAnswer.do")
public String addAnswer(AnswerDto aDto, MailDto mailDto) {
        
    if (aDto.getStatus().equals("E")) {
        emailService.sendSimpleMessage(mailDto); // 이메일전송
    }

    return "board/questionDetail :: #answerList";
}

 

7. html

ajax로 값을 넘긴 후 email 발송 

<tr>
  <th class="text-center" scope="row">* 처리내용</th>
  <td class="" colspan="3">
    <th:block th:if="${lastAnswer.status == 'E'}">
      <span th:text="${lastAnswer.body}"></span>
      <input type="hidden" name="questionId" id="questionId" th:value="${qDto.questionId}">
    </th:block>
    <th:block th:if="${lastAnswer.status != 'E'}">
        <textarea id="answer" name="body" class="form-control" rows="3" 
        placeholder="처리내용을 입력해주세요." required></textarea>
      <input type="hidden" name="questionId" id="questionId" th:value="${qDto.questionId}">
    </th:block>
  </td>
</tr>
	// 처리내용 작성 ajax 
	function insertAnswer(event) {
	    if (!$("#answer").val()) {
	        alert("내용을 입력하세요.");
	    } else {
	        var aDto = {
	            status : $("#status").val(),
	            body : $("#answer").val(),
	            questionId : $("#questionId").val(),
	       		 emailTitle: document.getElementById('emailTitle').value,
	             emailAddr: document.getElementById('emailAddr').value,
	             emailContent: $("#answer").val()
	        };
	        showLoading(); // 로딩화면 표시

	        $.ajax({
	            url : "/board/addAnswer.do",
	            data : aDto,
	            type : 'POST',
	            success : function(result) {
	                if (aDto.status === 'E') {
	  	              alert('이메일이 발송되었습니다.');
	                   location.reload();
	                } else {
		                getAnswer();
		                $("#answer").val("");
		            }
	            },
	            error: function(error) {
		              console.error(error);
		              alert('이메일 발송에 실패하였습니다.');
		            },
	            complete: function() {
	                hideLoading(); // ajax 완료 후 로딩화면 숨기기
	            }
	        })
	    }
	}

 

 

△ 발송 결과