LoginSignup
10
13

More than 5 years have passed since last update.

Spring Framework で メール送信

Last updated at Posted at 2015-12-03

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

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

1. 依存ライブラリの追加

org.springframework.mailパッケージは、
spring-context-supportに含まれているため、pom.xmlへ追加します

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

JavaMailの追加

pom.xml
<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

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

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

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になります

HelloWorld.vm
ようこそ "user"

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

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

4. ソースーコード

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

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されます。

エラーログ
Caused by: com.sun.mail.smtp.SMTPAddressFailedException:
 504 5.5.2 <z@surfacePro3>: Sender address rejected: need fully-qualified address

JavaMailのプロパティに以下を追加ししたら送信したいと書きたいのですが、、、

servlet-context.xml
<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

10
13
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
13