1. 개요

이 기사에서는 일반 바닐라 Spring 애플리케이션과 Spring Boot 애플리케이션 (전자는 JavaMail 라이브러리를 사용하고 후자는 spring-boot-starter-mail 의존성을 사용하는) 에서 이메일을 보내는 데 필요한 단계를 살펴 보겠습니다. .

2. Maven 의존성

먼저 pom.xml에 의존성을 추가해야합니다 .

2.1. Spring

일반 vanilla Spring 프레임 워크에서 사용하기 위해 다음을 추가합니다.

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context-support</artifactId>
    <version>5.2.8.RELEASE</version>
</dependency>

최신 버전은 여기 에서 찾을 수 있습니다 .

2.2. Spring 부팅

그리고 Spring Boot의 경우 :

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>

최신 버전은 Maven Central 저장소 에서 사용할 수 있습니다 .

3. 메일 서버 속성

Spring 프레임 워크에서 Java 메일 지원을위한 인터페이스 및 클래스는 다음과 같이 구성됩니다.

  1. MailSender 인터페이스 : 간단한 이메일 전송을위한 기본 기능을 제공하는 최상위 인터페이스
  2. JavaMailSender 인터페이스 : 위 MailSender 의 하위 인터페이스. 이 MIME 메시지를 지원하는 대부분과 함께 사용 MimeMessageHelper의 (A)의 생성을위한 클래스 의 MimeMessage . 이 인터페이스와 함께 MimeMessagePreparator 메커니즘을 사용하는 것이 좋습니다.
  3. JavaMailSenderImpl 클래스 : JavaMailSender 인터페이스의 구현을 제공합니다. MimeMessage SimpleMailMessage를 지원합니다.
  4. SimpleMailMessage 클래스 : 보낸 사람,받는 사람, 참조, 제목 및 텍스트 필드를 포함하는 간단한 메일 메시지를 만드는 데 사용됩니다.
  5. MimeMessagePreparator 인터페이스 : MIME 메시지 준비를위한 콜백 인터페이스 제공
  6. MimeMessageHelper 클래스 : MIME 메시지 생성을위한 도우미 클래스입니다. HTML 레이아웃의 이미지, 일반적인 메일 첨부 파일 및 텍스트 콘텐츠에 대한 지원을 제공합니다.

다음 섹션에서는 이러한 인터페이스와 클래스가 사용되는 방법을 보여줍니다.

3.1. 스프링 메일 서버 속성

예를 들어 SMTP 서버를 지정하는 데 필요한 메일 속성은 JavaMailSenderImpl을 사용하여 정의 할 수 있습니다 .

예를 들어 Gmail의 경우 다음과 같이 구성 할 수 있습니다.

@Bean
public JavaMailSender getJavaMailSender() {
    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
    mailSender.setHost("smtp.gmail.com");
    mailSender.setPort(587);
    
    mailSender.setUsername("my.gmail@gmail.com");
    mailSender.setPassword("password");
    
    Properties props = mailSender.getJavaMailProperties();
    props.put("mail.transport.protocol", "smtp");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.starttls.enable", "true");
    props.put("mail.debug", "true");
    
    return mailSender;
}

3.2. 스프링 부트 메일 서버 속성

의존성이 설정되면 다음 단계는 spring.mail. * 네임 스페이스를 사용하여 application.properties 파일 에 메일 서버 속성을 지정하는 것 입니다.

예를 들어 Gmail SMTP 서버의 속성은 다음과 같이 지정할 수 있습니다.

spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username=<login user to smtp server>
spring.mail.password=<login password to smtp server>
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true

일부 SMTP 서버에는 TLS 연결이 필요하므로 spring.mail.properties.mail.smtp.starttls.enable 속성 은 TLS 보호 연결을 활성화하는 데 사용됩니다.

3.2.1. Gmail SMTP 속성

Gmail SMTP 서버를 통해 이메일을 보낼 수 있습니다. 상기보고이 문서 에서 Gmail 보내는 메일 SMTP 서버 속성을 볼 수 있습니다.

우리 application.the 속성의 파일이 이미 Gmail의 SMTP를 (이전 섹션 참조)를 사용하도록 구성되어 있습니다.

계정의 비밀번호는 일반 비밀번호가 아니라 Google 계정 용으로 생성 된 애플리케이션 비밀번호 여야합니다. 링크 를 따라 세부 정보를 확인하고 Google 앱 비밀번호를 생성하세요.

3.2.2. SES SMTP 속성

Amazon SES 서비스를 사용하여 이메일을 보내려면 아래와 같이 application.properties설정하십시오 .

spring.mail.host=email-smtp.us-west-2.amazonaws.com
spring.mail.username=username
spring.mail.password=password
spring.mail.properties.mail.transport.protocol=smtp
spring.mail.properties.mail.smtp.port=25
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

Amazon에서는 자격 증명을 사용하기 전에 자격 증명을 확인하도록 요구합니다. 추적 링크를 사용자 이름과 비밀번호를 확인합니다.

4. 이메일 보내기

의존성 관리 및 구성이 완료되면 앞서 언급 한 JavaMailSender사용하여 이메일을 보낼 수 있습니다 .

평범한 바닐라 스프링 프레임 워크와 그것의 부트 버전 모두 비슷한 방식으로 이메일의 작성과 전송을 처리하기 때문에 우리는 아래 하위 섹션에서 두 가지를 구분할 필요가 없습니다.

4.1. 간단한 이메일 보내기

먼저 첨부 파일없이 간단한 전자 메일 메시지를 작성하고 보냅니다.

@Component
public class EmailServiceImpl implements EmailService {

    @Autowired
    private JavaMailSender emailSender;

    public void sendSimpleMessage(
      String to, String subject, String text) {
        ...
        SimpleMailMessage message = new SimpleMailMessage(); 
        message.setFrom("noreply@baeldung.com");
        message.setTo(to); 
        message.setSubject(subject); 
        message.setText(text);
        emailSender.send(message);
        ...
    }
}

참고, 그것은을 제공하기 위해 필수 아니더라도 것을 에서 주소, 많은 SMTP 서버는 메시지를 거부합니다. 이것이 바로 EmailService 구현 에서 noreply@baeldung.com 이메일 주소를 사용하는 이유 입니다.

4.2. 첨부 파일이있는 이메일 보내기

때때로 Spring의 단순한 메시징은 우리의 사용 사례에 충분하지 않습니다.

예를 들어, 송장이 첨부 된 주문 확인 이메일을 보내려고합니다. 이 경우 SimpleMailMessage 대신 JavaMail 라이브러리 MIME 멀티 파트 메시지를 사용해야합니다 . Spring은 org.springframework.mail.javamail.MimeMessageHelper 클래스를 사용하여 JavaMail 메시징을 지원합니다 .

먼저 EmailServiceImpl 에 첨부 파일이있는 이메일을 보내는 메소드를 추가합니다 .

@Override
public void sendMessageWithAttachment(
  String to, String subject, String text, String pathToAttachment) {
    // ...
    
    MimeMessage message = emailSender.createMimeMessage();
     
    MimeMessageHelper helper = new MimeMessageHelper(message, true);
    
    helper.setFrom("noreply@baeldung.com");
    helper.setTo(to);
    helper.setSubject(subject);
    helper.setText(text);
        
    FileSystemResource file 
      = new FileSystemResource(new File(pathToAttachment));
    helper.addAttachment("Invoice", file);

    emailSender.send(message);
    // ...
}

4.3. 간단한 이메일 템플릿

SimpleMailMessage 클래스는 텍스트 서식을 지원합니다. 구성에서 템플릿 빈을 정의하여 이메일 용 템플릿을 만들 수 있습니다.

@Bean
public SimpleMailMessage templateSimpleMessage() {
    SimpleMailMessage message = new SimpleMailMessage();
    message.setText(
      "This is the test email template for your email:\n%s\n");
    return message;
}

이제이 빈을 이메일 템플릿으로 사용할 수 있으며 필요한 매개 변수 만 템플릿에 제공하면됩니다.

@Autowired
public SimpleMailMessage template;
...
String text = String.format(template.getText(), templateArgs);  
sendSimpleMessage(to, subject, text);

5. 전송 오류 처리

JavaMailSendFailedException제공 하여 메시지를 보낼 수없는 상황을 처리합니다. 그러나 잘못된 주소로 이메일을 보내는 동안이 예외가 발생하지 않을 수 있습니다. 그 이유는 다음과 같습니다.

RFC 821의 SMTP 프로토콜 사양은 잘못된 주소로 이메일을 보내려고 할 때 SMTP 서버가 반환해야하는 550 반환 코드를 지정합니다. 그러나 대부분의 공용 SMTP 서버는이 작업을 수행하지 않습니다. 대신, 그들은 당신의 상자에 "배달 실패"이메일을 보내거나 전혀 피드백을 제공하지 않습니다.

예를 들어 Gmail SMTP 서버는 '전송 실패'메시지를 보냅니다. 그리고 프로그램에 예외가 없습니다.

따라서이 경우를 처리하기 위해 사용할 수있는 몇 가지 옵션이 있습니다.

  1. 던질 수없는 SendFailedException을 잡아라.
  2. 일정 기간 동안 "배달 실패"메시지에서 보낸 사람 사서함을 확인합니다. 이것은 간단하지 않으며 기간이 결정되지 않았습니다.
  3. 메일 서버가 피드백을 전혀 제공하지 않으면 아무것도 할 수 없습니다.

6. 결론

이 빠른 기사에서는 Spring Boot 애플리케이션에서 이메일을 설정하고 보내는 방법을 보여주었습니다.

이러한 모든 예제 및 코드 스 니펫의 구현은 GitHub 에서 찾을 수 있습니다  .