springboot实现邮箱发送功能

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

文章目录

  • 邮箱效果图
  • 一、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 "发送失败";
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Java语言判断一个数据类型是奇数还是偶数

判断一个数字类型是奇数&#xff0c;还是偶数&#xff0c;只需要引入Scanner类&#xff0c;然后按照数据类型的定义方式进行定义&#xff0c;比较是按照与2进行整除后的结果&#xff1b;如果余数为零&#xff0c;则代表为偶数&#xff0c;否则为奇数。 import java.util.Scann…

大数据 - MapReduce:从原理到实战的全面指南

本文深入探讨了MapReduce的各个方面&#xff0c;从基础概念和工作原理到编程模型和实际应用场景&#xff0c;最后专注于性能优化的最佳实践。 一、引言 1.1 数据的价值与挑战 在信息爆炸的时代&#xff0c;数据被视为新的石油。每天都有数以百万计的数据被生成、存储和处理&…

微软推出AI助手Copilot的正式版本;ChatGPT:七位研究人员分享他们的观点

&#x1f989; AI新闻 &#x1f680; 微软推出AI助手Copilot的正式版本 摘要&#xff1a;微软宣布其AI助手Copilot正式上线&#xff0c;此前Copilot的预览版已成为很多用户的日常AI伴侣。此次上线后&#xff0c;Copilot将继续提供AI驱动的网络聊天体验&#xff0c;并具备商业…

推荐系统-01-基于协同过滤的图书推荐系统(包括数据和代码)

文章目录 0. 数据下载1. 背景描述2. 预测目的3. 数据总览4. 开始处理4.1 图书4.1.1 yearOfPublication4.1.2 publisher 4.2 用户数据集4.2.1 userID4.2.2 Age 4.3 评级数据集4.3.1 统计 5. 基于简单流行度的推荐系统6. 基于协同过滤的推荐系统6.1 基于用户的协同过滤6.2 基于项…

LangChain学习指南(一)——Model IO

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Langchain是什么&#xff1f;二、官方文档Langchain这么长&#xff0c;我怎么看&#xff1f;三、Model IO2.1.1prompt2.1.2LLM2.1.3 OutputParsers 前言 本…

Csharp(C#)无标题栏窗体拖动代码

C#&#xff08;C Sharp&#xff09;是一种现代、通用的编程语言&#xff0c;由微软公司在2000年推出。C#是一种对象导向的编程语言&#xff0c;它兼具C语言的高效性和Visual Basic语言的易学性。C#主要应用于Windows桌面应用程序、Windows服务、Web应用程序、游戏开发等领域。C…

Jmeter接口自动化测试 —— Jmeter变量的使用

&#x1f4e2;专注于分享软件测试干货内容&#xff0c;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01;&#x1f4e2;交流讨论&#xff1a;欢迎加入我们一起学习&#xff01;&#x1f4e2;资源分享&#xff1a;耗时200小时精选的「软件测试」资…

Linux:dockerfile编写搭建tomcat练习(9)

我使用的httpyum仓库 本地使用了5个文件&#xff0c;tomcat使用的官网解压直接用的包】 Dockerfile 主配置文件 基于centos基础镜像 jdk1.8.0_91 java环境 run.sh 启动脚本 centos.repo 仓库文件 tomcat 源码包 vim Dockerfile写入FROM centos MAINTAINER ta…

倚天屠龙:Github Copilot vs Cursor

武林至尊&#xff0c;宝刀屠龙。号令天下&#xff0c;莫敢不从。倚天不出&#xff0c;谁与争锋&#xff01; 作为开发人员吃饭的家伙&#xff0c;一款好的开发工具对开发人员的帮助是无法估量的。还记得在学校读书的时候&#xff0c;当时流行CS架构的RAD&#xff0c;Delphi和V…

二维码智慧门牌管理系统升级解决方案:存疑地址轻松管理

文章目录 前言一、存疑地址的统一管理二、数据查询、导出和编辑功能三、提交地址审核机制 前言 随着二维码智慧门牌管理系统在企业中的广泛应用&#xff0c;地址存疑成为了一个亟待解决的问题。为了帮助企业有效管理这些存疑地址&#xff0c;我们推出了升级解决方案&#xff0…

YOLOv8改进 | 2023 | AKConv轻量级架构下的高效检测(既轻量又提点)

一、本文介绍 本文给大家带来的改进内容是AKConv是一种创新的变核卷积&#xff0c;它旨在解决标准卷积操作中的固有缺陷&#xff08;采样形状是固定的&#xff09;&#xff0c;AKConv的核心思想在于它为卷积核提供了任意数量的参数和任意采样形状&#xff0c;能够使用任意数量…

FreeRTOS-软件定时器

软件定时器 在FreeRTOS中可以设置无数个软件定时器&#xff0c;都是基于系统滴答中断。 使用软件定时器需要指定时间&#xff1a;启动定时器和运行回调函数。启动定时器和运行回调函数的间隔为定时器的周期。 使用软件定时器需要指定类型&#xff1a;一次性&#xff08;回调函数…

优维产品最佳实践第17期:善用控制台

「 背 景 」 遇到页面报错时&#xff0c;是不是感到困扰&#xff0c;不知如何解决&#xff1f; 页面响应缓慢时&#xff0c;是否感到迷茫&#xff0c;不清楚从何入手排查&#xff1f; 面对主机高负载时&#xff0c;是不是觉得确认异常根因很有挑战&#xff1f; 本期最佳实践…

变配电智能监控系统

变配电智能监控系统是一种能够实时监测电力变压器和配电柜、配电箱运行状态的智能设备。这种系统利用先进的传感器和数据通信技术&#xff0c;能够实时监测电力设备的运行状态&#xff0c;包括电压、电流、温度、湿度等参数&#xff0c;并且能够对这些数据进行处理和分析&#…

新媒体营销模拟实训室解决方案

一、引言 随着互联网的发展&#xff0c;新媒体已成为企业进行营销和品牌推广的重要渠道。然而&#xff0c;对于许多企业来说&#xff0c;如何在新媒体上进行有效的营销仍是一大挑战。为了解决这个问题&#xff0c;我们推出了一款新媒体营销模拟实训室解决方案&#xff0c;以帮…

焊接专业个人简历(通用25篇)

如果大家想在焊接行业的求职中脱颖而出&#xff0c;轻松斩获心仪职位&#xff0c;参考这25篇通用的焊接专业个人简历案例&#xff0c;无论您是初学者还是资深焊工&#xff0c;都能从中找到适合自己的简历内容。参考这些简历&#xff0c;让您的求职之路更加顺畅。 焊接专业个人…

Web漏洞分析-SQL注入XXE注入(中上)

随着互联网的不断普及和Web应用的广泛应用&#xff0c;网络安全问题愈发引起广泛关注。在网络安全领域中&#xff0c;SQL注入和XXE注入是两个备受关注的话题&#xff0c;也是导致许多安全漏洞的主要原因之一。本博客将深入研究这两种常见的Web漏洞&#xff0c;带您探寻背后的原…

C++基础 -38- 模板函数的局限性

模板函数无法对自定义数据类型进行操作(如类) 这个时候我们重载一个函数来匹配操作即可 #include "iostream"using namespace std;class base { public:base(int a) : a(a) {}int a; };template <class T, class T1> bool compare(T a, T1 b) {if (a > b…

蓝桥杯-03-蓝桥杯学习计划

蓝桥杯-03-蓝桥杯学习计划 参考资料 相关文献 报了蓝桥杯比赛&#xff0c;几乎零基础&#xff0c;如何准备&#xff0c;请大牛指导一下。谢谢&#xff1f; 蓝桥杯2022各组真题汇总(完整可评测) 基础学习 C语言网 ACM竞赛入门,蓝桥杯竞赛指南 廖雪峰的官方官网 算法题单 洛谷…

【JavaEE】单例模式

作者主页&#xff1a;paper jie_博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造&…