springboot 프로젝트 패키지jar 발표 프로젝트,freemarker 템플릿 메일 발송 불가
4367 단어 -spring-boot
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를 가져옵니다.
원인: 현재 잘 모르겠어요.