采用freemarker模板引擎作为Java邮件模板

      项目需要发送邮件提醒,格式类似于下面这样,总之要换行,排版整齐

1.姓名:
2.年龄:
3.性别:
     刚开始的时候,我采用在字符串之间用“\n”来拼接,发现请求返回成功,但是没有收到邮件,换成“\r"也不行;但是换成”\t“就可以收到邮件,只不过\t不是我要的效果。再后来尝试用"<br/>"来拼接就成功了,既可以收到邮件,也换行了,说明我所调用的邮件服务mime类型是web型。

     那如果我们采用freemarker引擎作为邮件模板,那我们就可以在页面上定义各种样式了,因为发送过去的是个网页,首先你得有一个模板文件,freemarker文件以ftl为后缀(velocity以vm为后缀),然后写一个组件类用来初始化和填充模板Template;然后将一个模型类model传递到模板中,模板中以EL表达式来取值

   代码如下:

@Component
@Lazy(false)
public class MailUtil {
    private static final String ENCODING = "UTF-8";
    private static final String TEMPLATE_NAME = "MAIL_TEMPLATE";
    protected static final Logger logger = LoggerFactory.getLogger(MailUtil.class);
    private static Template MAIL_TEMPLATE;

    static {
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_21);
        cfg.setDefaultEncoding(ENCODING);
        StringTemplateLoader stringTemplateLoader = new StringTemplateLoader();
        cfg.setTemplateLoader(stringTemplateLoader);
        InputStreamReader isr = null;
        try {
            //这是一个springboot项目,我的模板文件放在resource文件夹下的templates文件夹下
            isr = new InputStreamReader(new FileInputStream(ResourceUtils.getFile("classpath:templates/template.ftl")),
                    ENCODING);
            MAIL_TEMPLATE = new Template(TEMPLATE_NAME, isr, cfg);
        } catch (Exception e) {
            MAIL_TEMPLATE = null;
        } finally {
            IOUtils.closeQuietly(isr);
        }
    }

    public static void sendMail(String mailFrom, String mailReceiver, String mailFrom, String mailServerIp,
                                int port, Employee employee) {
        try {

            StringWriter out = new StringWriter();
            MAIL_TEMPLATE.process(employee, out);
            out.flush();
            String context = out.toString();
          //当你无法收到邮件,请把下面这行注释打开
          //context = context.replaceAll("\r\n","");
            JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
            senderImpl.setHost(mailServerIp);
            senderImpl.setPort(port);
            senderImpl.setUsername(mailFrom);
            senderImpl.setPassword(mailFrom);
            MimeMessage mailMessage = senderImpl.createMimeMessage();
            MimeMessageHelper message = new MimeMessageHelper(mailMessage, true, "utf-8");
            message.setFrom(new InternetAddress(MimeUtility.encodeText("员工信息", "utf-8", null)
                    + " <" + mailFrom + ">"));
            message.setTo(mailReceiver);
            message.setSubject("创建员工" + people.getName() + "返回信息");
            message.setText(context, true);
            senderImpl.send(mailMessage);
        } catch (Exception e) {

            e.printStackTrace();
        }
    }
      在模板文件中用el表达式取
<tr>
    <th style="margin-left: 30px">1.name:</th>
    <td>${name}</td>
</tr>
<tr>
    <th style="margin-left: 30px">3.age:</th>
    <td>${age}</td>
</tr>
<tr> <th style="margin-left: 30px">3.gender:</th> <td>${gender}</td></tr>
      这里使用的主要的依赖包为

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
    <scope>compile</scope>
</dependency>
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.21</version>
    <scope>compile</scope>
</dependency>
       有几个坑需要填一下,第一个是用了模板引擎返回调用邮件服务成功,但是收不到邮件,打印context内容后,发现有好多”\r\n“,因为模板文件中有好多换行符,windows环境下换行符就是”\r\n“,然后我把所有”\r\n“替换掉就能收到邮件了,如果你也遇到同样问题,不妨试试;第二个就是springboot读取resource文件夹下的文件在windows和linux系统上是不一样的。在这里windows环境我用下面这种方式成功
InputStreamReader isr = new InputStreamReader(new FileInputStream(ResourceUtils.getFile("classpath:templates/template.ftl")),ENCODING);
     但是,我将项目打成jar,用Java -jar方式运行就报空指针错误找不到文件。我后来没用模板了,Java  -jar方式获取文件有什么不一样吗,欢迎给出建议。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值