SpringBoot--发邮件的方法(有示例)

news2024/11/16 9:09:53

原文网址:SpringBoot--发邮件的方法(有示例)_IT利刃出鞘的博客-CSDN博客

简介

本文介绍SpringBoot发邮件的方法(有示例)。

依赖

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>

配置

163邮箱的配置

application.yml

spring:
  mail:
    default-encoding: UTF-8
    # 发送邮件服务器主机名,定值,来自QQ邮箱官网
    host: smtp.163.com
    # 163邮箱账号,你自己的奥
    username: xxx@163.com
    # 来自163邮箱官网的授权码,不是163邮箱密码奥
    password: yyyzzz
    # 端口号465或944,经过我的测试,发现两个都能用
    port: 465
    # 使用SSL方式
    properties:
      mail:
        smtp:
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory

163邮箱授权码的获取方式(对应上边的spring.mail.password)

开启IMAP/SMTP服务,可能需要使用手机发送验证码,按照要求发送就是了,如下:

QQ邮箱的配置

application.yml

spring:
  mail:
    default-encoding: UTF-8
    # 发送邮件服务器主机名,定值,来自QQ邮箱官网
    host: smtp.qq.com
    # 163邮箱账号,你自己的奥
    username: xxx@qq.com
    # 来自QQ邮箱官网的授权码,不是QQ邮箱密码奥
    password: yyyzzz
    # 端口号465或587,但是经过我的测试,发现只有587能用
    port: 587
    # 使用SSL方式
    properties:
      mail:
        smtp:
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory

QQ邮箱授权码的获取方式(对应上边的spring.mail.password)

如果获取授权码过程中需要你进行手机认证或者QQ安全中心的手机令牌,去按照说明验证就是了,下面不在提醒。

在百度上搜索 “QQ邮箱” ,进入官网并登录,点击 设置 (也可以从QQ进入邮箱)

如下图:

点击账户,如下:

往下滑动页面,找到 “POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务” ,开启 “POP3/SMTP服务” 和 “IMAP/SMTP服务”,如下图:

点击生成授权码,并复制授权码,如下:

解释发送邮件服务器主机名

找到上面提到的开启服务的地方,点击链接如下图:

发送普通文本

代码

package com.example.knife.controller;

import com.example.knife.entity.User;
import freemarker.template.Template;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

@Api(tags = "发送邮件")
@RestController
@RequestMapping("mail")
public class MailController {
    @Autowired
    private JavaMailSender javaMailSender;

    // 发件人邮箱账号
    private String from = "aaa@163.com";

    // 收件人邮箱账号
    private String[] to = {"123xx@qq.com"};

    // 抄送人邮箱账号
    private String[] cc = {"233xx@qq.com"};

    // 隐秘抄送人邮箱账号
    private String[] bcc = {"aaabbb@163.com"};

    @ApiOperation("发送简单邮件")
    @PostMapping("sendSimpleMail")
    public String sendSimpleMail() {
        SimpleMailMessage message = new SimpleMailMessage();

        // 发件人,不能省略
        message.setFrom(from);
        // 收件人,可以是多个,不能省略
        message.setTo(to);
        // 邮件标题,可以省略,省略之后展示的是:<无标题>
        message.setSubject("简单邮件");
        // 邮件正文,一定不能少,不然会报错,不能省略
        message.setText("你好,您的验证码是:" + "123456");
        // 设置邮件抄送人,可以有多个,可以省略
        message.setCc(cc);
        // 设置隐秘抄送人,可以有多个,可以省略
        message.setBcc(bcc);
        // 发送时间,这样设置的目的:告诉你可以自由设置,可以省略

        try {
            message.setSentDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                    .parse("2028-06-06 00:00:00"));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        // 发送
        javaMailSender.send(message);

        return "发送成功";
    }
}

测试

收到的邮件:

发送附件

代码

package com.example.knife.controller;

import com.example.knife.entity.User;
import freemarker.template.Template;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

@Api(tags = "发送邮件")
@RestController
@RequestMapping("mail")
public class MailController {
    @Autowired
    private JavaMailSender javaMailSender;

    // 发件人邮箱账号
    private String from = "aaa@163.com";

    // 收件人邮箱账号
    private String[] to = {"123xx@qq.com"};

    // 抄送人邮箱账号
    private String[] cc = {"233xx@qq.com"};

    // 隐秘抄送人邮箱账号
    private String[] bcc = {"aaabbb@163.com"};

    @ApiOperation("发送附件邮件")
    @PostMapping("sendAttachmentMail")
    public String sendAttachmentMail() {
        // 复杂邮件对象
        MimeMessage message = javaMailSender.createMimeMessage();

        try {
            // MimeMessageHelper对象,用来组装复杂邮件
            // 构建方法中第二个参数为true,代表支持替代文本、内联元素和附件
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            // 发件人,不能省略
            helper.setFrom(from);
            // 收件人,可以是多个,不能省略
            helper.setTo(to);
            // 邮件标题,可以省略,省略之后展示的是:<无标题>
            helper.setSubject("附件邮件");
            // 邮件正文,一定不能少,不然会报错,不能省略
            helper.setText("正文");
            // 添加附件,第一个参数是附件名称,第二个参数是附件对象
            helper.addAttachment("附件1.png", new File("E:\\tmp\\222.png"));
        } catch (MessagingException e) {
            e.printStackTrace();
        }

        // 发送
        javaMailSender.send(message);

        return "发送成功";
    }
}

测试

收到的邮件:

HTML(FreeMarker模板)

代码

Controller

package com.example.knife.controller;

import com.example.knife.entity.User;
import freemarker.template.Template;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.ui.freemarker.FreeMarkerTemplateUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.Map;

@Api(tags = "发送邮件")
@RestController
@RequestMapping("mail")
public class MailController {
    @Autowired
    private JavaMailSender javaMailSender;

    @Autowired
    private FreeMarkerConfigurer freeMarkerConfigurer;

    // 发件人邮箱账号
    private String from = "aaa@163.com";

    // 收件人邮箱账号
    private String[] to = {"123xx@qq.com"};

    // 抄送人邮箱账号
    private String[] cc = {"233xx@qq.com"};

    // 隐秘抄送人邮箱账号
    private String[] bcc = {"aaabbb@163.com"};

    @ApiOperation("发送模板邮件")
    @PostMapping("sendTemplateMail")
    public String sendTemplateMail() {
        // 复杂邮件对象
        MimeMessage message = javaMailSender.createMimeMessage();

        try {
            // MimeMessageHelper对象,用来组装复杂邮件
            // 构建方法中第二个参数为true,代表支持替代文本、内联元素和附件
            MimeMessageHelper helper = new MimeMessageHelper(message, true);
            // 发件人,不能省略
            helper.setFrom(from);
            // 收件人,可以是多个,不能省略
            helper.setTo(to);
            // 邮件标题,可以省略,省略之后展示的是:<无标题>
            helper.setSubject("附件邮件");

            User user = new User();
            user.setName("托尼");
            user.setNickName("钢铁侠");
            user.setAge(30);

            Map<String, Object> model = new HashMap<>();
            model.put("user", user);

            Template template = freeMarkerConfigurer.getConfiguration().getTemplate("email.ftl");
            String emailHtml = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);

            // 邮件正文,一定不能少,不然会报错,不能省略。第二个参数表示是否是html
            helper.setText(emailHtml, true);
        } catch (Exception e) {
            e.printStackTrace();
        }

        // 发送
        javaMailSender.send(message);

        return "发送成功";
    }
}

模板

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title></title>
    <style>
        td {
            border: black 1px solid;
        }
    </style>
</head>
<body>
<h1>用户的信息</h1>
<table style="border: black 1px solid;width: 750px">
    <tr>
        <td>姓名</td>
        <td>昵称</td>
        <td>年龄</td>
    </tr>
    <tbody>
    <tr>
        <td>${user.name}</td>
        <td>${user.nickName}</td>
        <td>${user.age}</td>
    </tr>
    </tbody>
</table>
</body>
</html>

测试

收到的邮件:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854739.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx简介与安装配置,目录结构和配置文件介绍

一.nginx简介 1.简介 2.特性 二.nginx安装 1.rpm包方式 &#xff08;1&#xff09;下载扩展源 &#xff08;2&#xff09;安装扩展rpm包&#xff0c;nginx -V查看配置参数&#xff0c;后面源码安装时要用到 2.源码方式 &#xff08;1&#xff09;建议提前下好所需要的部…

C语言系列之原码、反码和补码

一.欢迎来到我的酒馆 讨论c语言中&#xff0c;原码、反码、补码。 目录 一.欢迎来到我的酒馆二.原码 二.原码 2.1在计算机中&#xff0c;所有数据都是以二进制存储的&#xff0c;但不是直接存储二进制数&#xff0c;而是存储二进制的补码。原码很好理解&#xff0c;就是对应的…

Python读取excel数据并创建文件目录树-全解析过程及逻辑

需求描述&#xff1a; 需要将以下excel内的结构解析&#xff0c;并创建对应的文件目录 实现思路&#xff1a; 实现思路是通过解析Excel文件中的目录结构&#xff0c;并根据目录结构创建对应的文件夹。 具体的实现步骤如下&#xff1a; 1. 加载指定的Excel文件&#xff0c…

阿里云内容审核服务使用(图片审核)

说明&#xff1a;在项目中&#xff0c;我们经常会对用户上传的内容&#xff08;如文字、图片&#xff09;等资源内容进行审核&#xff0c;审核包括两方面&#xff0c;一方面是内容与描述不符&#xff0c;一方面是违反法律法规。本文介绍使用阿里提供的内容审核服务&#xff0c;…

《算法竞赛·快冲300题》每日一题:“最大团”

《算法竞赛快冲300题》将于2024年出版&#xff0c;是《算法竞赛》的辅助练习册。 所有题目放在自建的OJ New Online Judge。 用C/C、Java、Python三种语言给出代码&#xff0c;以中低档题为主&#xff0c;适合入门、进阶。 文章目录 题目描述题解C代码Java代码Python代码 “ 最…

zookeeperAPI操作与写数据原理

要执行API操作需要在idea中创建maven项目 &#xff08;改成自己的阿里仓库&#xff09;导入特定依赖 添加日志文件 上边操作做成后就可以进行一些API的实现了 目录 导入maven依赖&#xff1a; 创建日志文件&#xff1a; 创建API客户端&#xff1a; &#xff08;1&#xff09…

Java实现八皇后问题

八皇后问题说明 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于 1848 年提出&#xff1a;在 88 格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即&#xff1a;任意两个皇后都不…

【数据库】Redis可以替代Mysql吗

Redis和Mysql的搭配 Redis可以替代Mysql吗什么是RedisRedis适用的场景以及优点Redis的缺点 什么是MysqlMysql的优点Mysql缺点 总结 Redis可以替代Mysql吗 Redis不能代替MySQL&#xff0c; Redis和MySQL只能是一种互补。 什么是Redis Redis是一种非关系型数据库&#xff0c;也…

IDEA全局设置MyBatis中写SQL语句提示

把这两个设置改成MySQL即可&#xff1a;

clickhouse 删除操作

OLAP 数据库设计的宗旨在于分析适合一次插入多次查询的业务场景&#xff0c;市面上成熟的 AP 数据库在更新和删除操作上支持的均不是很好&#xff0c;当然 clickhouse 也不例外。但是不友好不代表不支持&#xff0c;本文主要介绍在 clickhouse 中如何实现数据的删除&#xff0c…

获取Spring中bean工具类

获取Spring中bean工具类 工具类 package com.geekmice.springbootselfexercise.utils;import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org…

【分布式系统】聊聊流量和数据调度

对于分布式系统来说&#xff0c;除了监控层面、以及服务治理层面&#xff0c;还有两个层面流量和数据调度。流量调度其实比较好理解&#xff0c;就是用户请求的流量&#xff0c;如何按照一定的策略算法打到不同的机器上。以及如何实现一个高可用、高性能的流量调度平台。而数据…

《CUDA C++ Programming Guide》第二章 CUDA 编程模型概述

2.1 内核 CUDA C 通过允许程序员定义称为kernel的 C 函数来扩展 C&#xff0c;当调用内核时&#xff0c;由 N 个不同的 CUDA 线程并行执行 N 次&#xff0c;而不是像常规 C 函数那样只执行一次。 使用 __global__ 声明说明符定义内核&#xff0c;并使用新的 <<<...&g…

CTF PWN之精确覆盖变量数据

刚开始接触pwn的朋友在做pwn练习时可能会有这样的疑问&#xff0c;怎么做到精确覆盖变量数据呢&#xff1f; 我们做pwn练习之前需要先知道&#xff1a;命令行参数C语言的main函数拥有两个参数&#xff0c;为int类型的argc参数&#xff0c;以及char**类型argv参数。其中argc参数…

进入现代云技术的世界-APIGateway、ServiceMesh、OpenStack、异步化框架、云原生框架、命令式API与声明式API

目录 APIGateway Service Mesh OpenStack 异步化框架 云原生框架 命令式API与声明式API APIGateway API网关&#xff08;API Gateway&#xff09;是一个服务器——充当了客户端和内部服务之间的中间层。API网关负责处理API请求&#xff0c;将客户端的请求路由到相应的后端…

centos8.5本地yum源报错

在下载文件出现以下错误 [rootserver ~]# yum install gcc Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. RHEL8.5-BaseOS …

上海亚商投顾:沪指录得4连阴 N盟固利盘中最高涨近37倍

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日延续调整走势&#xff0c;科创50指数跌超1%&#xff0c;创业板指则较为抗跌。医药医疗股集体爆发&#xf…

【网络基础实战之路】实现RIP协议与OSPF协议间路由交流的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

Pytorch深度学习-----神经网络模型的保存与加载(VGG16模型)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

前端先行模拟接口(mock+expres+json)

目录 mock模拟数据&#xff1a;data/static.js 路由&#xff1a;index.js 服务器&#xff1a;server.js yarn /node 启动服务器&#xff1a;yarn start 客户端&#xff1a;修改代理路径(修改设置后都要重启才生效) 示例 后端框架express构建服务器 前端发起请求 静态数…