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);
    }
}
目录
相关文章
|
29天前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
Spring Cloud Alibaba 发布了 Scheduling 任务调度模块 [#3732]提供了一套开源、轻量级、高可用的定时任务解决方案,帮助您快速开发微服务体系下的分布式定时任务。
14229 19
|
15天前
|
消息中间件 安全 Java
Spring Boot 基于 SCRAM 认证集成 Kafka 的详解
【8月更文挑战第4天】本文详解Spring Boot结合SCRAM认证集成Kafka的过程。SCRAM为Kafka提供安全身份验证。首先确认Kafka服务已启用SCRAM,并准备认证凭据。接着,在`pom.xml`添加`spring-kafka`依赖,并在`application.properties`中配置Kafka属性,包括SASL_SSL协议与SCRAM-SHA-256机制。创建生产者与消费者类以实现消息的发送与接收功能。最后,通过实际消息传递测试集成效果与认证机制的有效性。
|
15天前
|
人工智能 Java API
JeecgBoot 低代码平台快速集成 Spring AI
Spring 通过 Spring AI 项目正式启用了 AI(人工智能)生成提示功能。本文将带你了解如何在 Jeecg Boot 应用中集成生成式 AI,以及 Spring AI 如何与模型互动,包含 RAG 功能。
52 3
|
19天前
|
XML Java 数据库连接
Spring Boot集成MyBatis
主要系统的讲解了 Spring Boot 集成 MyBatis 的过程,分为基于 xml 形式和基于注解的形式来讲解,通过实际配置手把手讲解了 Spring Boot 中 MyBatis 的使用方式,并针对注解方式,讲解了常见的问题已经解决方式,有很强的实战意义。在实际项目中,建议根据实际情况来确定使用哪种方式,一般 xml 和注解都在用。
|
18天前
|
自然语言处理 安全 Java
Spring Boot中集成Lucence
本节课首先详细的分析了全文检索的理论规则,然后结合 Lucene,系统的讲述了在 Spring Boot 的集成步骤,首先快速带领大家从直观上感受 Lucene 如何建立索引已经如果检索,其次通过中文检索的具体实例,展示了 Lucene 在全文检索中的广泛应用。Lucene 不难,主要就是步骤比较多,代码不用死记硬背,拿到项目中根据实际情况做对应的修改即可。
|
17天前
|
NoSQL Java Redis
Spring Boot集成Redis全攻略:高效数据存取,打造性能飞跃的Java微服务应用!
【8月更文挑战第3天】Spring Boot是备受欢迎的微服务框架,以其快速开发与轻量特性著称。结合高性能键值数据库Redis,可显著增强应用性能。集成步骤包括:添加`spring-boot-starter-data-redis`依赖,配置Redis服务器参数,注入`RedisTemplate`或`StringRedisTemplate`进行数据操作。这种集成方案适用于缓存、高并发等场景,有效提升数据处理效率。
72 2
|
19天前
|
NoSQL Java API
Spring Boot 中集成Redis
主要介绍了 redis 的使用场景、安装过程,以及 Spring Boot 中集成 redis 的详细步骤。在实际项目中,通常都用 redis 作为缓存,在查询数据库的时候,会先从 redis 中查找,如果有信息,则从 redis 中取;如果没有,则从数据库中查,并且同步到 redis 中,下次 redis 中就有了。更新和删除也是如此,都需要同步到 redis。redis 在高并发场景下运用的很多。
|
24天前
|
监控 druid Java
spring boot 集成配置阿里 Druid监控配置
spring boot 集成配置阿里 Druid监控配置
126 6
|
21天前
|
JSON 缓存 Java
Spring Boot集成 Swagger2 展现在线接口文档
本节课详细分析了 Swagger 的优点,以及 Spring Boot 如何集成 Swagger2,包括配置,相关注解的讲解,涉及到了实体类和接口类,以及如何使用。最后通过页面测试,体验了 Swagger 的强大之处,基本上是每个项目组中必备的工具之一,所以要掌握该工具的使用,也不难。
|
1月前
|
SQL Java 数据库
实时计算 Flink版产品使用问题之Spring Boot集成Flink可以通过什么方式实现通过接口启动和关闭Flink程序
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。