質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.77%

springでのメール送信でエラー

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 256

kachikata96

score 27

学習の一環として、eclipse2019.4.14、Java1.8、SpringBoot(2.0.4.RELEASE)、MySQL5.7によるwebアプリの開発を行っております。

現在メールを送る機能を実装するためにとりあえずフォームから入力されたメールアドレスに定型文を送る機能を作っています。

ネットの資料をあさりながら実験としてまっさらなプロジェクトにコードを書いてみるとメールの送信に成功しました。

しかし、本番用のプロジェクトにほぼ同じコードを書いてみるとエラーが起きてしまいました。

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-07-15 16:53:41.443 ERROR 12876 --- [  restartedMain] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of constructor in com.example.demo.service.MailService required a bean of type 'org.springframework.mail.MailSender' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)


Action:

Consider defining a bean of type 'org.springframework.mail.MailSender' in your configuration.


エラーコードを読むとbeanの登録関係でのエラーのようですが、テストプロジェクトとの違いがわからず原因がはっきりしません。
パッケージの構成の違いでもDI関係のエラーが出ることがあるのでしょうか?

テストプロジェクトでのコード

・コントロールクラス

package com.example.demo.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.example.demo.DemoApplication;

@Controller
public class MailController {

    @Autowired
    DemoApplication demo;

         @GetMapping("/mail")
         public String getCheckPasswordSending() {

            //adminWorkSchedule.htmlへ遷移
             return "/mailForm";
         }

         @PostMapping("/passwordSending")
         public String postPasswordSending(@RequestParam("mailaddres")String mailaddres, Model model ) {

             //パスワードとアドレスをメール送信メソッドに渡す
             demo.run(mailaddres);

             return "hello";
         }

}


・メール送信処理をするサービスクラス

package com.example.demo;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;

@Service
public class DemoApplication {

    private final MailSender mailSender;

    public DemoApplication(MailSender mailSender) {
        this.mailSender = mailSender;
    }

    public void run(String str) {

        SimpleMailMessage msg = new SimpleMailMessage();
        msg.setTo(str);
        msg.setCc(str);
        msg.setBcc(str);
        msg.setSubject("件名");
        msg.setText("本文");

        // メール送信
        mailSender.send(msg);

        System.out.println(str);
    }
    }


・メールフォームのHTML

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">

    <!-- Bootstrapの設定 -->
    <link th:href="@{/webjars/bootstrap/3.3.7-1/css/bootstrap.min.css}" rel = "stylesheet"></link>
    <script th:src="@{/webjars/jquery/1.11.1/jquery.min.js}"></script>
    <script th:src="@{/webjars/bootstrap/3.3.7-1/js/bootstrap.min.js}"></script>

<title>パスワード送信画面</title>
</head>
<body class="text-center">
    <h1>パスワードを送信します</h1>
    <br/>
    <h2>登録しているメールアドレスを入力してください</h2>
    <div style="text-align:center">
        <form method="post" action="/passwordSending">

                <div class="form-group">
                    <input type="text" name="mailaddres" th:value="${mailadddres_value}">
                </div>

            <button class="btn btn-primary" type="submit" style="padding:10px;"><font size="7">送信</font></button>
        </form>
        <br/>
    </div>
</body>
</html>

本番用のプロジェクトでのコード

・コントールクラス

package com.example.demo.login.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.example.demo.model.Employee;
import com.example.demo.service.EmployeeService;
import com.example.demo.service.MailService;

@Controller
public class MailController {

    @Autowired
    EmployeeService employeeService;

    @Autowired
    MailService mailService;

     //パスワード送信処理
     @PostMapping("/passwordSending")
     public String postPasswordSending(@RequestParam("mailaddres")String mailaddres, Model model ) {

        //データベースからパスワードを受け取る
         Employee employee = employeeService.selectPassword(mailaddres);

        //Modelに登録
         model.addAttribute("password", employee.getPassword());

         //パスワードとアドレスをメール送信メソッドに渡す
         mailService.addresget(mailaddres, employee.getPassword());

        //adminWorkSchedule.htmlへ遷移
         return "login/checkPasswordSending";
     }


     @GetMapping("/passwordSending")
     public String getCheckPasswordSending() {

        //adminWorkSchedule.htmlへ遷移
         return "login/passwordSending";
     }

}


・メール送信処理があるサービスクラス

package com.example.demo.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailSender;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.stereotype.Service;

@Service
public class MailService {


    private final MailSender mailSender;



    public MailService(MailSender mailSender) {
        this.mailSender = mailSender;
    }


    //メール送信メソッド
    public void addresget(String add,String pass ) {
        SimpleMailMessage msg = new SimpleMailMessage();
        msg.setTo(add);

        msg.setSubject("件名");
        msg.setText(pass);

        // メール送信
        mailSender.send(msg);
    }

}


・入力ホームのHTMLはテストと同じ

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

パッケージ構造を確認してください。

controller: com.example.demo.login.controller
service   : com.example.demo.service

SpringBootの起動クラスのパッケージは、com.example.demo でしょうか?
SpringBootのデフォルト設定では、起動クラスと同じないしはそのサブパッケージでなければ、Springのアノテーションを付けても対象になりません。

具体的には、SpringBootの起動クラスが、com.example.demo.login.Application だった場合は、Serviceクラスは com.example.demo.login か、そのサブパッケージになければなりません。
(ないしはComponentScanの対象を追加します)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る