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를 가져옵니다.
원인: 현재 잘 모르겠어요.

좋은 웹페이지 즐겨찾기