개발 하나둘셋/Java & Spring

SpringBoot SMTP서버를 활용한 메일 보내기

유리코딩 2022. 6. 7. 16:30
반응형

개발꿀팁

SMTP서버를 활용한 메일 보내기

 

 

프로젝트 중 단체메일 보내기, 문의사항이 있을 시 답변 메일을 보내는 형태의 메일보내기가 필요했다. springboot에서 메일전송 시 가장 무난하게 쓰이는 SMTP를 사용했고, 공용메일로 구글메일을 사용하고 있어 지메일을 활용했다.

 

1. 준비

build.gradle

build.gradle에 dependencies를 아래와 같이 추가한다.

implementation "org.springframework.boot:spring-boot-starter-mail"

 

2.  코드 구현

application.yml

SMTP 서버를 설정해야 한다. 나는 yml을 사용하여 세팅하였다.

username의 경우 '@gamil.com'을 제외한 아이디만을 적어야 한다.

spring:
  mail:
    host: smtp.gmail.com
    port: 587
    username: {YOUR_GMAIL_ADDRESS}
    password: {YOUR_GMAIL_PASSWORD}
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true

 

발신할 때 사용하는 SMTP 서버 설정 정보와 메일수신 시 사용하는 서버정보이다.

 

3.  간단한 메일 보내기 - SimpleMailMessage

MailRequestDto

메일을 발송할 때 필요한 정보를 Dto로 받아준다.

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

@Getter
@Setter
@NoArgsConstructor
public class MailRequestDto {
    private String sender;  //보내는사람
    private String email;  //받는사람
    private String title;  //제목
    private String cont;  //내용
}

 

Controller

위에 작성한 Dto를 @RequestBody로 받는다.

@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class MailController {

    private final MailService mailService;
    
    @PostMapping("/mail")
    public void mail (@RequestBody MailRequestDto mailDto,
    ) throws MessagingException {
        mailService.answerMail(mailDto);
    }
}

 

Service

간단한 text 형태의 메일은 SimpleMailMessage를 사용하여 작성할 수 있다.

< Spring 프레임 워크에서 Java 메일 지원을위한 인터페이스 및 클래스 >

  1. MailSender: 기본 이메일 전송 기능을 제공하는 최상위 인터페이스
  2. JavaMailSender: MIME 메시지(첨부 파일, HTML 이메일 등)까지 지원하는 확장된 인터페이스
  3. JavaMailSenderImpl: 실제 구현체
  4. SimpleMailMessage: 텍스트 기반 이메일 생성에 사용
  5. MimeMessageHelper: HTML 및 첨부 파일 포함 이메일 생성에 도움
  6. MimeMessagePreparator: MIME 메시지 생성을 쉽게 할 수 있도록 돕는 콜백 인터페이스

 

받는 사람의 경우 배열로 받는다. 단체메일 등을 보낼 때 참고하면 좋을 것 같다.

@Service
@Transactional
@AllArgsConstructor
public class MailService {

    private final InquiryRepository inquiryRepository;
    private JavaMailSender mailSender;

	public void answerMail(mailRequestDto mailDto) throws MessagingException {

        // 메일 보내기
        try {
            SimpleMailMessage message = new SimpleMailMessage();
            message.setFrom(mailDto.getSender());  // 보내는 사람
            message.setTo(mailDto.getEmail());  // 받는 사람 String[] to
            message.setSubject(mailDto.getTitle());  // 제목
            message.setText(mailDto.getCont());  // 내용

            mailSender.send(message);
        } catch (MailException exception) {
            throw new ApiException(ErrorCode.INVALID_EMAIL);
        }
    }
}

 

처음 try-catch를 사용하지 않고 코드를 작성하였을 때 아래와 같은 오류가 발생했었는데, 받는사람의 메일이 올바르지 않을 때 발생한다.  try-catch를 통해 예외처리를 해주면 더이상 오류가 발생하지 않는다.

 

 

 

모든게 완벽하게 작성되었다면 빌드 시 아래와 같은 에러메세지가 뜨는데 연결한 구글 계정의 2단계 인증이 필요하기 때문이다.

아래 절차에 따라 2단계인증을 하면 문제없이 메일이 발송된다. 

 

3. 테스트

포스트맨에서 테스트를 하면 아래와 같은 결과가 나온다. 

 

 

 

<참고>

https://victorydntmd.tistory.com/342

https://memo-the-day.tistory.com/35

반응형