【背景】
Spring公式のドキュメントで非推奨のAPIを利用しているため
terasolunaにメールに関する記載がないため
【ゴール】
spring frameworkを用いてメールを送信する方法を記載します
注意事項: spring bootとは違いますよ
1. 依存ライブラリの追加
org.springframework.mailパッケージは、
spring-context-supportに含まれているため、pom.xmlへ追加します
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${org.springframework-version}</version>
</dependency>
JavaMailの追加
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
Velocityの追加
:pom.xml
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity</artifactId>
<version>1.7</version>
</dependency>
2. BeanをSpring-Contextに追加
Spring-CntextにBeanを登録します
以下のファイルを編集します
/プロジェクト名/src/main/webapp/WEB-INF/spring/appServlet/servlet-context.xml
メールサーバの設定を登録します
<beans:bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<beans:property name="host" value="メールサーバIP or FQDN" />
<beans:property name="port" value="SMTPポート名 標準:25 or 587" />
<beans:property name="username" value="ユーザー名" />
<beans:property name="password" value="パスワード" />
<beans:property name="javaMailProperties">
<beans:props>
<beans:prop key="mail.transport.protocol">smtp</beans:prop>
<beans:prop key="mail.smtp.auth">true</beans:prop>
<beans:prop key="mail.smtp.starttls.enable">true</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
次にVelocityの設定をします
Velocityファイルを/プロジェクト名/src/main/resources/templateに設置します
<beans:bean id="velocityEngine" class="org.springframework.ui.velocity.VelocityEngineFactoryBean">
<beans:property name="resourceLoaderPath" value="classpath:template" />
<beans:property name="velocityPropertiesMap">
<beans:map>
<beans:entry key="input.encoding" value="UTF-8" />
<beans:entry key="output.encoding" value="UTF-8" />
</beans:map>
</beans:property>
</beans:bean>
3. メールテンプレート(Velocity)の作成
HelloWorld.vmを作成します
Velocityを作成する場所は/プロジェクト名/src/main/resources/templateになります
ようこそ "user"
サービスを登録してありがとう
あなたのパスワードは"password"です
4. ソースーコード
ソースコードになります
上記で説明していないのは、非同期と添付ファイルですが省略させてください
@Service
public class MailService {
@Autowired
private JavaMailSender mailSender;
@Autowired
private VelocityEngine velocityEngine;
@Async // 非同期
public void doSendPasswordRemaindEmail() throws MessagingException {
MimeMessage message = mailSender.createMimeMessage();
// 添付ファイルを用いる場合は、tureを設定します
MimeMessageHelper helper = new MimeMessageHelper(message, true);
// メール本文の生成
Map<String,Object> model = new HashMap<String,Object>();
StringWriter writer = new StringWriter();
model.put("user", "hoge");
model.put("passowrd", "abcdef");
VelocityContext ctx = new VelocityContext(model);
velocityEngine.mergeTemplate("HelloWorld.vm", "UTF-8", ctx, writer);
// メール本文のセット
helper.setText(writer.toString());
// ファイルをメールに添付
FileSystemResource file = new FileSystemResource(new File("c:/hoge.jpg"));
helper.addAttachment("hoge.jpg", file);
// 送信先を設定
helper.setTo("hoge@hoge.com");
// 送信
mailSender.send(message);
}
}
5. エラーと実行環境
ドメインに参加していない開発環境から実行すると以下のエラーが発生します。
Postfix系のサーバだと、FQDNでないとDenyされます。
Caused by: com.sun.mail.smtp.SMTPAddressFailedException:
504 5.5.2 <z@surfacePro3>: Sender address rejected: need fully-qualified address
JavaMailのプロパティに以下を追加ししたら送信したいと書きたいのですが、、、
<beans:prop key="mail.smtp.localhost">hoge@fuga.com</beans:prop>
以下のエラーが発生します(^^;;
どなたか助けてください。。。 help me 。。。
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 501 5.5.2 <hoge?fuga.com>: Helo command rejected: Invalid name
本番では送信できるのですが、、、
■ 参考文献
Spring 32.Email