봄 이메일 안내

1. 개요

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

2. Maven 종속성

먼저 pom.xml에 종속성을 추가해야합니다 .

2.1. 봄

일반 바닐라 스프링 프레임 워크에서 사용하기 위해 다음을 추가합니다.

 org.springframework spring-context-support 5.2.8.RELEASE 

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

2.2. 봄 부팅

그리고 Spring Boot의 경우 :

 org.springframework.boot spring-boot-starter-mail 2.2.5.RELEASE 

최신 버전은 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("[email protected]"); 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= spring.mail.password= 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("[email protected]"); message.setTo(to); message.setSubject(subject); message.setText(text); emailSender.send(message); ... } }

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

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

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

For example, we want to send an order confirmation email with an invoice attached. In this case, we should use a MIME multipart message from JavaMail library instead of SimpleMailMessage. Spring supports JavaMail messaging with the org.springframework.mail.javamail.MimeMessageHelper class.

First of all, we'll add a method to the EmailServiceImpl to send emails with attachments:

@Override public void sendMessageWithAttachment( String to, String subject, String text, String pathToAttachment) { // ... MimeMessage message = emailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true); helper.setFrom("[email protected]"); 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. Simple Email Template

SimpleMailMessage class supports text formatting. We can create a template for emails by defining a template bean in our configuration:

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

Now we can use this bean as a template for email and only need to provide the necessary parameters to the template:

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

5. Handling Send Errors

JavaMail provides SendFailedException to handle situations when a message cannot be sent. But it is possible that you won't get this exception while sending an email to the incorrect address. The reason is the following:

The protocol specs for SMTP in RFC 821 specifies the 550 return code that SMTP server should return when attempting to send an email to the incorrect address. But most of the public SMTP servers don't do this. Instead, they send a “delivery failed” email to your box, or give no feedback at all.

For example, Gmail SMTP server sends a “delivery failed” message. And you get no exceptions in your program.

So, there are few options you can go through to handle this case:

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

6. 결론

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

이 모든 예제 및 코드 조각의 구현은 GitHub에서 찾을 수 있습니다.