java mail 通过 freemarker 发送邮件

2023-11-08

java mail 通过 freemarker 发送邮件

  1. 理解 java mail 核心类:
    1). MimeMessage 对象就是一封邮件。
    2). Session 定义系统属性信息。

  2. 具体代码如下:
    1). controller 层代码如下:

package com.tarena.mail.controller;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.tarena.mail.service.SendEmail;

@RequestMapping("/email")
@Controller
public class MailController {

    private Logger logger = Logger.getLogger(MailController.class);

    @Autowired
    private SendEmail sendEmail;

    @RequestMapping("/sendEmail")
    public void sendEmail(){
        logger.debug("enter sendEamil method...");
        sendEmail.sendMail();
        logger.debug("exit sendEmail method...");
    }
}

2). service 层代码如下:

package com.tarena.mail.service;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import com.tarena.freemarker.dto.User;
import com.tarena.mail.config.ConfigMessage;
import com.tarena.mail.controller.MailController;
import com.tarena.mail.dto.Mail_authenticator;

import freemarker.template.Template;
import freemarker.template.TemplateException;

@Service
public class SendEmail {

    private Logger logger = Logger.getLogger(MailController.class);

    @Autowired
    private FreeMarkerConfigurer freemarker;

    public void sendMail() {

        // 发件人地址
        String from = "zhaoxiaoyu@yundaex.com";
        // 收件人地址
        String to = "787029866@qq.com";

        // 设定系统属性
        Properties properties = System.getProperties();
        properties.setProperty("mail.smtp.host", ConfigMessage.getProperty("mail.smtp.host"));
        properties.put("mail.smtp.port", ConfigMessage.getProperty("mail.smtp.port"));
        properties.put("mail.smtp.auth", ConfigMessage.getProperty("mail.smtp.auth"));

        // 获取网络连接 授权
        Mail_authenticator auth = new Mail_authenticator("zhaoxiaoyu@yundaex.com", "Yd123456");
        // 获取 mail session 对象
        Session session = Session.getInstance(properties, auth);
        // 创建 消息 对象
        MimeMessage message = new MimeMessage(session);

        try {
            // 创建 MimeMessageHelper 对象
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(message, true, "utf-8");
            // 设置发件人地址
            mimeMessageHelper.setFrom(new InternetAddress(from));
            // 设置收件人地址
            mimeMessageHelper.setTo(new InternetAddress(to));

            // 设置主题
            mimeMessageHelper.setSubject("Hello world");

            // message.setText("This is my first sending email by java mail.");

            // 获取模版对象
            Template template = freemarker.getConfiguration().getTemplate("user.ftl");

            // 准备的 model data
            Map<String, User> map = new HashMap<String, User>();
            map.put("user", new User("Hellen", 20));

            // 解析 模版和 数据
            String content = FreeMarkerTemplateUtils.processTemplateIntoString(template, map);

            // file 本地路径下的文件
            File file = new File("G:/chrome download/学生.xls");
            // 添加附件
            mimeMessageHelper.addAttachment("学生.xls", file);

            // 添加内嵌图片
            mimeMessageHelper.addInline("picture", new File("E:/图片/美图图库/baby.jpg"));

            // 设置 消息内容
            mimeMessageHelper.setText(content, true);

            // 发送消息
            Transport.send(message);
            System.out.println("send email successfully...");

        } catch (AddressException e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        } catch (MessagingException e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        } catch (TemplateException e) {
            e.printStackTrace();
            logger.error(e.getMessage());
        }
    }

}
  1. mail_authenticator dto 代码如下:
package com.tarena.mail.dto;

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class Mail_authenticator extends Authenticator{

    private String userName;
    private String password;

    public Mail_authenticator(String userName, String password) {
        super();
        this.userName = userName;
        this.password = password;
    }

    public Mail_authenticator() {
        super();
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(userName, password) ;
    }

}
  1. spring 配置文件如下:
<!-- 配置 freemarker 模版加载路径 -->
<bean
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
    <property name="templateLoaderPath" value="ui/template" />
    <property name="defaultEncoding" value="UTF-8" />
</bean>
<!-- freemarker视图解析器 -->
<bean
    class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
    <property name="suffix" value=".ftl" />
    <property name="contentType" value="text/html;charset=UTF-8" />
    <!-- 此变量值为pageContext.request, 页面使用方法:rc.contextPath -->
    <property name="requestContextAttribute" value="rc" />
    <property name="order" value = "1" />
</bean>

5). user.ftl 模版文件如下:

<html>
<head>
</head>
<body>
    <table border="2 red solid">
        <tr>
            <td>username</td>
            <td>age</td>
        </tr>
        <tr>
            <td>${user.userName}</td>
            <td>${user.age}</td>
        </tr>
    </table>
    <div>
        <img src="cid:picture"/>
    </div>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java mail 通过 freemarker 发送邮件 的相关文章

随机推荐

  • C# Lock锁

    lock 关键字可以用来确保代码块完成运行 而不会被其他线程中断 它可以把一段代码定义为互斥段 critical section 互斥段在一个时刻内只允许一个线程进入执行 而其他线程必须等待 这是通过在代码块运行期间为给定对象获取互斥锁来实
  • 如何安装nvm(nvm 安装教程)

    如何安装nvm nvm 安装教程 一 nvm是什么 nvm是一个node的版本管理工具 可以简单操作node版本的切换 安装 查看等等 与npm不同的是 npm是依赖包的管理工具 二 安装nvm 1 nvm下载地址 https github
  • NDk AndRoid

    史上最全系列之开发环境搭建之NDK 2 作者 sk 更新于 06月01日访问 3432 评论 29 前言 由于Monica 小MM 一篇 史上最全Android开发环境搭建 一下子就包含了jdk android sdk ADT 等都包含了下
  • SpringBoot AOP @AfterThrowing+自定义注解+自定义异常使用

    简介 利用SpringBoot AOP在程序抛出异常时执行对应的操作 在需要的方法上打上自定义的注解 在切面中进行配置 切面接收的参数就是就是抛出的异常 自定义异常存放数据 适合抛出异常后要进行操作的情况 自定义注解 Target Elem
  • tf.multinomial()/tf.random.categorical()用法解析

    tf multinomial tf random categorical 用法解析 首先说一下 tf multinomial 在tensorflow2 0版本已经被移除 取而代之的就是tf random categorical 网上的很多博
  • 常用群体药动学模型评价方法:诊断图

    诊断图 分类 基于预测的模型诊断图 基于残差的模型诊断图 基于贝叶斯估算的模型诊断图 基于预测的模型诊断图 呈现实际观测值与群体 个体预测值的一致性 反映模型对于实测值的拟合程度 1 因变量 群体预测值 DV PRED 绘图 参考线 趋势线
  • SFB 项目经验-67-Exchange 2016删除指定主题邮件

    问题描述 1 员工错发群邮件 2 员工乱发群邮件 3 BOSS要求你批量删除错发群邮件或者乱发邮件 解决方法 通过网络搜索 再结合客户环境测试成功后 精简后的方法 1 使用search mailbox命令搜索后再删除的操作 可以实现邮件的删
  • sql 查询id最大的数据记录

    SELECT money consume type business id transaction log id FROM account consume records where id select max id from accoun
  • Qt入门(4)——Qt常见控件

    Qt提供了大量的内建控件及通用对话框可满足程序员的绝大部分要求 我们将对这些控件和对话框作一个大概的介绍 1 QLabel 定义 cpp view plain copy QLabel m labelOrdered newQLabel 0 t
  • Python:数据类型list的基本操作,list嵌套数组简述

    转自 北京图灵学院刘大拿 https study 163 com course introduction htm courseId 1004987028 后续补充来源 Python 廖雪峰 https www liaoxuefeng com
  • 求单链表长度(C语言)

    include
  • sublime text3打开文件,中文乱码问题解决办法

    一 首先要确保本机sublime已经有安装包管理器 如果没有 安装方法 http blog chinaunix net uid 12014716 id 4269991 html 文中的第一步 安装包管理器 二 安装乱码处理插件 调用ctrl
  • Linux下JDK安装及配置 (tar.gz版)

    安装环境 Linux JDK安装 tar gz为解压后就可以使用的版本 这里我将使用jdk 8u65 linux x64 tar gz版 安装到 usr java 下 步骤一 将文件jdk 8u65 linux x64 gz移动到 usr
  • 惯导系列(二):应用于惯性导航的滤波算法(最近在修正)

    前言 我又消失了一段时间 这段时间研究了惯性导航有关的算法 整理了不少博客 字数比较多 图片比较多 学到了很多知识 2023 8 5补充 惯性导航的滤波算法比较复杂 分析起来很难以理解 IMU滤波要考虑两种实际应用场所 一是分析惯导的姿态
  • 【GPU Gems 学习笔记】Implementing Improved Perlin Noise

    柏林噪声 柏林噪声算法 Perlin Noise 是Ken Perlin在1983年提出的一种渐变噪声 和完全随机的白噪声相比 柏林噪声做到了杂乱而有序 能够更好地模拟自然界中的随机现象的复杂性和相互间的关联性 常被用于电影视觉效果 a 一
  • dotnet跨域问题之预检请求的重定向

    浏览器模式是不允许预检请求的重定向的 redirect for a preflight request 场景 前后端分离情况下 不同域名的应用 当前端去dotnet core的web api接口中取数据时 出现了错误 跨域错误 错误的大概意
  • 使用Pandoc在命令行中转换文件

    Pandoc是用于将文件从一种标记语言转换为另一种标记语言的命令行工具 标记语言使用标签来注释文档的各个部分 常用的标记语言包括Markdown ReStructuredText HTML LaTex ePub和Microsoft Word
  • expr命令用法-实例讲解

    expr命令是一个手工命令行计数器 用于在UNIX LINUX下求表达式变量的值 一般用于整数值 也可用于字符串 格式为 expr Expression 命令读入Expression 参数 计算它的值 然后将结果写入到标准输出 参数应用规则
  • One PUNCH Man——深度学习入门

    文章目录 人类视觉原理 从神经网络到卷积神经网络 CNN 数据输入层 卷积计算层 卷积的计算 参数共享机制 激励层 池化层 全连接层 CNN优缺点 卷积神经网络的常用框架 人类视觉原理 深度学习的许多研究成果 离不开对大脑认知原理的研究 尤
  • java mail 通过 freemarker 发送邮件

    java mail 通过 freemarker 发送邮件 理解 java mail 核心类 1 MimeMessage 对象就是一封邮件 2 Session 定义系统属性信息 具体代码如下 1 controller 层代码如下 packag