springboot实现邮箱发送功能

news2025/1/21 15:40:57

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 邮箱效果图
  • 一、pom配置
  • 二、页面编写
  • 三、配置yml
  • 四、邮件工具类
  • 五、测试发送


邮箱效果图

在这里插入图片描述

1.可以利用在出现问题进行邮箱提醒
2.编写html 用于在邮箱中展示的样式


提示:以下是本篇文章正文内容,下面案例可供参考

一、pom配置

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--邮件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.3</version>
        </dependency>
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.28</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>

二、页面编写

<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>系统通知邮件模板-纯文本型</title>
</head>

<body>
<div style="font-size: 14px;">
    <br><br><br><br>
    <div style="width: 600px; margin: 0 auto; background-color: #00838a; border-radius: 3px;">
        <div style="padding: 0 15px; padding-bottom: 20px;">
            <div style="height: 72px;">
                <div>
                    <a href="https://www.lplovemm.love/" target="_blank" rel="noopener"
                       style="text-decoration: none;">
                        <img src="http://mall.bydauto.com.cn/pc/_nuxt/img/logo.97a8e60.svg" style="height: 72px;"
                             alt="BYD" title="BYD">
                    </a>
                </div>
            </div>
            <div style="background: #fff; padding: 20px 15px; border-radius: 3px;">
                <div><span style="font-size: 16px; font-weight: bold;">待办通知:</span>
                    <div style="line-height: 24px; margin-top: 10px;">
                        <div>
                            您有一条新的“
                            <span style="font-weight: bold;">订单询价</span>
                            待办,编号为“
                            <span style="font-weight: bold;" id="ip"></span>
                            ”,收到信息后请尽快
                            <a style="color: #006eff;font-weight: bold;" href="https://mall.bydauto.com.cn/"
                               target="_blank" rel="noopener">登录MALL系统</a>处理!
                        </div>
                    </div>
                </div>
                <div style="margin-top: 30px;">
                    <div><span
                            style="font-size: 15px; font-weight: bold; position: relative; top: -4px;">流程信息</span>
                    </div>
                    <table
                            style="width: 400px; border-spacing: 0px; border-collapse: collapse; border: none; margin-top: 20px;">
                        <tbody>
                        <tr style="height: 45px;">
                            <td
                                    style="width: 150px; height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;">
                                上一节点</td>
                            <td
                                    style="width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;">
                                订单咨询</td>
                        </tr>
                        <tr style="height: 45px;">
                            <td
                                    style="width: 150px;height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;">
                                处理人</td>
                            <td
                                    style="width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;">
                                张先生</td>
                        </tr>
                        <tr style="height: 45px;">
                            <td
                                    style="width: 150px; height: 40px; background: #F6F6F6;border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;">
                                当前节点</td>
                            <td
                                    style="width: 250px;height: 40px; border: 1px solid #DBDBDB; font-size: 14px; font-weight: normal; text-align: left; padding-left: 14px;">
                                <a style="color: #006eff;" href="https://mall.bydauto.com.cn/" target="_blank"
                                   rel="noopener">订单询价</a>
                            </td>
                        </tr>
                        </tbody>
                    </table>
                </div>
                <div style="margin-top: 60px;margin-bottom: 10px;"><span
                        style="font-size: 13px; font-weight: bold; color: #666;">温馨提醒</span>
                    <div style="line-height: 24px; margin-top: 10px;">
                        <div style="font-size: 13px; color: #666;">使用过程中如有任何问题,请联系LIMS系统管理员。</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div
            style="width: 600px; margin: 0 auto;  margin-top: 50px; font-size: 12px; -webkit-font-smoothing: subpixel-antialiased; text-size-adjust: 100%;">
        <p
                style="text-align: center; line-height: 20.4px; text-size-adjust: 100%; font-family: 'Microsoft YaHei'!important; padding: 0px !important; margin: 0px !important; color: #7e8890 !important;">
                <span class="appleLinks">
                    Copyright © 2023-2024 北京XXXX科技股份有限公司. 保留所有权利。</span>
        </p>
        <p
                style="text-align: center;line-height: 20.4px; text-size-adjust: 100%; font-family: 'Microsoft YaHei'!important; padding: 0px !important; margin: 0px; color: #7e8890 !important; margin-top: 10px;">
                <span class="appleLinks">
                    邮件由系统自动发送,请勿直接回复本邮件!</span>
        </p>
    </div>
</div>
</body>

</html>

三、配置yml

  #配置日志
  logging:
    level:
      root: info
    application:
      name: spring-boot-email
    mvc.async.request-timeout: 20000
  #配置邮箱
  mail:
    default-encoding: UTF-8
    host: smtp.163.com
    password: **********
    port: 465
    username: **********@163.com
    properties:
      mail:
        smtp:
          auth: true
          socketFactory:
            class: javax.net.ssl.SSLSocketFactory
          starttls:
            enable: true

四、邮件工具类

package com.information.utils;

import java.io.*;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.FileSystemResource;

/**
 * 发送邮件工具类
 */
public class MailUtil {

    private final static Logger logger = LoggerFactory.getLogger(MailUtil.class);

    /**
     * 邮件发送
     * @param mailHost 邮件服务地址
     * @param fromMail 发件人
     * @param fromName 发件人名
     * @param fromMailPwd 发件人密码
     * @param toMails 收件人,多个用英文逗号分隔
     * @param mailTitle 邮件标题
     * @param mailContent 邮件内容
     * @throws Exception
     */
    public static void sendMail(String mailHost, String fromMail, String fromName, String fromMailPwd,
                                String toMails, String mailTitle, String mailContent) throws Exception {
        String[] toMailArr = null;
        if (toMails != null && !toMails.equals("")) {
            toMailArr = toMails.split(",");
        } else {
            throw new Exception("邮件发送人不能为空");
        }

        // 邮件属性信息
        Properties props = new Properties();
        props.put("mail.host", mailHost);
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.auth", "true");

        Session session = Session.getInstance(props); // 根据属性新建一个邮件会话
        //session.setDebug(true); // 是否打印调试信息
        toMailArr = toMails.split(",");
        for (String to : toMailArr) {
            MimeMessage message = new MimeMessage(session); // 由邮件会话新建一个消息对象
            message.setFrom(new InternetAddress(fromMail,fromName));
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(to, fromName));// 设置收件人,并设置其接收类型为TO
            message.setSubject(mailTitle);// 设置标题
            message.setContent(mailContent, "text/html;charset=UTF-8"); // 设置邮件内容类型为html
            message.setSentDate(new Date());// 设置发信时间
            message.saveChanges();// 存储邮件信息


            // 发送邮件
            Transport transport = session.getTransport();
            transport.connect(fromMail, fromMailPwd);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        }
    }
 
    /**
     * 读取html文件为String
     * @param htmlFileName
     * @return
     * @throws Exception
     */
    public static String readHtmlToString(String htmlFileName) throws Exception{
        InputStream is = null;
        Reader reader = null;
        try {
            is = MailUtil.class.getClassLoader().getResourceAsStream(htmlFileName);
            if (is ==  null) {
                throw new Exception("未找到模板文件");
            }
            reader = new InputStreamReader(is, "UTF-8");
            StringBuilder sb = new StringBuilder();
            int bufferSize = 1024;
            char[] buffer = new char[bufferSize];
            int length = 0;
            while ((length = reader.read(buffer, 0, bufferSize)) != -1){
                sb.append(buffer, 0, length);
            }
            return sb.toString();
        } finally {
            try {
                if (is != null) {
                    is.close();
                }
            } catch (IOException e) {
                logger.error("关闭io流异常", e);
            }
            try {
                if (reader != null) {
                    reader.close();
                }
            } catch ( IOException e) {
                logger.error("关闭io流异常", e);
            }
        }
    }

}

五、测试发送

    @Autowired
    private JavaMailSender mailSender;
    /**
     * 发送者邮箱
     */
    @Value("${spring.mail.username}")
    public String MAIL_USERNAME;
    /**
     * 发送者host
     */
    @Value("${spring.mail.host}")
    public String MAIL_HOST;
    /**
     * 发送者秘钥
     */
    @Value("${spring.mail.password}")
    public String PASSWORD;
    @RequestMapping("/ip")
    @ResponseBody
    public String bc(HttpServletRequest request){
        try {
            List<String> list = new LinkedList<>();
            Enumeration enumeration = NetworkInterface.getNetworkInterfaces();
            while (enumeration.hasMoreElements()) {
                NetworkInterface network = (NetworkInterface) enumeration.nextElement();
                if (network.isVirtual() || !network.isUp()) {
                    continue;
                } else {
                    Enumeration addresses = network.getInetAddresses();
                    while (addresses.hasMoreElements()) {
                        InetAddress address = (InetAddress) addresses.nextElement();
                        if (address != null && (address instanceof Inet4Address || address instanceof Inet6Address)) {
                            list.add(address.getHostAddress());
                        }
                    }
                }
            }
            //获取id地址
            String ip= InetAddress.getLocalHost().getHostAddress();
            // 创建 HttpClient 实例
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            //根据ip地址和百度ip普通定位的ak,去获取具体位置
            String url = "https://api.map.baidu.com/location/ip?ip="+ip+"&coor=bd09ll&ak=***********";
            // 创建 HttpGet 请求
            HttpGet httpGet = new HttpGet(url);
            HttpResponse response = httpClient.execute(httpGet);
            HttpEntity entity = response.getEntity();
            // 转换为字符串
            String json = EntityUtils.toString(entity);
            Map map = (Map) JSONObject.parse(json); 
            Map content = (Map) map.get("content");
            Map point = (Map) content.get("point");
            JSONObject jsonObject = JSONObject.parseObject(point.toString());
            String x = jsonObject.getString("x");
            String y = jsonObject.getString("y");
            // 读取html模板
            String html = MailUtil.readHtmlToString("mailTemplate.html");
            // 将拿到的x和y的经纬度写入模板内容
            Document doc = Jsoup.parse(html);
            
            doc.getElementById("ip").html(ip);
            doc.getElementById("x").html(x);
            doc.getElementById("y").html(y);
            
            String result = doc.toString();
            String fromName = "小扎仙森";
            String toMails = "1046406274@qq.com";
            String mailTitle = "hello java mail";
            String mailContent = result;
             /**
			   * 邮件发送
			    * @param mailHost 邮件服务地址
			    * @param fromMail 发件人
			    * @param fromName 发件人名
			    * @param fromMailPwd 发件人密码
			    * @param toMails 收件人,多个用英文逗号分隔
			    * @param mailTitle 邮件标题
			    * @param mailContent 邮件内容
			    * @throws Exception
			*/
            // 发送邮件
            MailUtil.sendMail(MAIL_HOST, MAIL_USERNAME,fromName, PASSWORD, toMails, mailTitle, mailContent);
            return "邮箱发送成功";
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return "发送失败";
    }

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

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

相关文章

基于yolov2深度学习网络的打电话行为检测系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1、YOLOv2网络原理 4.2、基于YOLOv2的打电话行为检测 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 .................................…

MEFLUT: Unsupervised 1D Lookup Tables for Multi-exposure Image Fusion

Abstract 在本文中&#xff0c;我们介绍了一种高质量多重曝光图像融合&#xff08;MEF&#xff09;的新方法。我们表明&#xff0c;曝光的融合权重可以编码到一维查找表&#xff08;LUT&#xff09;中&#xff0c;该表将像素强度值作为输入并产生融合权重作为输出。我们为每次…

后端项目连接数据库-添加MyBatis依赖并检测是否成功

一.在pom.xml添加Mybatis相关依赖 在Spring Boot项目中&#xff0c;编译时会自动加载项目依赖&#xff0c;然后使用依赖包。 需要在根目录下pom.xml文件中添加Mybatis依赖项 <!-- Mybatis整合Spring Boot的依赖项 --> <dependency><groupId>org.mybatis.s…

【数据结构】——堆排序

前言&#xff1a;我们已经学习了堆以及实现了堆&#xff0c;那么我们就来给堆进行排序。我们怎么来进行排序呢&#xff1f;这一次我们就来解决这个问题。 如果我们堆排序要求排序&#xff0c;我们是建立大堆还是小堆呢&#xff0c;如果我们建的小堆的话&#xff0c;那我们在排序…

[PyTorch][chapter 3][李宏毅深度学习-偏差,方差,过拟合,欠拟合]

前言&#xff1a; 这章的目的主要是通过诊断错误的来源,通过错误的来源去优化,挑选模型。 通过本章掌握 过拟合(overfitting)和欠拟合(underfitting)出现原因及解决方案. 目录&#xff1a; 1 概述 2 方差,偏差现象 3 过拟合和欠拟合 4 模型选择 5 概率论回顾 一 概…

微信小程序获取手机号上限,怎么处理比较省钱

微信新规 微信2023年改了规则&#xff0c;原本免费的小程序获取手机号&#xff0c;现在如果要获取要1分钱一条。 有些小程序的用户非常恐怖&#xff0c; 比如一些工具类的&#xff0c; 群发类的。如果进入小程序就必须要获取小程序&#xff0c;就像是无底洞&#xff0c;让运营…

基于Java SSM框架实现高校二手交易平台系统项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架实现高校二手交易平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校二手交易平台&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将…

token认证机制,基于JWT的Token认证机制实现,安全性的问题

文章目录 token认证机制几种常用的认证机制HTTP Basic AuthOAuthCookie AuthToken AuthToken Auth的优点 基于JWT的Token认证机制实现JWT的组成认证过程登录请求认证 对Token认证的五点认识JWT的JAVA实现 基于JWT的Token认证的安全问题确保验证过程的安全性如何防范XSS Attacks…

网络篇---第七篇

系列文章目录 文章目录 系列文章目录前言一、什么是长连接和短连接?二、长连接和短连接的优缺点?三、说说长连接短连接的操作过程前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分…

鸿蒙4.0开发笔记之ArkTS装饰器语法基础@Builder组件内自定义构建函数与@Styles自定义组件重用样式(十)

文章目录 一、Builder自定义构建函数1、什么是自定义构建函数2、组件内定义构建函数3、组件外定义构建函数4、Builder装饰器练习 二、Styles重用样式函数1、重用样式的作用2、组件内定义Styles3、组件外定义4、Styles装饰器练习5、注意要点 一、Builder自定义构建函数 1、什么…

hql面试题之上海某资深数仓开发工程师面试题-求不连续月份的月平均值

1.题目 A,B两组产品的月平均值&#xff0c;月平均值是当月的前三个月值的一个平均值&#xff0c;注意月份是不连续的&#xff0c;如果当月的前面的月份不存在&#xff0c;则为0。如A组2023-04的月平均值为2023年1月的数据加2023-02月的数据的平均值&#xff0c;因为没有其他月…

redis的过期策略以及定时器的实现

Redis是客户端服务器结构的程序&#xff0c;客户端与服务器通过网络通信&#xff0c;所以对于keys *这种的操作在大型企业中不太建议&#xff0c;生产环境下的key会非常多&#xff0c;Redis是但现成的服务器&#xff0c;执行keys*的时间非常长&#xff0c;就会导致redis服务器阻…

Linux系统-----进程管理(进程的创建与控制)

目录 前言 进程 1.基本概念 2.特征 3.Linux系统的进程 进程的创建 1. fork()函数 2. 多进程的创建与输出 进程的控制 1. exec()系列 2. wait() 函数 3. execl( )和fork( )联合使用 4. exit&#xff08; &#xff09; 前言 前面我们学习了Linux系统的基本指令以及如…

软文推广中什么样的热点值得追?

只要媒体存在一日&#xff0c;那世界上就不会缺热点&#xff0c;追热点应该是每个运营er的必备技能&#xff0c;但是市面上的热点层出不穷&#xff0c;什么样的热点才值得追呢&#xff1f;接下来媒介盒子就和大家聊聊&#xff1a;判断热点值不值得追的三大要素。 一、 事件属性…

【机器学习 | 可视化】回归可视化方案

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

Redis 通用命令和数据类型

get和set get和set两个命令是最基本也是最常用的命令&#xff0c;主要用于操作字符串类型的数据。 1.SET 命令: SET 命令用于设置指定 key 的值。如果 key 已经持有其他值&#xff0c;SET 就覆写旧值&#xff0c;无视类型。具体的命令格式如下&#xff1a; SET key value例如…

在PyCharm中配置PyQt5环境

在PyCharm中配置PyQt5环境 文章目录 1.安装第三方库2.PyQt5设计器3.PyUIC转换工具 &#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1f339;꧔ꦿ&#x1…

redis 内存机制探索篇

info memory 查看redis 内存使用情况出现的问题&#xff0c;公司在导入大量redis key 的时候&#xff0c;想要看一下redis 内存使用情况 &#xff0c;发现used_memory_peak_perc 和 used_memory_dataset_perc 马上达到100%&#xff0c;这个时候很慌张&#xff0c;是不是当前red…

FreeRTOS学习之路,以STM32F103C8T6为实验MCU(2-12:内存管理)

学习之路主要为FreeRTOS操作系统在STM32F103&#xff08;STM32F103C8T6&#xff09;上的运用&#xff0c;采用的是标准库编程的方式&#xff0c;使用的IDE为KEIL5。 注意&#xff01;&#xff01;&#xff01;本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习…

王道p18 04.从有序顺序表中删除其值在给定值s与1之间(要求s<1)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。(c语言代码实现)

视频讲解在这里哦&#xff08;感谢支持&#xff01;&#xff09;&#x1f447; p18 第四题王道数据结构课后算法题&#xff08;c语言代码实现&#xff09;_哔哩哔哩_bilibili 本题代码如下 void deletest(struct sqlist* L, int s, int t) {int i 0;int j 0;if (s > t …