springboot项目打包jar发布项目,不能发送freemarker模板邮件

解决SpringBoot项目中JavaMailSender无法在打包部署后发送模板邮件的问题。通过注入FreeMarkerConfigurer并更改获取Template的方式,实现模板邮件的正确发送。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:

    springboot项目使用JavaMailSender在开发工具启动项目可以正常发送邮件,包括模板邮件,

    但是打包jar部署项目就不可以发送模板邮件。

项目地址:项目代码仓库Email代码具体位置

出现问题代码:(只是不可以打包jar部署项目发送模板邮件,其他均正常)

package com.luck.email;

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import javax.mail.internet.MimeMessage;
import java.util.Map;
import static com.luck.email.MailConfig.FROM_MAIL;
@Component
public class MailService2{
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private JavaMailSender mailSender;
    public void sendMailTemplate(String to, String subject, String templatePath, Map map){
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(FROM_MAIL);
            helper.setTo(to);
            helper.setSubject(subject);

            Configuration cfg = new Configuration(Configuration.VERSION_2_3_27);
            cfg.setClassLoaderForTemplateLoading(ClassLoader.getSystemClassLoader(),"/templates/ftl");
            Template emailTemplate = cfg.getTemplate(templatePath);

            String text = FreeMarkerTemplateUtils.processTemplateIntoString(emailTemplate, map);
            helper.setText(text, true);
            mailSender.send(message);
            logger.info("-----email-----模板邮件发送成功.");
        } catch (Exception e){
            e.printStackTrace();
            logger.info("-----email-----模板邮件发送失败.");
        }
    }
}

修改之后代码:(打包jar部署项目,也是可以发送模板邮件)

package com.luck.email;

import freemarker.template.Configuration;
import freemarker.template.Template;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.mail.internet.MimeMessage;
import java.util.Map;
import static com.luck.email.MailConfig.FROM_MAIL;
@Component
public class MailService2{
    private final Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private JavaMailSender mailSender;
    // 1.添加注入FreeMarkerConfigurer 
    @Autowired
    private FreeMarkerConfigurer configurer;
    public void sendMailTemplate(String to, String subject, String templatePath, Map map){
        MimeMessage message = mailSender.createMimeMessage();
        try {
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            helper.setFrom(FROM_MAIL);
            helper.setTo(to);
            helper.setSubject(subject);

            /*Configuration cfg = new Configuration(Configuration.VERSION_2_3_27);
            cfg.setClassLoaderForTemplateLoading(ClassLoader.getSystemClassLoader(),"/templates/ftl");
            Template emailTemplate = cfg.getTemplate(templatePath);*/
            // 2.或许模板文件改为这种方式
            Template emailTemplate = configurer.getConfiguration().getTemplate(templatePath);

            String text = FreeMarkerTemplateUtils.processTemplateIntoString(emailTemplate, map);
            helper.setText(text, true);
            mailSender.send(message);
            logger.info("-----email-----模板邮件发送成功.");
        } catch (Exception e){
            e.printStackTrace();
            logger.info("-----email-----模板邮件发送失败.");
        }
    }
}

  注意:.ftl文件放在templates目录下.

---------------------------------------------------------------------------------------------------------------------------------------

总结:解决办法注入 FreeMarkerConfigurer类,并获取Template 。

原因:目前不清楚。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值