[Spring] 이메일 보내기 - 블로그 제작(9)

merci·2023년 2월 19일
0

블로그 제작 V1

목록 보기
9/9
post-thumbnail
post-custom-banner

https://victorydntmd.tistory.com/342
https://sundries-in-myidea.tistory.com/113
를 참고해서 정리합니다.

스프링에서 이메일 서비스를 이용하려면 이메일 발송 api를 이용해야 한다.
구글 EMAIL API를 이용해서 이메일을 보내보자.

일반적으로 이메일 발송 api는 REST API 형태로 제공된다.
REST를 지켜 HTTP요청을 하기 위해서 HTTP 클라이언트 라이브러리를 이용해야 한다.
JAVA에서는 Apache HttpClient 라이브러리 가 담당한다.

기본 설정

Gmail SMTP Server 이용해보자

SMTP ( Simple Mail Transfer Protocol)는 메일 서버에서 인터넷을 통해 보내는 전자 메일에 사용하는 전자 메일 프로토콜을 말한다.
Gmail SMTP는 무료로 누구나 사용 가능 하다.

  1. 우선적으로 구글 메일에서 보안설정을 해야 한다.

    https://myaccount.google.com/lesssecureapps 으로 가서

"보안 수준이 낮은 앱 허용: 사용"으로 변경

만약 2단계 인증을 사용중이라 위처럼 나오지 않고 아래처럼 나온다면 밑의 설명을 참고

  1. 라이브러리를 사용하기 위해서 build.gradle에 링크를 추가한다.
implementation 'org.springframework.boot:spring-boot-starter-mail'

  1. application.yml 에 메일을 보내기 위한 설정 추가
spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: 구글계정
    password: 비밀번호
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

  1. 깃헙에 올리면 내 정보가 공개 되기때문에 yml 설정은 깃에 올리지 않는다.


.gitignore 에 아래 내용 추가

### my ignore ###
src/main/resources/application.yml

구현하기

메일을 보내기 위해서 관리자 페이지에서 메일 모달을 만들었다.

테이블의 버튼을 누르면

<td>
  <button type="button" class="py-0 btn btn-primary" data-bs-toggle="modal" 
          data-bs-target="#myModal">메일 전송
  </button>
</td>

모달을 연다

    <!-- 버튼 클릭시 모달 생김 -->
    <div class="modal" id="myModal">
        <div class="modal-dialog">
            <!-- modal-sm modal-lg modal-xl 모달 사이즈 -->
            <!-- modal-dialog-centered 화면 가운데 -->
            <!-- modal-dialog-scrollable 스크롤 기능 -->
            <div class="modal-content">

                <div class="modal-header">
                    <h4 class="modal-title">Modal Heading</h4>
                    <button type="button" class="btn-close" data-bs-dismiss="modal"></button>
                </div>
                <div class="modal-body">
                    <h1>메일 발송</h1>
                    <form action="/admin/mail" method="post">
                        <input name="address" placeholder="이메일 주소" class="form-control" value=""> <br>
                        <input name="title" placeholder="제목" class="form-control"> <br>
                        <textarea name="message" placeholder="메일 내용을 입력해주세요." 
                                  cols="60" rows="20" class="form-control"></textarea>
                        <button type="submit" class="btn btn-primary mt-2">발송</button>
                    </form>
                </div>

                <div class="modal-footer">
                    <button type="button" class="btn btn-danger" data-bs-dismiss="modal">Close</button>
                </div>
            </div>
        </div>
    </div>

모달의 폼 데이터를 받는 컨트롤러는

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;

import lombok.AllArgsConstructor;
import shop.mtcoding.blog2.dto.MailDto;
import shop.mtcoding.blog2.service.MailService;

@Controller
@AllArgsConstructor
public class MailController {
    private final MailService mailService;
    
    @PostMapping("/admin/mail")
    public String execMail(MailDto mailDto) {
        mailService.mailSend(mailDto);
        return "redirect:/admin/user"; // 메일 발송시 다시 유저 관리창으로
    }
}

데이터를 받을 dto - MailDto

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class MailDto {
    private String address;
    private String title;
    private String message;
    private MultipartFile file;
}

간단한 텍스트를 발송할 경우

컨트롤러가 호출하는 서비스

import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.stereotype.Service;

import lombok.AllArgsConstructor;
import shop.mtcoding.blog2.dto.MailDto;

@Service
@AllArgsConstructor
public class MailService {
    private JavaMailSender mailSender;
    private static final String FROM_ADDRESS = "(이메일 발송시 표시될 메일 주소)";

    public void mailSend(MailDto mailDto) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setTo(mailDto.getAddress());
        message.setFrom(MailService.FROM_ADDRESS);
        message.setSubject(mailDto.getTitle());
        message.setText(mailDto.getMessage());

        mailSender.send(message);
    }
}

JavaMailSender 는 MailSender 를 상속한 인터페이스 ->public interface JavaMailSender extends MailSender

메일을 보내면 성공적으로 발송 된다.

2단계 인증 에러 !

익셉션 처리를 하지 않고 테스트를 해봤는데 다음같은 에러페이지가 발생했다.
발생한 이유는 보안 인증을 "보안 수준이 낮은 앱 허용: 사용" 으로 바꾸려고 했는데 아무것도 없어서 패스했기 때문 !

Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535-5.7.8... 에러가 발생한다면 인증설정을 해줘야 한다.

여기를 눌러서 아래 설정을 켜줘야 하는데


2단계 인증을 이용하고 있다면 해당 설정을 할 수가 없다. 추가 설정을 해줘야 한다.

계정으로 이동해서 보안을 선택한다.

로그인 정보에서 앱 비밀번호를 선택한다.

로그인을 한번 더 한 뒤에 아래 설정을 메일 + windows 컴퓨터 로 설정후 생성을 누른다.

2단계 인증없이 메일에 접근할 수 있는 비밀번호를 받게 된다.

복사한 비밀번호를 application.yml의 설정으로가 넣는다.

다시 이메일을 보낸다면 성공적으로 발송된다.

profile
작은것부터
post-custom-banner

0개의 댓글