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

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

ただいまの
回答率

88.77%

springで複数人に別々の本文を送信したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,236

isacRu

score 60

springで複数人にメールを送信することはできたのですが、複数人に対し別々のメールの本文を送信したいです。for文を用いて、複数人にメールを送信することは実現できたのですが、その複数人に対し別々のメールの本文を送信がうまくいきません。
JavaConfig

import java.io.IOException;
import java.util.Properties;

import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.VelocityException;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean;
import org.springframework.ui.velocity.VelocityEngineFactory;

@Configuration
@ComponentScan(basePackages = "com.example.mail")
public class AppConfig {

    @Bean
    public JavaMailSender getMailSender() {
        JavaMailSenderImpl mailSender = new JavaMailSenderImpl();

        // Using gmail.
        mailSender.setHost("smtp.gmail.com");
        mailSender.setPort(587);
        mailSender.setUsername("username");
        mailSender.setPassword("password");

        Properties javaMailProperties = new Properties();
        javaMailProperties.put("mail.smtp.starttls.enable", "true");
        javaMailProperties.put("mail.smtp.auth", "true");
        javaMailProperties.put("mail.transport.protocol", "smtp");
        javaMailProperties.put("mail.debug", "true");

        mailSender.setJavaMailProperties(javaMailProperties);
        return mailSender;
    }

    @Bean
    public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() {
        FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean();
        bean.setTemplateLoaderPath("/fmtemplates/");
        return bean;
    }

}
public interface MailService {

    public void sendEmail(final Object object);
}
import java.util.HashMap;
import java.util.Map;

import javax.mail.internet.MimeMessage;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.MailException;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;

import com.websystique.spring.model.ProductOrder;

import freemarker.template.Configuration;

@Service("mailService")
public class MailServiceImpl implements MailService{

    @Autowired
    JavaMailSender mailSender;

    @Autowired
    Configuration freemarkerConfiguration;

    @Override
    public void sendEmail(Object object) {

        ProductOrder order = (ProductOrder)object;

        MimeMessagePreparator preparator = getMessagePreparator(order);

        try {
            mailSender.send(preparator);
        }
        catch (MailException ex) {
            System.err.println(ex.getMessage());
        }
    }

    private MimeMessagePreparator getMessagePreparator(final ProductOrder order){

        MimeMessagePreparator preparator = new MimeMessagePreparator() {

            public void prepare(MimeMessage mimeMessage) throws Exception {
                MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);

                   helper.setSubject("件名");
                   helper.setFrom("from@gmailcom");
                   helper.setTo(order.getCustomerInfo().getEmail());

                   Map<String, Object> model = new HashMap<String, Object>();
                model.put("order", order);           
                String text = geFreeMarkerTemplateContent(model);
                helper.setText(text, true);
            }
        };
        return preparator;
    }


    public String geFreeMarkerTemplateContent(Map<String, Object> model){
        StringBuffer content = new StringBuffer();
        try{
         content.append(FreeMarkerTemplateUtils.processTemplateIntoString( 
                 freemarkerConfiguration.getTemplate("mailTemplate.txt"),model));
         return content.toString();
        }catch(Exception e){
            System.out.println(e.getMessage());
        }
          return "";
    }
}


テンプレート

<html>
    <body>
        <div>
            オーダーID : ${order.orderId}.
        </div>
    </body>
</html>


モデルクラス

public class ProductOrder {

    private String orderId;

    private String email;

    public String getOrderId() {
        return orderId;
    }

    public void setOrderId(String orderId) {
        this.orderId = orderId;
    }
    public String getEmail(){
        return this.email;
    }
    public void setEmail(String email){
        this.email = email;
    }

}


メイン処理

package com.websystique.spring.configuration;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;

import com.websystique.spring.model.ProductOrder;
import com.websystique.spring.service.OrderService;

public class SampleEmailApplication {

    public static void main(String[] args) {
        AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

        OrderService orderService = (OrderService) context.getBean("orderService");

        String[] emails = {"test1@gmail.com","test2@gmail.com"};
        for(int i = 0;i < 2;i++){
            orderService.sendOrderConfirmation(getOrder(String.valueOf(i),emails[i]));
        }
        ((AbstractApplicationContext) context).close();
    }

    public static ProductOrder getOrder(String id,String email){
        ProductOrder order = new ProductOrder();
        order.setOrderId(id);
        order.setEmail(email);
        return order;
    }
}


main関数のなかのfor文でtest1@gmail.comとtest2@gmail.comにメール送信に成功したのですが、メールテンプレートの${order.orderId}にはそれぞれ1と2の数字が入るであろうと予想して実行したが、実行結果はどれも1になっていました。なぜこのような実行結果になるのか誰かわかる方教えてください。また、どうすれば複数人に別々の本文を送信できるのかも教えてくれるとうれしいです。

----------------------------OrderServiceの追記--------------------

import com.websystique.spring.model.ProductOrder;

public interface OrderService {

    public void sendOrderConfirmation(ProductOrder productOrder);

}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.websystique.spring.model.ProductOrder;

@Service("orderService")
public class OrderServiceImpl implements OrderService{

    @Autowired
    MailService mailService;

    @Override
    public void sendOrderConfirmation(ProductOrder productOrder) {
        mailService.sendEmail(productOrder);
    }

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • A-pZ

    2016/10/25 17:17

    OrderService をControllerから実行していますが、OrderService のコードが見当たりませんでしたので、追記していただくと回答が得られるかもしれません。

    キャンセル

  • isacRu

    2016/10/25 17:42

    追記しました。

    キャンセル

  • KSwordOfHaste

    2016/10/25 21:07

    メイン処理のfor文の範囲が1~2になってます。転記ミスでは?このままではArrayIndexOutOfBounds例外になると思います。

    キャンセル

  • isacRu

    2016/10/31 17:12

    ありがとうございます。転記ミスでした。

    キャンセル

回答 1

check解決した方法

0

大変お騒がせいたしました。メーラの設定が悪かったようです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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