問題:
springboot項目使用JavaMailSender在開發工具啓動項目可以正常發送郵件,包括模板郵件,
但是打包jar部署項目就不可以發送模板郵件。
出現問題代碼:(只是不可以打包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 。
原因:目前不清楚。