[SpringBoot] Gmail SMTP로 간단한 텍스트 메일을 전송해보자

Haeun Noh·2024년 5월 26일
0

Spring & SpringBoot3

목록 보기
4/5
post-thumbnail

0526

이 글은 Spring Boot를 사용하여 Gmail의 SMTP로 나에게 메일을 전송하는 코드를 다루고 있습니다.


🔐 Gmail 앱 비밀번호 생성

Spring Boot 프로젝트의 application.properties의 설정에 들어갈 앱 비밀번호를 생성합니다.

앱 비밀번호란 차단된 앱이나 기기가 Google 계정에 액세스할 수 있도록 권한을 부여하는 것으로 일반 계정 비밀번호와는 다른 개념입니다.

2단계 인증이 사용 설정된 계정에서만 생성되며 만약 앱 비밀번호를 생성한 Google 계정 비밀번호를 변경하면 앱 비밀번호가 취소되니 참고해주세요.


다른 영상이나 글들에서는 단계별로 차근히 설명해주시지만 저같은 경우 앱 비밀번호가 "Google 계정 관리 > 보안"탭에서 보이지 않아 애를 먹은 경헙이 있습니다.

몇 번의 실패 후

위의 링크를 앱 비밀번호를 생성하고 싶은 계정으로 크롬 접속을 한 뒤 붙여넣어주면 바로 해당 계정의 "앱 비밀번호" 탭으로 넘어갈 수 있었습니다.

  1. App name: 앱 비밀번호를 나타내기 위한 이름
  2. Create: 클릭 시 'App name'의 이름을 가진 앱 비밀번호가 생성됩니다.

앱 비밀번호를 생성하면 단 한 번만 보여주니 미리 메모장같은 곳에 붙여넣어주시길 바랍니다.

  • 앱 비밀번호 생성 후 "보안 수준이 낮은 앱의 엑세스"를 "허용"으로 변경해주셔야합니다.

🗂️ Spring Boot 프로젝트 생성

Spring Boot는 'Spring Initializer'라는 것으로 프로젝트를 생성합니다.

위의 링크를 클릭하여 아래 사진과 동일하게 세팅 후 'GENERATE'를 눌러 프로젝트 zip 파일을 다운로드받아줍니다.

  • Artifact: 당신이 만들 프로젝트명을 입력해줍니다.
  • ADD DEPENDENCIES: 의존성을 추가합니다.
    - Spring Boot DevTools: 코드를 업데이트했을 때 저장만으로 Server Rerun을 할 수 있습니다.
    • Spring Web
    • Lombok: 어노테이션을 사용할 수 있습니다.

⚙️ application.properties 설정

  • IDE: IntelliJ (Gradle)
  • version: java 17

Gmail SMTP를 사용하기 위해서 application.properties에 어떠한 설정을 추가해야 합니다.

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=<앱비밀번호를생성한계정@gmail.com>
spring.mail.password=<공백없는앱비밀번호>
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

앱 비밀번호는 aaaa aaaa aaaa aaaa 이런 식으로 주어지게 되는데 password에서는 공백없이 aaaaaaaaaaaaaaaa로 작성합니다.


📬 EmailSenderService 생성

Gmail을 전송하기 위한 sendMail()를 작성하겠습니다.

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

@Service
public class EmailSenderService {
    @Autowired
    private JavaMailSender mailSender;

    public void sendMail(String toEmail,
                         String subject,
                         String body) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("자신의메일주소@gmail.com");
        message.setTo(toEmail);
        message.setText(body);
        message.setSubject(subject);

        mailSender.send(message);

        System.out.println("Mail Sent Successfully...");
    }
}

🧩 어노테이션 (@)

  • @Service : 비즈니스 로직을 처리하는 Service 클래스에 적용되며 해당 클래스를 스프링의 Bean에 등록합니다.
  • @Autowired : DI(의존성 자동 주입)를 수행하는 데 사용되며 여기서는 스프링 컨테이너가 JavaMailSender의 Bean을 찾아서 자동으로 주입(생성)합니다.

👩‍💻 sendMail()

  • setFrom : 메일을 보내는 주체
  • setTo : 메일을 받는 대상
  • setText : 메일의 본문 텍스트
  • setSubject : 메일의 제목 부분
  • send : 위의 네 가지 속성을 가진 메일 객체를 실제로 전송하는 메서드

👀 Application에 EventListener 생성

SpringBoot 서버가 실행될 때 메일을 보내는 메서드인 sendMail가 실행되도록 EventListener를 설정해줄 것입니다.

import com.example.egudanna.email.EmailSenderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.event.EventListener;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;


@EnableJpaAuditing
@SpringBootApplication
public class EgudannaApplication {
	@Autowired
	private EmailSenderService senderService;

	public static void main(String[] args) {
		SpringApplication.run(EgudannaApplication.class, args);
	}

	@EventListener(ApplicationReadyEvent.class)
	public void sendMail() {
		senderService.sendMail("자신의메일주소@gmail.com",
				"This is Subject",
				"This is Body of Email");
	}
}
  • @EventListener : 위 코드의 경우 이 어노테이션을 달면 Spring Boot 서버가 정상적으로 실행되었을 때(ApplicationReadyEvent) sendMail()를 실행합니다.
  • sendMail : 만들어둔 메서드에 각각 '메일을 전송하는 사람', '메일의 제목', '메일 안에 들어갈 text'의 값을 전달합니다.

🎯 나에게 메일을 전송해보자!

이렇게 작성한 Spring Boot 서버를 실행시키면 콘솔에 "Mail Sent Successfully..."가 출력됩니다.

이런 메시지가 출력되면 메일이 정상적으로 전송되었다는 뜻이며 자신의 gmail에 들어갔을 때 내가 나에게 보낸 메일을 볼 수 있게 됩니다.


profile
기록의 힘을 믿는 개발자, 노하은입니다!

0개의 댓글