個人的に最近気になっているのは、playframework と、vertx かなと JVM + netty をベースにした framework が良い性能をだしていて少しづつ勉強しているところです。
話がずれたので、とりあえず覚え書き。
まず、spring の applicationContext.xml で設定する bean 設定。mail 設定の部分だけ別ファイルとして設定
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="mailSender"
class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="${smtp.host}"/>
</bean>
<bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<property name="resourceLoaderPath" value="classpath:mail" />
<property name="velocityPropertiesMap">
<map>
<entry key="input.encoding" value="UTF-8" />
<entry key="output.encoding" value="UTF-8" />
</map>
</property>
</bean>
<bean id="velocityJavaMailSender" class="jp.blogspot.horiga3.example.spring.mail.VelocityJavaMailSender">
<property name="mailSender" ref="mailSender" />
<property name="velocityEngine" ref="velocityEngine" />
</bean>
</beans>
SMTPサーバはないと動きません。幸いにも社内にあるのでそれを設定します。それぞれの環境に合わせて変更するひつようがありますのであしからず。
あとは、自前クラスは以下のように
import javax.mail.internet.MimeMessage;
import org.apache.velocity.app.VelocityEngine;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.mail.javamail.MimeMessagePreparator;
import org.springframework.stereotype.Component;
import org.springframework.ui.velocity.VelocityEngineUtils;
@Component
public class VelocityJavaMailSender {
@Autowired
protected JavaMailSender mailSender;
@Autowired
protected VelocityEngine velocityEngine;
public static class MailMessage {
private boolean html = false;
private String from;
private String personal;
private String mailTemplate;
private String[] recipients;
private String subject;
private Map<String, Object> content;
public boolean isHtml() {
return html;
}
public void setHtml(boolean html) {
this.html = html;
}
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getPersonal() {
return personal;
}
public void setPersonal(String personal) {
this.personal = personal;
}
public String getMailTemplate() {
return mailTemplate;
}
public void setMailTemplate(String mailTemplate) {
this.mailTemplate = mailTemplate;
}
public String[] getRecipients() {
return recipients;
}
public void setRecipients(String[] recipients) {
this.recipients = recipients;
}
public String getSubject() {
return subject;
}
public void setSubject(String subject) {
this.subject = subject;
}
public Map<String, Object> getContent() {
return content;
}
public void setContent(Map<String, Object> content) {
this.content = content;
}
}
public void sendMailMessage(MailMessage mail) throws Exception {
this.mailSender.send(createMailPreparator(mail));
}
public void setMailSender(JavaMailSender mailSender) {
this.mailSender = mailSender;
}
public void setVelocityEngine(VelocityEngine velocityEngine) {
this.velocityEngine = velocityEngine;
}
private MimeMessagePreparator createMailPreparator(
final MailMessage mailMessage) {
MimeMessagePreparator preparator = new MimeMessagePreparator() {
@Override
public void prepare(MimeMessage mimeMessage) throws Exception {
MimeMessageHelper message = new MimeMessageHelper(mimeMessage);
message.setTo(mailMessage.getRecipients());
message.setSubject(mailMessage.getSubject());
if ( null != mailMessage.getPersonal() && mailMessage.getPersonal().trim().length() > 0)
message.setFrom(mailMessage.getFrom(), mailMessage.getPersonal());
else message.setFrom(mailMessage.getFrom());
message.setText(VelocityEngineUtils.mergeTemplateIntoString(
velocityEngine, mailMessage.getMailTemplate(), "utf-8",
mailMessage.getContent()), mailMessage.isHtml());
}
};
return preparator;
}
}
で、テストケースが以下。
import java.util.HashMap;
import junit.framework.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import jp.blogspot.horiga3.example.spring.mail.VelocityJavaMailSender.MailMessage;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
"file:src/main/webapp/WEB-INF/springframework/mail-context.xml"
})
public class VelocityJavaMailSenderTest {
@Autowired
@Qualifier("velocityJavaMailSender")
VelocityJavaMailSender mailSender;
@Test
public void test() {
MailMessage message = new MailMessage();
try {
message.setMailTemplate("test.vm");
message.setRecipients(new String[] { "your mail address " });
message.setSubject("test message");
message.setFrom("noreply@hogehoge.com");
message.setPersonal("JUnitさん");
HashMap<String, Object> content = new HashMap<String, Object>();
content.put("str", "test");
content.put("n", System.currentTimeMillis()/1000);
message.setContent(content);
mailSender.sendMailMessage(message);
} catch ( Exception e) {
e.printStackTrace();
Assert.fail(e.getMessage());
}
}
}
送信先を自分のメールアドレスに設定してテストケースを実行すると
正しく送信されていることが確認できた。
ちなみに少しハマったところが、テンプレートファイルのエンコーディングとかも全て統一しておかないと文字化けします。
テストケースにこのソースがあるとmavenビルドとかで、自動テストするとビルドのたびに毎回メールくるようになります。注意しましょう〜
0 件のコメント:
コメントを投稿