SpringBoot——邮件模块

2023-05-16

SpringBoot集成邮件模块

邮件协议

原文链接:https://blog.csdn.net/qq_37745470/article/details/89094227

什么是SMTP?
SMTP全称为Simple Mail Transfer Protocol(简单邮件传输协议),它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP认证要求必须提供账号和密码才能登陆服务器,其设计目的在于避免用户受到垃圾邮件的侵扰。

什么是IMAP?
IMAP全称为Internet Message Access Protocol(互联网邮件访问协议),IMAP允许从邮件服务器上获取邮件的信息、下载邮件等。IMAP与POP类似,都是一种邮件获取协议。

什么是POP3?
POP3全称为Post Office Protocol 3(邮局协议),POP3支持客户端远程管理服务器端的邮件。POP3常用于“离线”邮件处理,即允许客户端下载服务器邮件,然后服务器上的邮件将会被删除。目前很多POP3的邮件服务器只提供下载邮件功能,服务器本身并不删除邮件,这种属于改进版的POP3协议。

Spring提供的邮件服务接口和实现

JavaMailSender接口、JavaMailSenderImpl实现类

//注入JavaMailSenderImpl实现类
@Autowired
   private JavaMailSenderImpl mailSender;
//简单邮件SimpleMailMessage 
   SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
   simpleMailMessage.setFrom("2708169628@qq.com");
   simpleMailMessage.setTo("2708169628@qq.com");
   simpleMailMessage.setSubject("尝试发送邮件");
   simpleMailMessage.setText("一杯茶,一根烟,一个Bug改一天");
   mailSender.send(simpleMailMessage);

//复杂邮件MimeMessage
   MimeMessage mimeMessage = mailSender.createMimeMessage();
   MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage);
   messageHelper.setFrom("2708169628@qq.com");
   messageHelper.setTo("2708169628@qq.com");
   messageHelper.setSubject("尝试发送附件");
   messageHelper.setText("一杯茶,一根烟,一个Bug改一天!");
   messageHelper.addInline("login.png", new File("login.png"));
   messageHelper.addAttachment("work.docx", new File("work.docx"));
   mailSender.send(mimeMessage);

Spring邮件服务的自动配置

MailSenderPropertiesConfiguration 自动配置类

@Configuration
@ConditionalOnProperty(prefix = "spring.mail", name = "host")
class MailSenderPropertiesConfiguration {
    private final MailProperties properties;
    MailSenderPropertiesConfiguration(MailProperties properties) {
        this.properties = properties;
    }
    @Bean
    @ConditionalOnMissingBean
    public JavaMailSenderImpl mailSender() {
        JavaMailSenderImpl sender = new JavaMailSenderImpl();
        applyProperties(sender);
        return sender;
    }

MailProperties 参数配置

@ConfigurationProperties(prefix = "spring.mail")
public class MailProperties {
    private static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;
    private String host;
    private Integer port;
    private String username;
    private String password;
    private String protocol = "smtp";
    private Charset defaultEncoding = DEFAULT_CHARSET;
    private Map<String, String> properties = new HashMap<>();
}

SpringBoot集成邮件服务

开启QQ邮箱的POP3、SMTP、IMAP协议,生成授权码
在这里插入图片描述

application.properties

# tomcat port
server.port=8088

# thymeleaf

spring.thymeleaf.prefix=classpath:/templates/
spring.thymeleaf.check-template-location=true
spring.thymeleaf.mode=HTML
spring.thymeleaf.suffix=.html
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.cache=false

#email
spring.mail.host=smtp.qq.com
spring.mail.username=2708169628@qq.com
spring.mail.password=mhilempuoluhdeja#授权码
spring.mail.port=465
#设置为SSL协议
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
spring.mail.properties.from=liuy.yang@qq.com

前端页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://127.0.0.1:8088/mail/send" method="post" accept-charset="UTF-8" enctype="multipart/form-data" name="mailVo">
  收件人<input type="email" name="from"/>
  发件人<input type="email" name="to"/>
  主题<input type="text" name="subject"/>
  正文<input type="text"  name="text"/>
  附件  <input type="file" name="file" multiple/>
    <input type="submit">
</form>
</body>
</html>

后端参数接收VO

@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 MultipartFile[] multipartFiles;//邮件附件
}

邮件服务

package com.liu.mail.service;

import com.liu.mail.vo.MailVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.Part;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * MailServiceImpl
 *
 * @author liuy
 * @data 2021/10/5 10:47
 **/

@Service
@RequestMapping("/mail")
public class MailServiceImpl {

    @Autowired
    JavaMailSenderImpl mailSender;
    
    @PostMapping("/send")
    public MailVO send(MailVO mailVo, HttpServletRequest request){
        try {
            MultipartHttpServletRequest multipartHttpServletRequest= (MultipartHttpServletRequest) request;
            //获取文件集合  name:前端input设置的名字
            List<MultipartFile> file = multipartHttpServletRequest.getFiles("file");

            MultipartFile[] multipartFiles=file.toArray(new MultipartFile[10]);
            mailVo.setMultipartFiles(multipartFiles);
            checkMail(mailVo); //1.检测邮件
            sendMimeMail(mailVo); //2.发送邮件
            return saveMail(mailVo); //3.保存邮件
        } catch (Exception e) {
            mailVo.setStatus("fail");
            mailVo.setError(e.getMessage());
            return mailVo;
        }
    }

    /**
     * 构建复杂邮件
     * @param mailVo
     */
    private MailVO 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 (mailVo.getMultipartFiles() != null) {//添加邮件附件
                for (MultipartFile multipartFile : mailVo.getMultipartFiles()) {
                    if (multipartFile==null){
                        break;
                    }
                    messageHelper.addAttachment(multipartFile.getOriginalFilename(), multipartFile);
                }
            }
            if (mailVo.getSentDate()==null) {//发送时间
                mailVo.setSentDate(new Date());
                messageHelper.setSentDate(mailVo.getSentDate());
            }
            mailSender.send(messageHelper.getMimeMessage());//正式发送邮件
            mailVo.setStatus("ok");
            return mailVo;
        } catch (Exception e) {
            throw new RuntimeException(e);//发送失败
        }

    }

    /**
     * 邮件信息检查
     * @param mailVO
     */
    private void checkMail(MailVO mailVO) {
        if (mailVO.getTo()==null) {
            throw new RuntimeException("邮件收信人不能为空");
        }
        if (mailVO.getSubject()==null) {
            throw new RuntimeException("邮件主题不能为空");
        }
        if (mailVO.getText()==null) {
            throw new RuntimeException("邮件内容不能为空");
        }

    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot——邮件模块 的相关文章

随机推荐

  • TX2开发板CMake Error at CMakeLists.txt:11 (message): FATAL: In-source builds are not allowed.

    因为之前已经cmake过 把之前cmake生成的build目录中的文件 xff0c 以及opencv目录下生成的CmakeCache txt删除就可以解决了
  • 玩客云刷ARMBIAN当服务器过程记录

    玩客云的可玩性 1 可以刷成电视 43 游戏盒子的双系统 也可以刷成单独的电视盒子和游戏盒子 不过因为内存有限放不了多少游戏 还是建议用外置SD卡存储游戏比较合适 2 刷成Armbian linux系统 xff08 可以实现docker 可
  • Android9.0从系统层面修改android_id

    原因 按照android官方说明 xff0c android id会随着恢复出厂设置或重新烧录系统 xff0c 或切换用户登陆都会重新随机生成新的anroid id 因此对于一些依赖anroid id做唯一识别标识之一的软件来说就有问题了
  • Linux系统下基于Docker安装Yapi,并且迁移Yapi数据

    本文主要讲四个部分 xff1a 1 什么是Yapi 2 Centos7 下基于docker安装Yapi 3 Yapi数据迁移 4 利用Nginx反向代理 什么是Yapi YApi 是高效 易用 功能强大的 api 管理平台 xff0c 旨在
  • C语言多文件编程基本格式

    1 背景 xff1a 用一个丢骰子的简单案例熟悉了C语言多文件编程该咋写 2 格式 xff08 1 xff09 主函数文件main c 文件头part1 所有要使用的函数 include include include 文件头part2 放
  • STM32汇编程序及点灯实验

    目录 一 Keil下编写汇编程序1 新建工程2 配置环境3 测试代码 二 HEX文件格式说明1 简介2 格式说明3 举例说明 上述工程生成的 hex文件 三 基于STM32 汇编每间隔1秒钟闪烁一次LED的程序 一 Keil下编写汇编程序
  • c++单向链表逆序

    include lt iostream gt using namespace std struct node int data node next node createlist int n 创建一个链表 xff0c n为存储的数据个数 n
  • 目标检测6--NanodetPlus算法分析

    文章目录 1 简介2 辅助训练模块Assign Guidance Module3 损失函数4 标签匹配策略5 后处理介绍6 特征融合参考资料 欢迎访问个人网络日志 x1f339 x1f339 知行空间 x1f339 x1f339 1 简介
  • Couldn't find executable named map_saver below /opt/ros/indigo/share/map_server

    在使用 Mastering ROS for Robotics Programming PACKT 2015 学习ros xff0c 学习到第四章的时候 xff0c 先是安装Navigation一直找不到dependencies 换了源进行u
  • Linux之索引节点inode(index node)

    inode就是索引节点 xff0c 它用来存放档案及目录的基本信息 xff0c 包含时间 档名 使用者及群组等 inode 是 UNIX Linux 操作系统中的一种数据结构 xff0c 其本质是结构体 它包含了与文件系统中各个文件相关的一
  • String、StringBuffer、Stringbulider的区别

    java中用于处理字符串常用的有三个类 java lang String java lang StringBuffer java lang StrungBuilder 三者共同之处 都是final类 不允许被继承 xff0c 主要是从性能和
  • 常用集合List、Set、Map的比较

    概述 List Set Map都是接口 xff0c 前两个继承至Collection接口 xff0c Map为独立接口 List有序 xff0c 可重复 1 ArrayList 底层 xff1a 数组 xff1b 查询快 xff0c 增删慢
  • Apache中的默认编码

    好吧 xff0c 在Django上测试挺好的GBK编码的静态文件 xff0c 部署到Apache后乱码了 xff0c 默认编码变成了UTF 8 xff0c 可是meta中明明指定了charset为GBK的 xff1a lt meta htt
  • SpringDoc使用

    文章目录 1 SpringDoc简介2 SpringDoc基础使用 1 SpringDoc简介 SpringDoc是一款可以结合SpringBoot使用的API文档生成工具 2 SpringDoc基础使用 POM文件 span class
  • Result统一响应数据

    目录 1 响应数据的格式 1 1 状态码划分 1 3 响应数据的封装 2 统一数据返回 1 响应数据的格式 在分离的环境中 xff0c 我们前后交互就显得尤为重要 前端按照接口文档中的URL地址和参数要求发送请求 xff0c 接着后端对业务
  • SpringBoot实现全局异常处理器

    1 本文使用 64 ControllerAdvice 64 ExceptionHandler 进行全局的 Controller 层异常处理 不用在 Controller 层进行 try catch xff01 package com exa
  • 排序算法的对比

    冒泡排序VS选择排序 两者时间复杂度O n2 冒泡排序找最大值放在最后 xff0c 选择排序找最小值放在前面 选择排序属于不稳定排序 xff1b 选择排序一般情况下优于冒泡排序 xff0c 每轮只交换一次 如果集合有序度高 xff0c 则选
  • Redis基本操作

    安装Redis docker compose安装 单节点 version 34 3 3 34 services master image redis 6 0 container name redis environment 34 disco
  • RabbitMQ初级操作

    MQ 消息队列 xff1a 一种进程通信或同一进程的不同线程的通信方式 采用链表结构实现 xff0c 拥有权限的进程向消息队列写入或读取消息 常用MQ xff1a RabbitMQ ActiveMQ kafka xff0c Redis的Li
  • SpringBoot——邮件模块

    SpringBoot集成邮件模块 邮件协议 原文链接 xff1a https blog csdn net qq 37745470 article details 89094227 什么是SMTP xff1f SMTP全称为Simple Ma