1. 概要

このチュートリアルでは、プレーンバニラSpringアプリケーションとSpring Bootアプリケーションの両方から電子メールを送信するために必要な手順を説明します。 前者の場合はJavaMailライブラリを使用し、後者の場合は spring-boot-starter-mail依存関係を使用します。

2. Mavenの依存関係

まず、pom.xmlに依存関係を追加する必要があります。

2.1. 春

プレーンバニラSpringフレームワークで使用するために追加するものは次のとおりです。

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

最新バージョンはここにあります。

2.2. スプリングブーツ

そしてSpringBootの場合:

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

最新バージョンは、 MavenCentralリポジトリーで入手できます。

3. メールサーバーのプロパティ

SpringフレームワークでのJavaメールサポートのインターフェースとクラスは次のように構成されています。

  1. MailSenderインターフェース:簡単なメールを送信するための基本的な機能を提供するトップレベルのインターフェース
  2. JavaMailSenderインターフェース:上記のMailSenderのサブインターフェース。 MIMEメッセージをサポートし、主にMimeMessageHelperクラスと組み合わせてMimeMessageを作成するために使用されます。 このインターフェイスでは、MimeMessagePreparatorメカニズムを使用することをお勧めします。
  3. JavaMailSenderImplクラスは、JavaMailSenderインターフェースの実装を提供します。 MimeMessageおよびSimpleMailMessageをサポートします。
  4. SimpleMailMessageクラス:from、to、cc、subject、textフィールドを含む単純なメールメッセージを作成するために使用されます
  5. MimeMessagePreparatorインターフェースは、MIMEメッセージを準備するためのコールバックインターフェースを提供します。
  6. MimeMessageHelperクラス:MIMEメッセージを作成するためのヘルパークラス。 HTMLレイアウトの画像、一般的なメールの添付ファイル、テキストコンテンツをサポートします。

次のセクションでは、これらのインターフェイスとクラスの使用方法を示します。

3.1. SpringMailServerのプロパティ

たとえば、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 BootMailServerのプロパティ

依存関係が設定されたら、次のステップは、spring.mail。*名前空間を使用してapplication.propertiesファイルでメールサーバーのプロパティを指定することです。

GmailSMTPサーバーのプロパティは次のように指定できます。

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. GmailSMTPプロパティ

GmailSMTPサーバー経由でメールを送信できます。 ドキュメントを見て、Gmail送信メールSMTPサーバーのプロパティを確認してください。

application.properties ファイルは、Gmail SMTPを使用するように既に構成されています(前のセクションを参照)。

アカウントのパスワードは通常のパスワードではなく、Googleアカウント用に生成されたアプリケーションパスワードである必要があります。 このリンクをたどって詳細を確認し、Googleアプリのパスワードを生成してください。

3.2.2. SESSMTPプロパティ

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を使用して電子メールを送信できます。

プレーンバニラSpringフレームワークとそのブートバージョンの両方が同様の方法で電子メールの作成と送信を処理するため、以下のサブセクションで2つを区別する必要はありません。

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);
        ...
    }
}

from アドレスを提供することは必須ではありませんが、多くのSMTPサーバーはそのようなメッセージを拒否することに注意してください。 そのため、EmailServiceの実装では[email protected]の電子メールアドレスを使用しています。

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("[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. シンプルなメールテンプレート

SimpleMailMessageクラスはテキストフォーマットをサポートしています。

構成でテンプレートBeanを定義することにより、電子メールのテンプレートを作成できます。

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

これで、このBeanを電子メールのテンプレートとして使用でき、テンプレートに必要なパラメーターを指定するだけで済みます。

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

5. 送信エラーの処理

JavaMail は、メッセージを送信できない状況を処理するためにSendFailedExceptionを提供します。 ただし、間違ったアドレスに電子メールを送信しているときに、この例外が発生しない可能性があります。 その理由は次のとおりです。

RFC 821のSMTPのプロトコル仕様では、誤ったアドレスに電子メールを送信しようとしたときにSMTPサーバーが返す必要のある550リターンコードが指定されています。 しかし、ほとんどのパブリックSMTPサーバーはこれを行いません。 代わりに、「配信に失敗しました」という電子メールを送信するか、フィードバックをまったく提供しません。

たとえば、GmailSMTPサーバーは「配信に失敗しました」というメッセージを送信します。 そして、私たちのプログラムには例外はありません。

したがって、このケースを処理するためのいくつかのオプションがあります。

  1. SendFailedExceptionをキャッチします。これはスローされることはありません。
  2. しばらくの間、送信者のメールボックスで「配信に失敗しました」というメッセージを確認してください。 これは簡単ではなく、期間は決定されていません。
  3. メールサーバーからフィードバックがまったくない場合は、何もできません。

6. 結論

この簡単な記事では、SpringBootアプリケーションからメールを設定して送信する方法を示しました。

これらすべての例とコードスニペットの実装は、GitHubにあります。