SpringEメールのガイド

1。概要

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

2.Mavenの依存関係

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

2.1。春

プレーンなバニラSpringフレームワークで使用するために、以下を追加します。

 org.springframework spring-context-support 5.2.8.RELEASE 

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

2.2。スプリングブーツ

そしてSpringBootの場合:

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

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

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

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

  1. MailSenderインターフェース:簡単なメールを送信するための基本的な機能を提供するトップレベルのインターフェース
  2. JavaMailSenderインターフェース:上記のMailSenderのサブインターフェース。これは、MIMEメッセージをサポートし、ほとんどと一緒に使用されているMimeMessageHelperを作成するためのクラスで、MimeMessage。このインターフェースではMimeMessagePreparatorメカニズムを使用することをお勧めします
  3. JavaMailSenderImplクラス JavaMailSenderインターフェースの実装を提供します。MimeMessageSimpleMailMessageをサポートします
  4. SimpleMailMessageクラス:from、to、cc、subject、textフィールドを含む単純なメールメッセージを作成するために使用されます
  5. MimeMessagePreparatorインターフェース:MIMEメッセージを準備するためのコールバックインターフェースを提供します
  6. MimeMessageHelperクラス: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ファイルでメールサーバーのプロパティを指定することです。

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

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

GmailSMTPサーバー経由でメールを送信できます。Gmailの送信メールSMTPサーバーのプロパティについては、ドキュメントをご覧ください。

私たちのapplication.theプロパティファイルは、すでに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); ... } }

注、それが提供する義務はありませんにもかかわらずことから、アドレス、多くのSMTPサーバーは、そのようなメッセージを拒否します。そのため、EmailServiceの実装では[電子メールで保護された]電子メールアドレスを使用しています。

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.結論

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

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