Spring Framework で メール送信

【背景】
 Spring公式のドキュメントで非推奨のAPIを利用しているため
 terasolunaにメールに関する記載がないため

【ゴール】
spring frameworkを用いてメールを送信する方法を記載します
注意事項: spring bootとは違いますよ

#1. 依存ライブラリの追加
org.springframework.mailパッケージは、
spring-context-supportに含まれているため、pom.xmlへ追加します

```xml:pom.xml
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context-support</artifactId>
	<version>${org.springframework-version}</version>
</dependency>
```

JavaMailの追加

```xml:pom.xml
<dependency>
	<groupId>javax.mail</groupId>
	<artifactId>mail</artifactId>
	<version>1.4.7</version>
</dependency>
```

Velocityの追加

```xml
: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

メールサーバの設定を登録します

```xml: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に設置します

```xml:servlet-context.xml
    <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になります

```vm:HelloWorld.vm
ようこそ "user"

サービスを登録してありがとう

あなたのパスワードは"password"です
```

#4. ソースーコード
ソースコードになります
上記で説明していないのは、非同期と添付ファイルですが省略させてください

```java:MailService
@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されます。

```log:エラーログ
Caused by: com.sun.mail.smtp.SMTPAddressFailedException:
 504 5.5.2 <z@surfacePro3>: Sender address rejected: need fully-qualified address
```
JavaMailのプロパティに以下を追加ししたら送信したいと書きたいのですが、、、

```xml:servlet-context.xml
<beans:prop key="mail.smtp.localhost">hoge@fuga.com</beans:prop>
```

以下のエラーが発生します(^^;;
どなたか助けてください。。。　help me 。。。

```log:エラーログ
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 501 5.5.2 <hoge?fuga.com>: Helo command rejected: Invalid name
```

本番では送信できるのですが、、、


■ 参考文献
[Spring 32.Email](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mail.html)