springで複数人にメールを送信することはできたのですが、複数人に対し別々のメールの本文を送信したいです。for文を用いて、複数人にメールを送信することは実現できたのですが、その複数人に対し別々のメールの本文を送信がうまくいきません。
JavaConfig
JAVA
1 2import java.io.IOException; 3import java.util.Properties; 4 5import org.apache.velocity.app.VelocityEngine; 6import org.apache.velocity.exception.VelocityException; 7import org.springframework.context.annotation.Bean; 8import org.springframework.context.annotation.ComponentScan; 9import org.springframework.context.annotation.Configuration; 10import org.springframework.mail.javamail.JavaMailSender; 11import org.springframework.mail.javamail.JavaMailSenderImpl; 12import org.springframework.ui.freemarker.FreeMarkerConfigurationFactoryBean; 13import org.springframework.ui.velocity.VelocityEngineFactory; 14 15@Configuration 16@ComponentScan(basePackages = "com.example.mail") 17public class AppConfig { 18 19 @Bean 20 public JavaMailSender getMailSender() { 21 JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); 22 23 // Using gmail. 24 mailSender.setHost("smtp.gmail.com"); 25 mailSender.setPort(587); 26 mailSender.setUsername("username"); 27 mailSender.setPassword("password"); 28 29 Properties javaMailProperties = new Properties(); 30 javaMailProperties.put("mail.smtp.starttls.enable", "true"); 31 javaMailProperties.put("mail.smtp.auth", "true"); 32 javaMailProperties.put("mail.transport.protocol", "smtp"); 33 javaMailProperties.put("mail.debug", "true"); 34 35 mailSender.setJavaMailProperties(javaMailProperties); 36 return mailSender; 37 } 38 39 @Bean 40 public FreeMarkerConfigurationFactoryBean getFreeMarkerConfiguration() { 41 FreeMarkerConfigurationFactoryBean bean = new FreeMarkerConfigurationFactoryBean(); 42 bean.setTemplateLoaderPath("/fmtemplates/"); 43 return bean; 44 } 45 46}
JAVA
1 2public interface MailService { 3 4 public void sendEmail(final Object object); 5} 6
JAVA
1 2import java.util.HashMap; 3import java.util.Map; 4 5import javax.mail.internet.MimeMessage; 6 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.mail.MailException; 9import org.springframework.mail.javamail.JavaMailSender; 10import org.springframework.mail.javamail.MimeMessageHelper; 11import org.springframework.mail.javamail.MimeMessagePreparator; 12import org.springframework.stereotype.Service; 13import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; 14 15import com.websystique.spring.model.ProductOrder; 16 17import freemarker.template.Configuration; 18 19@Service("mailService") 20public class MailServiceImpl implements MailService{ 21 22 @Autowired 23 JavaMailSender mailSender; 24 25 @Autowired 26 Configuration freemarkerConfiguration; 27 28 @Override 29 public void sendEmail(Object object) { 30 31 ProductOrder order = (ProductOrder)object; 32 33 MimeMessagePreparator preparator = getMessagePreparator(order); 34 35 try { 36 mailSender.send(preparator); 37 } 38 catch (MailException ex) { 39 System.err.println(ex.getMessage()); 40 } 41 } 42 43 private MimeMessagePreparator getMessagePreparator(final ProductOrder order){ 44 45 MimeMessagePreparator preparator = new MimeMessagePreparator() { 46 47 public void prepare(MimeMessage mimeMessage) throws Exception { 48 MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); 49 50 helper.setSubject("件名"); 51 helper.setFrom("from@gmailcom"); 52 helper.setTo(order.getCustomerInfo().getEmail()); 53 54 Map<String, Object> model = new HashMap<String, Object>(); 55 model.put("order", order); 56 String text = geFreeMarkerTemplateContent(model); 57 helper.setText(text, true); 58 } 59 }; 60 return preparator; 61 } 62 63 64 public String geFreeMarkerTemplateContent(Map<String, Object> model){ 65 StringBuffer content = new StringBuffer(); 66 try{ 67 content.append(FreeMarkerTemplateUtils.processTemplateIntoString( 68 freemarkerConfiguration.getTemplate("mailTemplate.txt"),model)); 69 return content.toString(); 70 }catch(Exception e){ 71 System.out.println(e.getMessage()); 72 } 73 return ""; 74 } 75} 76
テンプレート
TXT
1<html> 2 <body> 3 <div> 4 オーダーID : ${order.orderId}. 5 </div> 6 </body> 7</html>
モデルクラス
JAVA
1public class ProductOrder { 2 3 private String orderId; 4 5 private String email; 6 7 public String getOrderId() { 8 return orderId; 9 } 10 11 public void setOrderId(String orderId) { 12 this.orderId = orderId; 13 } 14 public String getEmail(){ 15 return this.email; 16 } 17 public void setEmail(String email){ 18 this.email = email; 19 } 20 21}
メイン処理
java
1package com.websystique.spring.configuration; 2 3import org.springframework.context.annotation.AnnotationConfigApplicationContext; 4import org.springframework.context.support.AbstractApplicationContext; 5 6import com.websystique.spring.model.ProductOrder; 7import com.websystique.spring.service.OrderService; 8 9public class SampleEmailApplication { 10 11 public static void main(String[] args) { 12 AbstractApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); 13 14 OrderService orderService = (OrderService) context.getBean("orderService"); 15 16 String[] emails = {"test1@gmail.com","test2@gmail.com"}; 17 for(int i = 0;i < 2;i++){ 18 orderService.sendOrderConfirmation(getOrder(String.valueOf(i),emails[i])); 19 } 20 ((AbstractApplicationContext) context).close(); 21 } 22 23 public static ProductOrder getOrder(String id,String email){ 24 ProductOrder order = new ProductOrder(); 25 order.setOrderId(id); 26 order.setEmail(email); 27 return order; 28 } 29} 30
main関数のなかのfor文でtest1@gmail.comとtest2@gmail.comにメール送信に成功したのですが、メールテンプレートの${order.orderId}にはそれぞれ1と2の数字が入るであろうと予想して実行したが、実行結果はどれも1になっていました。なぜこのような実行結果になるのか誰かわかる方教えてください。また、どうすれば複数人に別々の本文を送信できるのかも教えてくれるとうれしいです。
----------------------------OrderServiceの追記--------------------
java
1 2import com.websystique.spring.model.ProductOrder; 3 4public interface OrderService { 5 6 public void sendOrderConfirmation(ProductOrder productOrder); 7 8} 9
java
1 2import org.springframework.beans.factory.annotation.Autowired; 3import org.springframework.stereotype.Service; 4 5import com.websystique.spring.model.ProductOrder; 6 7@Service("orderService") 8public class OrderServiceImpl implements OrderService{ 9 10 @Autowired 11 MailService mailService; 12 13 @Override 14 public void sendOrderConfirmation(ProductOrder productOrder) { 15 mailService.sendEmail(productOrder); 16 } 17 18} 19
回答1件
あなたの回答
tips
プレビュー