Spring Boot集成JavaMailSender发送电子邮件

简介: Spring Boot集成JavaMailSender发送电子邮件

一、项目配置

1. 引入依赖

 <!--发送邮件依赖-->
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-mail</artifactId>
  </dependency>

2. 开启邮箱的SMTP协议

本文以QQ邮箱为例进行叙述。
在这里插入图片描述

3. 配置文件添加相关配置

#编码格式
spring.mail.default-encoding=UTF-8
#配置STMP服务器,此处使用QQ邮箱
spring.mail.host=smtp.qq.com
#发送邮件的用户名及授权码,注意不是登陆密码
spring.mail.username=xxxxxxx@qq.com
spring.mail.password=xxxxxx
#使用的协议
spring.mail.protocol=smtp

二、发送简单文本邮件

MailServiceImpl
代码如下(示例):

@Service
public class MailServiceImpl implements MailService {
    private Logger logger =  LoggerFactory.getLogger(MailServiceImpl.class);

    @Autowired
    JavaMailSender javaMailSender;

    @Override
    public void sendSimplMail() {
        SimpleMailMessage message = new SimpleMailMessage();
        //发件人
        message.setFrom("xxxxxx@qq.com");
        //收件人
        message.setTo("xxxxxxx@qq.com");
        //邮件标题
        message.setSubject("Come on!");
        //邮件内容
        message.setText("加油");
        javaMailSender.send(message);
        logger.info("邮件发送成功");
    }
 }

三、发送附件邮件

MailServiceImpl
代码如下(示例):

@Service
public class MailServiceImpl implements MailService {
    private Logger logger =  LoggerFactory.getLogger(MailServiceImpl.class);

    @Autowired
    JavaMailSender javaMailSender;
    @Override
    public void sendComplexMail(){
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        try{
            MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage,true);
            try{
                //发件人
                mimeMessageHelper.setFrom("xxxxxx@qq.com");
                //收件人
                mimeMessageHelper.setTo("xxxxxx@qq.com");
                //邮件标题
                mimeMessageHelper.setSubject("Happy");

                mimeMessageHelper.addInline("dog.gif",new File("D:/dog.gif"));
                mimeMessageHelper.addAttachment("test.doc",new File("D:/test.doc"));
                javaMailSender.send(mimeMessage);
                 logger.info("复杂邮件发送成功");
            } catch (MessagingException e) {
                logger.warn("邮件发送失败=====>"+e.getMessage());
            }
        } catch (MessagingException e) {
            e.printStackTrace();
        }


    }
}

三、邮件功能工具类

  1. MailVo 实体类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.File;
import java.util.Date;

@AllArgsConstructor
@NoArgsConstructor
@Data
public class MailVo {
    private String id;  //邮件id
    private String from;  //邮件发送人
    private String to;  //邮件接收人(多个邮箱则用逗号","隔开)
    private String subject;  //邮件主题
    private String text;  //邮件内容
    private Date sentDate;  //发送时间
    private String cc;  //抄送(多个邮箱则用逗号","隔开)
    private String bcc;  //密送(多个邮箱则用逗号","隔开)
    private String status;  //状态
    private String error;  //报错信息

    private File[] files;  //邮件附件
}
  1. MailUtil 工具类
import com.example.cabledisp.vo.MailVo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import javax.annotation.PostConstruct;
import java.io.File;
import java.util.Date;

@Component
public class MailUtil {
    private static Logger logger = LoggerFactory.getLogger(MailUtil.class);//提供日志类

    @Autowired
    private ApplicationContext applicationContext;

    private static JavaMailSender mailSender;

    @PostConstruct
    public void init(){
        MailUtil.mailSender = applicationContext.getBean(JavaMailSender.class);
    }

    /**
     * 邮箱信息检查,可根据实际需求更改
     * @param mailVo
     * */
    public static void checkMail(MailVo mailVo) {
        if (StringUtils.isEmpty(mailVo.getTo())) {
            throw new RuntimeException("邮件收信人不能为空");
        }
        if (StringUtils.isEmpty(mailVo.getSubject())) {
            throw new RuntimeException("邮件主题不能为空");
        }
        if (StringUtils.isEmpty(mailVo.getText())) {
            throw new RuntimeException("邮件内容不能为空");
        }
    }

    /**
     * 构建复杂邮件信息类
     * 附件邮件部分可优化
     *
     * @param mailVo
     * */
    public static void sendMimeMail(MailVo mailVo) {
        try {
            MimeMessageHelper messageHelper = new MimeMessageHelper(mailSender.createMimeMessage(), true); //true表示支持复杂类型
            messageHelper.setFrom(mailVo.getFrom()); //邮件发信人
            messageHelper.setTo(mailVo.getTo().split(",")); //邮件收信人
            messageHelper.setSubject(mailVo.getSubject()); //邮件主题
            messageHelper.setText(mailVo.getText()); //邮件内容
            if (!StringUtils.isEmpty(mailVo.getCc())) { //抄送
                messageHelper.setCc(mailVo.getCc().split(","));
            }
            if (!StringUtils.isEmpty(mailVo.getBcc())) { //密送
                messageHelper.setCc(mailVo.getBcc().split(","));
            }
            if (mailVo.getFiles() != null) { /添加邮件附件
                for (File file : mailVo.getFiles()) {
                    messageHelper.addAttachment(file.getName(), file);
                }
            }
            if (StringUtils.isEmpty(mailVo.getSentDate())) { //发送时间
                mailVo.setSentDate(new Date());
                messageHelper.setSentDate(mailVo.getSentDate());
            }
            System.out.println(messageHelper.getMimeMessage());
            mailSender.send(messageHelper.getMimeMessage()); //正式发送邮件
            mailVo.setStatus("ok");
            logger.info("发送邮件成功:{}->{}", mailVo.getFrom(), mailVo.getTo());
        } catch (Exception e) {
            throw new RuntimeException(e); //发送失败
        }
    }


    /**
     *  保存邮件,未完成
     *  可根据需求决定是否启用
     * @param mailVo
     * */
    public MailVo saveMail(MailVo mailVo) {
        //将邮件保存到数据库..
        return mailVo;
    }

}
  1. 测试
import com.example.cabledisp.vo.MailVo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.io.File;
import java.util.Date;


@SpringBootTest
@RunWith(SpringRunner.class)
public class MailServiceTest {
    @Autowired
    MailService mailService;

    @Test
    public void sendComplexMail() {
        mailService.sendComplexMail();
    }

    @Test
    public void Send() {
        File[] files = new File[1];
        MailVo mailVo = new MailVo();

        mailVo.setFrom("xxxxx@qq.com");
        mailVo.setTo("xxxxx@qq.com");
        mailVo.setSentDate(new Date());
        mailVo.setSubject("Mail工具类");
        mailVo.setText("Mail工具类");
        files[0] =new File("D:/test.doc");
        mailVo.setFiles(files);
        mailService.send(mailVo);
    }
}
目录
相关文章
|
3月前
|
数据可视化 Java BI
将 Spring 微服务与 BI 工具集成:最佳实践
本文探讨了 Spring 微服务与商业智能(BI)工具集成的潜力与实践。随着微服务架构和数据分析需求的增长,Spring Boot 和 Spring Cloud 提供了构建可扩展、弹性服务的框架,而 BI 工具则增强了数据可视化与实时分析能力。文章介绍了 Spring 微服务的核心概念、BI 工具在企业中的作用,并深入分析了两者集成带来的优势,如实时数据处理、个性化报告、数据聚合与安全保障。同时,文中还总结了集成过程中的最佳实践,包括事件驱动架构、集中配置管理、数据安全控制、模块化设计与持续优化策略,旨在帮助企业构建高效、智能的数据驱动系统。
211 1
将 Spring 微服务与 BI 工具集成:最佳实践
|
5月前
|
XML 人工智能 Java
Spring Boot集成Aviator实现参数校验
Aviator是一个高性能、轻量级的Java表达式求值引擎,适用于动态表达式计算。其特点包括支持多种运算符、函数调用、正则匹配、自动类型转换及嵌套变量访问,性能优异且依赖小。适用于规则引擎、公式计算和动态脚本控制等场景。本文介绍了如何结合Aviator与AOP实现参数校验,并附有代码示例和仓库链接。
337 0
|
5月前
|
安全 Java 数据库
第16课:Spring Boot中集成 Shiro
第16课:Spring Boot中集成 Shiro
790 0
|
5月前
|
消息中间件 存储 Java
第15课: Spring Boot中集成ActiveMQ
第15课: Spring Boot中集成ActiveMQ
487 0
|
6月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
676 0
|
9月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
475 0
|
9月前
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
351 0
|
3月前
|
监控 Cloud Native Java
Spring Integration 企业集成模式技术详解与实践指南
本文档全面介绍 Spring Integration 框架的核心概念、架构设计和实际应用。作为 Spring 生态系统中的企业集成解决方案,Spring Integration 基于著名的 Enterprise Integration Patterns(EIP)提供了轻量级的消息驱动架构。本文将深入探讨其消息通道、端点、过滤器、转换器等核心组件,以及如何构建可靠的企业集成解决方案。
316 0
|
5月前
|
Java 关系型数据库 数据库连接
Spring Boot项目集成MyBatis Plus操作PostgreSQL全解析
集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步骤与 MyBatis 类似,只不过在 MyBatis Plus 中提供了更多的便利功能,如自动生成 SQL、分页查询、Wrapper 查询等。
460 3

热门文章

最新文章