springbootでメール送信機能について調べたので共有します。
さくっとメールの送信を行います。以下二つの方法について記載します。
- SMTP-AUTH(port587) gmailを使用した方法(認証有り)
- SMTP(port25) を使用した方法(認証無し)
以前使用したプロジェクトに追加する形で実装します。SpringBootとGradleのススメ ~ CRUD操作編
SMTP-AUTHを使用したメール送信
gmailを使用してメール送信します。
build.gradleの修正
dependenciesの中にこいつを追加します。
build.gradle
compile('org.springframework.boot:spring-boot-starter-mail')
追加した後に以下の作業をしてください。
プロジェクト右クリック>Gradle>Gradleプロジェクトのリフレッシュ。これは先ほど追加した依存関係をeclipseちゃんがすぐに認識してくれないので認識してもらう為に必要です。
application.propertiesの修正
以下の設定を追記してください。
application.properties
#メール設定 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
googleの二段階認証を使用している人はパスワードの部分をアプリパスワードにしないと送れないので注意が必要です。
私は二段階認証していなかったので普通にgmailアドレスとパスワードでいけました。(自分セキュリティ大丈夫?)二段階認証のアプリパスワードについて詳しくはこちらを参照ください。Google アプリ パスワードでログイン
テンプレの修正
簡単にボタンを押してPOSTでメール送信できるようにします。
index.html(bodyの最下部へ追記)
<!-- メールテスト --> <form action="/mail/send" method="post" > <input type="submit" name="mailsend" value="テストメール送信" /> </form>
Controllerの作成
RestControllerとして作成します。ControllerとRestControllerの違いですが、ControllerはWebページ用のコントローラーで主にviewを返す。RestControllerはWebAPI用のコントローラーで主にjsonやxmlを返す。って感じの違いがあります。
MailController.java
package dbtest.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; @RestController public class MailController { private final JavaMailSender javaMailSender; @Autowired MailController(JavaMailSender javaMailSender) { this.javaMailSender = javaMailSender; } @RequestMapping(value = "/mail/send", method = {RequestMethod.POST} ) public String send() { SimpleMailMessage mailMessage = new SimpleMailMessage(); mailMessage.setTo("送信先"); mailMessage.setReplyTo("返信先"); mailMessage.setFrom("送信元"); mailMessage.setSubject("テストメール"); mailMessage.setText("テストメールです\nほげほげ"); javaMailSender.send(mailMessage); return "メール送信しました"; } }
javaMailSenderというjavaMailをラップしたメール送信オブジェクトを使用します。あとはPOSTで受け取ったら各種メール設定をして送信しています。成功すると「メール送信しました」と画面に出ます。
動作確認
さて、試しに動かしてみます。springbootアプリとして実行し、localhost:8080へアクセスします。画面下部にメール送信ボタンが見えますね。
ポチッとな
送信されたみたいです。
メールを確認してみます。
届きました!
SMTPを使用したメール送信
認証したくない・・・そもそもgoogleアカウントもってない・・・面倒なことは無しにサクッと動かしたい・・・とりあえずメール送信テストしたいんじゃー!っていう人の為の方法。基本的な設定は同じです。違う部分はapplication.propertiesの設定です。
application.propertiesの修正
以下のようにしてください。
application.properties
#メール設定 spring.mail.host=localhost spring.mail.port=25 smtp.sender=送信者のメールアドレス
senderの部分は送信元が誰なのかという設定、迷惑メールに振り分けられないように設定しておいた方が幸せ
動作確認
メール送信ポチッとな
!!!
おいおい、エラってるよ・・・どうやらSMTPサーバーが動いていないみたいです。macでは標準でpostfixという便利なものがインストールされているので、これを起動すればSMTPサーバー立てられます。ターミナル開いて以下のコマンドを打ちます。
$ sudo postfix start
再度メール送信!
成功しました。やったねー!
コメント