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

2022-09-13 17:39:29 浏览数 (1)

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

1、导入jar包。首先我们需要在我们spring项目中添加以下两个jar包(我是使用的maven所以直接配置依赖信息)
代码语言:javascript复制
 <!--添加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复制
    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复制
 <!--读取属性文件-->
 <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复制
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复制
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复制
<?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复制
@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)

0 人点赞