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

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

作者头像
AI码真香
发布2022-09-13 17:39:29
4450
发布2022-09-13 17:39:29
举报
文章被收录于专栏:AI码真香

由于考虑到项目中需要,如果程序出现异常或其它问题,可以发送邮件来及时提醒后台维护人员处理。所以目前考虑使用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)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、导入jar包。首先我们需要在我们spring项目中添加以下两个jar包(我是使用的maven所以直接配置依赖信息)
  • 2、配置邮件服务器等信息。
  • 3、配置spring-dao.xml,在配置文件中导入properties文件的属性(根据自己项目实际情况来配置,mail.properties的扫描):
  • 4、编写一个测试类来测试一下:
  • 5、测试结果。如图:
  • 6、使用方法:
相关产品与服务
短信
腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档