이 글은 Spring Boot를 사용하여 Gmail의 SMTP로 나에게 메일을 전송하는 코드를 다루고 있습니다.
Spring Boot 프로젝트의 application.properties의 설정에 들어갈 앱 비밀번호를 생성합니다.
앱 비밀번호란 차단된 앱이나 기기가 Google 계정에 액세스할 수 있도록 권한을 부여하는 것으로 일반 계정 비밀번호와는 다른 개념입니다.
2단계 인증이 사용 설정된 계정에서만 생성되며 만약 앱 비밀번호를 생성한 Google 계정 비밀번호를 변경하면 앱 비밀번호가 취소되니 참고해주세요.
다른 영상이나 글들에서는 단계별로 차근히 설명해주시지만 저같은 경우 앱 비밀번호가 "Google 계정 관리 > 보안"탭에서 보이지 않아 애를 먹은 경헙이 있습니다.
몇 번의 실패 후
위의 링크를 앱 비밀번호를 생성하고 싶은 계정으로 크롬 접속을 한 뒤 붙여넣어주면 바로 해당 계정의 "앱 비밀번호" 탭으로 넘어갈 수 있었습니다.
앱 비밀번호를 생성하면 단 한 번만 보여주니 미리 메모장같은 곳에 붙여넣어주시길 바랍니다.
Spring Boot는 'Spring Initializer'라는 것으로 프로젝트를 생성합니다.
위의 링크를 클릭하여 아래 사진과 동일하게 세팅 후 'GENERATE'를 눌러 프로젝트 zip 파일을 다운로드받아줍니다.
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
로 작성합니다.
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을 찾아서 자동으로 주입(생성)합니다.setFrom
: 메일을 보내는 주체setTo
: 메일을 받는 대상setText
: 메일의 본문 텍스트setSubject
: 메일의 제목 부분send
: 위의 네 가지 속성을 가진 메일 객체를 실제로 전송하는 메서드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에 들어갔을 때 내가 나에게 보낸 메일을 볼 수 있게 됩니다.