Spring Emailのガイド
1. 概要
この記事では、プレーンなバニラSpringアプリケーションとSpring Bootアプリケーションの両方からメールを送信するために必要な手順を説明します。前者はJavaMailライブラリを使用し、後者はspring-boot-starter-mailを使用します。 ■依存関係。
参考文献:
登録-メールで新しいアカウントを有効にする
Spring Securityを使用して、ログインを許可する前に、メールで確認トークンを送信して、新しく登録したユーザーを確認します。
2. Mavenの依存関係
まず、依存関係をpom.xmlに追加する必要があります。
2.1. 春
プレーンなバニラSpringフレームワークで使用するために、以下を追加します。
org.springframework
spring-context-support
5.0.1.RELEASE
最新バージョンはhereで見つけることができます。
2.2. 春のブーツ
また、Spring Bootの場合:
org.springframework.boot
spring-boot-starter-mail
2.0.1.RELEASE
最新バージョンは、Maven Centralリポジトリで入手できます。
3. メールサーバーのプロパティ
SpringフレームワークでのJavaメールサポートのインターフェースとクラスは、次のように構成されています。
-
MailSender interface:簡単なメールを送信するための基本的な機能を提供するトップレベルのインターフェース
-
JavaMailSender interface:上記のMailSenderのサブインターフェイス。 MIMEメッセージをサポートし、主にMimeMessageHelperクラスと組み合わせてMimeMessageを作成するために使用されます。 このインターフェースではMimeMessagePreparatorメカニズムを使用することをお勧めします
-
JavaMailSenderImpl class:JavaMailSenderインターフェースの実装を提供します。 MimeMessageとSimpleMailMessageをサポートします
-
SimpleMailMessage class:from、to、cc、subject、textフィールドを含む簡単なメールメッセージを作成するために使用されます
-
MimeMessagePreparator interface:MIMEメッセージを準備するためのコールバックインターフェイスを提供します
-
MimeMessageHelper class:MIMEメッセージを作成するためのヘルパークラス。 HTMLレイアウトの画像、一般的なメール添付ファイル、およびテキストコンテンツのサポートを提供します
次のセクションでは、これらのインターフェイスとクラスの使用方法を示します。
3.1. Springメールサーバーのプロパティ
指定するために必要なメールプロパティ。 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. SpringBootメールサーバーのプロパティ
依存関係が設定されたら、次のステップは、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. GmailSMTPプロパティ
Gmail SMTPサーバー経由でメールを送信できます。 documentationを見て、Gmail送信メールSMTPサーバーのプロパティを確認してください。
application.the propertiesファイルはGmail SMTPを使用するようにすでに構成されています(前のセクションを参照)。
アカウントのパスワードは通常のパスワードではなく、Googleアカウント用に生成されたアプリケーションパスワードであることに注意してください。 このlinkに従って詳細を確認し、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では、資格情報を使用する前に確認する必要があることに注意してください。 linkに従って、ユーザー名とパスワードを確認します。
4. メール送信
依存関係の管理と構成が整ったら、前述のJavaMailSenderを使用して電子メールを送信できます。
プレーンなバニラSpringフレームワークとそのブートバージョンの両方が同様の方法で電子メールの作成と送信を処理するため、以下のサブセクションで2つを区別する必要はありません。
4.1. 簡単なメールを送信する
まず、添付ファイルのない簡単な電子メールメッセージを作成して送信しましょう。
@Component
public class EmailServiceImpl implements EmailService {
@Autowired
public JavaMailSender emailSender;
public void sendSimpleMessage(
String to, String subject, String text) {
...
SimpleMailMessage message = new SimpleMailMessage();
message.setTo(to);
message.setSubject(subject);
message.setText(text);
emailSender.send(message);
...
}
}
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.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サーバーはこれを行いません。 代わりに、彼らはあなたのボックスに「配達失敗」メールを送信するか、まったくフィードバックをしません。
たとえば、Gmail SMTPサーバーは「配信失敗」メッセージを送信します。 また、プログラムで例外は発生しません。
そのため、このケースを処理するために通過できるオプションはほとんどありません。
-
スローできないSendFailedExceptionをキャッチします
-
しばらくの間、「配信失敗」メッセージで送信者のメールボックスを確認します。 これは簡単ではなく、期間は決定されません
-
メールサーバーからフィードバックがまったくない場合は、何もできません。
6. 結論
この簡単な記事では、Spring Bootアプリケーションからメールをセットアップして送信する方法を示しました。
これらすべての例とコードスニペットの実装は、GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。