前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >基于SSM的 spring 发送邮件的实现

基于SSM的 spring 发送邮件的实现

作者头像
AI码真香
发布于 2022-09-13 09:39:29
发布于 2022-09-13 09:39:29
49800
代码可运行
举报
文章被收录于专栏:AI码真香AI码真香
运行总次数:0
代码可运行

由于考虑到项目中需要,如果程序出现异常或其它问题,可以发送邮件来及时提醒后台维护人员处理。所以目前考虑使用JavaMail来实现邮件发送!如下,是我整理的一些内容,做个笔记记录下:(当然,在这功能实现之前,需要搭建好ssm的基本框架!)

1、导入jar包。首先我们需要在我们spring项目中添加以下两个jar包(我是使用的maven所以直接配置依赖信息)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <!--添加spring支持email 依赖-->
        <dependency>
              <groupId>org.springframework</groupId>
              <artifactId>spring-context-support</artifactId>
              <version>4.3.19.RELEASE</version>
        </dependency>
        <!--邮件发送-->
        <dependency>
              <groupId>com.sun.mail</groupId>
              <artifactId>javax.mail</artifactId>
              <version>1.6.1</version>
        </dependency>
2、配置邮件服务器等信息。
  • 先在邮箱中设置开启smtp和pop3服务然后拿到授权码(需要保存下来,配置到代码中):我这里使用的是QQ邮箱,如下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    mail.properties文件(邮件相关的配置):
    #服务器主机名 smtp.xx.com
    mail.smtp.host=smtp.qq.com
    mail.smtp.username=xxx@qq.com
    #密码/客户端授权码
    mail.smtp.password=这里填入第二步中生成的授权码
    #编码字符
    mail.smtp.defaultEncoding=utf-8
    #是否进行用户名密码校验
    mail.smtp.auth=true
    #设置超时时间
    mail.smtp.timeout=20000
3、配置spring-dao.xml,在配置文件中导入properties文件的属性(根据自己项目实际情况来配置,mail.properties的扫描):
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <!--读取属性文件-->
 <context:property-placeholder location="classpath:*.properties"/>

- 然后注入一个邮件发送的bean接口,并且初始化配置相关属性(我单独编写一个spring-mail.xml文件来配置,可以直接配置在spring-mvc.xml文件中):

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--配置邮件接口-->
        <bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
            <property name="host" value="${mail.smtp.host}"/>
            <property name="username" value="${mail.smtp.username}"/>
            <property name="password" value="${mail.smtp.password}"/>
            <property name="defaultEncoding" value="${mail.smtp.defaultEncoding}"/>
            <property name="javaMailProperties">
                <props>
                    <prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
                    <prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
                </props>
            </property>
        </bean>
    </beans>

所有配置都完成了

4、编写一个测试类来测试一下:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.mzj.study.controller;
    import com.mzj.study.utils.JsonData;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.mail.SimpleMailMessage;
    import org.springframework.mail.javamail.JavaMailSender;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;

   /**
     * Author: 小莫
     * Date: 2018-11-12 18:10
     * Description:<描述>
     */
    @RestController
    @RequestMapping("/email")
    public class SenEmailController {
        @Autowired
        private JavaMailSender javaMailSender;
        @Value("${mail.smtp.username}")
        private String emailFrom;
        @Value("${mail.smtp.tousername}")
        private String toEmail;
        @RequestMapping("send")
        public Object senMsg(){
            SimpleMailMessage message = new SimpleMailMessage();
            //发件人的邮箱地址
            message.setFrom(emailFrom);
            //收件人的邮箱地址
            message.setTo(toEmail);
            //邮件主题
            message.setSubject("spring email test!!!!");
            //邮件内容
            message.setText("收到的邮件内容:spring email test !!!");
            //发送邮件
            javaMailSender.send(message);
            return JsonData.success("success",message);
        }
    }
5、测试结果。如图:
  • 访问接口运行程序
  • 查看邮箱的收到的邮件信息

收到的邮件和我们预期的一样,说明功能就实现了。

这里提供一个工具类(MainUtil),该类封装了JavaMail 各种 email 格式发送的方法,可以直接在项目中使用 :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.gometech.tracker.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.List;

/**
 * Author: 小莫
 * Date: 2018-11-12 19:43
 * Description: 发送邮件工具类,封装了不同类型的邮件发送方法,根据实际情况使用
 */
public class MailUtil {

    private JavaMailSenderImpl mailSender;
    /**
     *   JavaMailSenderImpl支持 MimeMessages 和 SimpleMailMessages。
     * MimeMessages为复杂邮件模板,支持文本、附件、html、图片等。
     * SimpleMailMessages实现了MimeMessageHelper,为普通邮件模板,支持文本
     */
    private SimpleMailMessage simpleMailMessage;

    private static final Logger logger = LoggerFactory.getLogger(MailUtil.class);

    /**
     *功能描述: Spring 依赖注入 JavaMailSenderImpl 对象
     * @Author 小莫
     * @Date 22:19 2018/11/12
     * @Param [mailSender]
     * @return void
     */
    public void setMailSender(JavaMailSenderImpl mailSender) {
        this.mailSender = mailSender;
    }

    /**
     *功能描述: Spring 依赖注入 SimpleMailMessage 对象
     * @Author 小莫
     * @Date 22:19 2018/11/12
     * @Param [simpleMailMessage]
     * @return void
     */
    public void setSimpleMailMessage(SimpleMailMessage simpleMailMessage) {
        this.simpleMailMessage = simpleMailMessage;
    }

    /**
     *功能描述: 发送纯文本的简单邮件
     * @Author 小莫
     * @Date 22:18 2018/11/12
     * @Param [recipient, subject, content]
     * recipient 收件人 subject 主题 content 内容
     * @return void
     */
    public void send (String recipient,String subject,String content){
        System.out.println(simpleMailMessage);
        simpleMailMessage.setTo(recipient);
        simpleMailMessage.setSubject(subject);
        simpleMailMessage.setText(content);
        try {
            mailSender.send(simpleMailMessage);
            logger.info("简单邮件已经发送...");
        } catch (MailException e) {
            //这里直接抛出异常
            throw e;
        }
    }

    /**
     *功能描述: 群发送纯文本的简单邮件
     * @Author 小莫
     * @Date 22:17 2018/11/12
     * @Param [recipients, subject, content]
     * recipients 收件人 subject 主题 content 内容
     * @return void
     */
    public void send(List<String> recipients, String subject, String content){
        simpleMailMessage.setTo(recipients.toArray(new String[recipients.size()]));
        simpleMailMessage.setSubject(subject);
        simpleMailMessage.setText(content);
        try {
            mailSender.send(simpleMailMessage);
            logger.info("群发邮件已经发送...");
        } catch (MailException e) {
            //这里直接抛出异常
            throw e;
        }
    }

    /**
     *功能描述: 发送带附件的邮件
     * @Author 小莫
     * @Date 22:17 2018/11/12
     * @Param [recipient, subject, content, filepath]
     * recipients 收件人 subject 主题 content 内容 filepath 文件路径
     * @return void
     */
    public void sendWithFile(String recipient,String subject,String content,String filepath) throws MessagingException {
        //使用JavaMail的MimeMessage,支持更加复杂的邮件格式和内容
        MimeMessage msg = mailSender.createMimeMessage();
        //创建MimeMessageHelper对象,处理MimeMessage的辅助类
        MimeMessageHelper helper = new MimeMessageHelper(msg, true);
        //使用辅助类MimeMessage设定参数
        helper.setFrom(mailSender.getUsername());
        helper.setTo(recipient);
        helper.setSubject(subject);
        //设置属性为true,让设置的html内容以html格式正确显示
        helper.setText(content,true);

        //生成日志附件文件
        File file = new File(filepath);
        FileSystemResource resource = new FileSystemResource(file);

        //加入附件
        helper.addAttachment(resource.getFilename(),resource);
        try {
             // 发送邮件
            mailSender.send(msg);
            logger.info("带附件的邮件已经发送...");
        } catch (MailException e) {
           throw e;
        }
    }

    /**
     *功能描述: 群发送带附件的邮件
     * @Author 小莫
     * @Date 22:17 2018/11/12
     * @Param [recipient, subject, content, file]
     * @return void
     */
    public void sendAllWithFile(List<String> recipients,String subject,String content,String filepath) throws MessagingException {
        //使用JavaMail的MimeMessage,支持更加复杂的邮件格式和内容
        MimeMessage mimeMessage = mailSender.createMimeMessage();
        //创建MimeMessageHelper对象,处理MimeMessage的辅助类
        MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true);
        //使用辅助类MimeMessage设定参数
        messageHelper.setFrom(mailSender.getUsername());
        messageHelper.setTo(recipients.toArray(new String[recipients.size()]));
        messageHelper.setSubject(subject);
        messageHelper.setText(content,true);

        //生成日志附件文件
        File file = new File(filepath);
        FileSystemResource resource = new FileSystemResource(file);

        //加入附件
        messageHelper.addAttachment(resource.getFilename(),resource);
        // 发送邮件
        try {
            mailSender.send(mimeMessage);
            logger.info("群发带附件的邮件已经发送...");
        } catch (MailException e) {
           throw e;
        }
    }

    /**
     *
     * @param
     * @param
     * @param
     */
    /**
     *功能描述: 发送嵌入静态资源(一般是图片)的邮件
     * @Author 小莫
     * @Date 13:44 2018/11/13
     * @Param [to, subject, content, rscPath, rscId]
     * content 邮件内容,需要包括一个静态资源的id,比如:"<img src='cid:xm'>"
     * rscPath 静态资源路径和文件名
     * rscId 静态资源 id
     * @return void
     */
    public void sendInlineResourceMail(String recipient, String subject, String content, String rscPath, String rscId) throws MessagingException {
        MimeMessage message = mailSender.createMimeMessage();

        try {
            MimeMessageHelper helper = setInfoByHelper(recipient, subject, content, message);

            FileSystemResource res = new FileSystemResource(new File(rscPath));
            helper.addInline(rscId, res);
            mailSender.send(message);
            logger.info("嵌入静态资源的邮件已经发送...");
        } catch (MessagingException e) {
            throw e;
        }
    }
    /**
     *功能描述: 利用 helper 初始化邮件发送相关的配置信息
     * @Author 小莫
     * @Date 13:55 2018/11/13
     * @Param [recipient, subject, content, message] 
     * @return org.springframework.mail.javamail.MimeMessageHelper
     */
    private MimeMessageHelper setInfoByHelper(String recipient, String subject, String content, MimeMessage message) throws MessagingException {

        //true表示需要创建一个multipart message
        MimeMessageHelper helper = new MimeMessageHelper(message, true);
        //发送人的邮件地址,配置文件中已经注入,直接获取即可
        helper.setFrom(mailSender.getUsername());
        //收件人的邮箱
        helper.setTo(recipient);
        //邮件主题
        helper.setSubject(subject);
        //邮件的内容  true 是代表的html格式生效
        helper.setText(content, true);
        return helper;
    }
}
  • 注意:如果需要注入方式引用 MainUtil 的对象,需要将其加入 IOC 中,JavaMailSenderImpl、SimpleMailMessage 对象通过属性配置的方式注入,这里提供一个 mail 的配置文件,相关配置更换成自己项目信息即可用:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--配置simpleMailMessage 实例-->
    <bean id="simpleMailMessage" class="org.springframework.mail.SimpleMailMessage">
        <!--配置发件人的邮箱地址-->
        <property name="from" value="${mail.smtp.username}"/>
        <!--配置收件人的邮箱地址-->
        <property name="to" value="${mail.smtp.tousername}"/>
    </bean>

    <!--配置JavaMailSenderImpl 邮件接口实现类-->
    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="${mail.smtp.host}"/>
        <property name="username" value="${mail.smtp.username}"/>
        <property name="password" value="${mail.smtp.password}"/>
        <property name="defaultEncoding" value="${mail.smtp.defaultEncoding}"/>
        <property name="javaMailProperties">
            <props>
                <prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
                <prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
                <prop key="mail.smtp.ssl.enable">${mail.smtp.ssl.enable}</prop>
                <prop key="mail.smtp.port">${mail.smtp.port}</prop>

                <!--配置端口 ,阿里云25端口禁用,使用465端口-->
                <prop key="mail.smtp.socketFactory.port">${mail.smtp.socketFactory.port}</prop>
                <prop key="mail.smtp.socketFactory.fallback">${mail.smtp.socketFactory.fallback}</prop>
                <prop key="mail.smtp.socketFactory.class">${mail.smtp.socketFactory.class}</prop>
            </props>
        </property>
    </bean>

    <!--将 mailUtil 类加入IOC容器中管理,并且为属性注入对应的值-->
    <bean id="mailUtil" class="com.gometech.tracker.util.MailUtil">
        <!--注入JavaMailSenderImpl对象-->
        <property name="mailSender" ref="mailSender"/>
        <!--注入SimpleMailMessage 对象-->
        <property name="simpleMailMessage" ref="simpleMailMessage"/>
    </bean>
</beans>
6、使用方法:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Autowired
    private MailUtil mailUtil;
    /**
     *功能描述: 捕获抛出的所有系统类异常,并将异常的log信息群发给相关处理人
     * 备注:这里可以发送短信提醒也可以发送邮件提醒,后续根据业务需要再修改
     * @Author 小莫
     * @Date 14:16 2018/11/13
     * @Param [e, request]
     * @return JsonData
     */
    @ExceptionHandler(Exception.class)
    public ResponseResult errorHandler(Exception e, HttpServletRequest request) throws MessagingException {
        log(e,request);
        //mailUtil.send("xxx@163,com","程序出现异常!!!","程序出现异常了,请尽快处理....");

        //将异常信息转化为字符串内容输出到email内容中去
        StringWriter stringWriter = new StringWriter();
        PrintWriter printWriter = new PrintWriter(stringWriter);
        e.printStackTrace(printWriter);

        //添加群发的收件人邮箱
        List<String> persons = new ArrayList<String>();
        persons.add("xxx@163.com");
        persons.add("xxx@163.com");
		....
        //服务器log文件日志路径
        String filepath ="/usr/local/src/apache-tomcat-8.5.34/logs/tracker/error.log";

        mailUtil.sendAllWithFile(persons,"程序出现异常,请及时处理!!!",stringWriter.toString(),filepath);

        return ResponseResult.fail("程序出现未知错误...");
}

本文作者: AI码真香

本文标题: 基于SSM的 spring 发送邮件的实现

本文网址: https://www.xmlvhy.com/article/74.html

版权说明: 自由转载-非商用-非衍生-保持署名 署名-非商业性使用4.0 国际 (CC BY-NC 4.0)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
为什么用python 函数
为什么用python 函数 为什么用python 函数? 为什么用python 函数? 使用函数可以减少重复代码。 装饰器 装饰器干嘛的? 不改变现有函数的调用方式,同时扩展新功能 满足开放封闭原则:对扩展是开放的,对修改是封闭的 装饰器原理: - 利用闭包函数的方法,调用函数时返回内部函数对象 - 装饰器只是语法糖
以谁为师
2019/05/29
7790
python 函数(二)
3.filter() 函数,   相当于过滤器,不符合条件的过滤掉,返回的值是过滤后的内容
py3study
2020/01/17
3370
Python进阶教程笔记(七)函数式编程
由于参数 x, y 和 f 都可以任意传入,如果 f 传入其他函数,就可以得到不同的返回值。
Lemon黄
2020/10/30
4800
Python进阶教程笔记(七)函数式编程
Python常用的几种常用的内置函数(干货)
divmod(x,y) 函数中传入两个数字,返回的是x/y的一个结果的元组(商,余数)
Python知识大全
2020/02/13
6740
Python常用的几种常用的内置函数(干货)
Python高阶函数
在了解什么是高阶函数之前,我们来看几个小例子。我们都知道在 python 中一切皆对象,函数也不例外。比如求绝对值函数 abs,我们可以用一个变量 f 指向 abs 函数,那么当调用 f() 的时候可以得到和 abs() 一样的效果,这说明变量可以指向函数!
Python编程与实战
2019/12/03
5630
Python小世界:匿名函数、高阶函数、
木子本人搞起Python已有多年,一直觉得什么都会,但是有时候实操起来,才觉得很多底层基础的知识都没有彻底的灵活掌握。 另外,网上关于Python基础知识的各种普及已有太多太多。 附上相关大神的技术栈:
py3study
2020/01/15
4800
Python 基础 高阶函数
python 把函数作为参数   如果传入abs 作为参数     def add(x,y,y):       return f(x) + f(y)     add(-5,9,abs)   根据函数的定义,函数执行的代码实际上是。     abs(-5) + abs(9) python 中map() 函数     map() 是 python 内置的高阶函数,它接收一个函数 f 和 一个list,并且把 f 一次作用在     list的每一个元素上,得到一个新的list 并返回。     我们需要传入函数
用户1197315
2018/04/03
7150
5.python函数
函数介绍 定义:  函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可。 特性:减少重复代码、使程序变的可扩展、使程序变得易维护  1.普通参数 def func(name): #name是形式参数 print(name) #函数体 func('derek') #执行函数,'derek'是传入的实参 2.默认参数 定义了默认参数后,在函数调用时不需要再传入,默认参数放在最后面 def info(name,age,countr
zhang_derek
2018/04/11
6680
Python基础【高阶函数】
高阶函数 map(fun,seq) 将seq中的元素依次作为参数传入fun,返回由函数返回值组成的新的列表。 python3:返回一个map对象 python2:返回列表 可以用list将对象转换为列
py3study
2020/01/15
3760
Python编程 高阶函数使用技巧
高阶函数指的是能接收一个或多个函数作为参数的函数,python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率。
快学Python
2021/08/09
3810
走近 Python (类比 JS)
Python 是一门运用很广泛的语言,自动化脚本、爬虫,甚至在深度学习领域也都有 Python 的身影。作为一名前端开发者,也了解 ES6 中的很多特性借鉴自 Python (比如默认参数、解构赋值、Decorator等),同时本文会对 Python 的一些用法与 JS 进行类比。不管是提升自己的知识广度,还是更好地迎接 AI 时代,Python 都是一门值得学习的语言。 数据类型 在 Python 中,最常用的能够直接处理的数据类型有以下几种: 数字[整数(int)、浮点型(float)、长整型(long
前端教程
2018/03/05
1.1K0
<建议收藏😃>Python高阶函数详解
本文结合各种实际的例子详细讲解了Python5个内建高阶函数的使用,能够帮助理解Python的数据结构和提高数据处理的效率,这5个函数分别是:
皮大大
2020/10/25
6130
面试题-python3 内置函数map reduce filter 如何使用?
map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。 map() 函数语法:map(function, iterable, …)
上海-悠悠
2021/04/09
7140
python内置常用高阶函数(列出了5个
引用自:http://www.cnblogs.com/duyaya/p/8562898.html
py3study
2020/01/16
6300
python内置常用高阶函数(列出了5个
python高阶函数和枚举
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中,可同时得到数据对象的值及对应的索引值。 举个例子:
李玺
2021/11/22
4040
python高阶函数和枚举
高阶函数
==把函数作为参数传入==,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。
生信喵实验柴
2023/09/04
1600
高阶函数
python中一些有用的函数------
函数isinstance()可以判断一个变量的类型,既可以用在Python内置的数据类型如str、list、dict,也可以用在我们自定义的类,它们本质上都是数据类型。
py3study
2020/01/15
4430
这几个Python内置的高阶函数,真香
什么是高阶函数?,一句话,就是可以接受其他函数名称作为自己参数的函数。函数式编程说的就是这个。Python中一切皆对象,函数也是一个对象,可以作为变量名称传递给其他函数调用,高阶函数就是一种特殊的函数,有 5 个内置的函数可以大大提高我们的编程效率,分别是 sorted、filter、zip、map、reduce,这里除了 zip 函数,其他都是高阶函数。它们的用武之地非常广泛,要不也不会作为内置函数了。今天分享下它们的用法,掌握之后,你一定会觉得,真香!
somenzz
2020/11/25
4010
这几个Python内置的高阶函数,真香
Python全栈开发之函数
正常情况下,给函数传递参数需要按照定义的顺序,不想按顺序就要使用关键参数,但是关键参数必须放在普通参数之后
py3study
2020/01/10
4000
Python基础(十九):函数加强
把函数作为参数传入 ,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。
Lansonli
2022/12/29
5650
Python基础(十九):函数加强
相关推荐
为什么用python 函数
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 1、导入jar包。首先我们需要在我们spring项目中添加以下两个jar包(我是使用的maven所以直接配置依赖信息)
  • 2、配置邮件服务器等信息。
  • 3、配置spring-dao.xml,在配置文件中导入properties文件的属性(根据自己项目实际情况来配置,mail.properties的扫描):
  • 4、编写一个测试类来测试一下:
  • 5、测试结果。如图:
  • 6、使用方法:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档