java发送邮件到qq邮箱

news2024/11/19 19:39:31

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自己的授权码自己记好
引入依赖

<dependency>
   <groupId>com.sun.mail</groupId>
    <artifactId>javax.mail</artifactId>
    <version>1.6.2</version>
</dependency>
<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>javax.mail-api</artifactId>
    <version>1.4.7</version>
</dependency>

controller层代码

package com.cao.controller;

import com.cao.pojo.Mail;
import com.cao.utils.EmailUtils;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/email")
@Slf4j
public class SendEmailController {

    @PostMapping("/send") // http://localhost:8080/api/email/send
    public String sendEmail(@RequestBody Mail mail) {
        Gson gson = new Gson();
        log.info("输入的mail对象是: {}", gson.toJson(mail));
        try {
            EmailUtils.createMimeMessage(mail.getSendEmail(),
                    mail.getReceiveEmail(),
                    mail.getReceiveName(),
                    mail.getSubject(),
                    mail.getSendName(),
                    mail.getContent());
            return "发送完成";
        } catch (Exception e) {
            log.error("发送出现了异常", e);
            throw new RuntimeException(e);
        }
    }
}

Service层代码

package com.cao.utils;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Date;
import java.util.Properties;

public class EmailUtils {
    /**
     * 发件⼈邮箱密码 - 登录邮件开启 SMTP 服务后,邮件服务商⽣成的“授权码”
     */
    public static final String authorizeCode = "oeqdschg1122lhgecbe12";  //自己的授权码替换下

    /**
     * 发件⼈SMTP服务器地址,⼀般的格式为:smtp.xxx.com,其中xxx为邮件服务商名称
     */
    public static final String smtpHost = "smtp.qq.com";

    /**
     * 协议
     */
    public static final String protocol = "smtp";

    public static Session getEmailSession() {
        // 参数配置,⽤于连接邮件服务器
        Properties props = new Properties();
        // 使⽤协议
        props.setProperty("mail.transport.protocol", protocol);
        // 发件⼈邮箱的 SMTP 服务器地址
        props.setProperty("mail.smtp.host", smtpHost);
        // 需要请求认证
        props.setProperty("mail.smtp.auth", "true");
        // 创建会话对象,⽤于与邮箱服务器交互
        Session session = Session.getInstance(props);
        // 设置为debug模式,在控制台中可以查看详细的发送⽇志
        session.setDebug(true);
        return session;
    }

    /**
     * 发送邮件的工具类
     */
    public static MimeMessage createMimeMessage(String sendEmail, String receiveEmail, String receiveName, String subject, String sendName, String content) throws Exception {
        Session session = getEmailSession();
        // 1.创建邮件对象
        MimeMessage message = new MimeMessage(session);
        // 2.设置发件⼈,其中 InternetAddress 有三个参数,分别为:邮箱,显示的昵称,昵称的字符集编码
        message.setFrom(new InternetAddress(sendEmail, sendName, "UTF-8"));
        // 3.设置收件⼈ - MimeMessage.RecipientType.TO
        message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveEmail, receiveName, "UTF-8"));
        // 4.设置邮件主题
        message.setSubject(subject, "UTF-8");
        // 5.设置邮件正⽂内容,指定格式为HTML格式
        message.setContent(content, "text/html;charset=UTF-8");
        // 6.设置显示发件时间
        message.setSentDate(new Date());
        // 7.保存设置
        message.saveChanges();
        // 8.根据 Session 获取邮件传输对象
        Transport transport = session.getTransport();
        // 9.连接邮件服务器
        transport.connect(sendEmail, authorizeCode);
        // 10.发送邮件
        transport.sendMessage(message, message.getAllRecipients());
        // 11.关闭连接
        transport.close();
        return message;
    }
}

测试: 调用controller
在这里插入图片描述
在这里插入图片描述
查看是否有邮件收到
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

[C#]使用OpenCvSharp实现区域文字提取

【官方框架地址】 github.com/shimat/opencvsharp 【算法介绍】 采用opencv算法实现文字区域提取&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;形态学操作 &#xff08;2&#xff09;查找轮廓 &#xff08;3&#xff09;筛选那些面积小的 &#xff08;4&#…

【AI】人类视觉感知特性与深度学习模型(1/2)

目录 一、关于人类视觉感知 1.1 视觉关注 1.自上而下&#xff08;Top-down&#xff09;的视觉关注 ​编辑 2.自下而上&#xff08;Bottom-up&#xff09;的视觉关注 3.区别和记忆点 1.2 视觉掩盖 1.常见的视觉掩盖效应 2.恰可识别失真&#xff08;Just Noticeable Dif…

缓存数据库一致性问题

为什么使用缓存&#xff1f; 业务处于起步阶段&#xff0c;流量非常小&#xff0c;那无论是读请求还是写请求&#xff0c;直接操作数据库随着业务指数级增长&#xff0c;请求量剧增&#xff0c;直接访问数据库&#xff0c;导致性能急剧下降&#xff0c;需要引入缓存提高读性能…

win环境安装yarn脚手架

win环境安装yarn脚手架 1、安装命令 npm install -g yarn 2、查看安装的版本 yarn --version 报错了&#xff01;&#xff01;&#xff01; 解决方案 搜索​​ PowerShell​​&#xff0c;右键以管理员身份运行&#xff1b; 输入&#xff1a;​​set-ExecutionPolicy Remo…

知虾shopee数据:为卖家提供了丰富的数据分析工具

使用Shopee的卖家都知道&#xff0c;这个平台为卖家提供了丰富的数据分析工具&#xff0c;帮助他们更好地理解店铺运营状况和市场趋势。这些数据分析工具不仅能够提供数据总览&#xff0c;还包括买家分析、商品排名、分类排名、销售辅导、流量分析、销售结构、行销活动、聊天响…

性能优化-OpenMP概述(一)-宏观全面理解OpenMP

本文旨在从宏观角度来介绍OpenMP的原理、编程模型、以及在各个领域的应用、使用、希望读者能够从本文整体上了解OpenMP。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础…

整除判断-判断正整数a能否被b整除,如果不能整除,输出商和余数 C语言xdoj42

问题描述 判断正整数a能否被b整除&#xff0c;如果不能整除&#xff0c;输出商和余数 输入说明 输入两个正整数a和b&#xff08;0<a, b<10000&#xff09;&#xff0c;a和b之间用空格分隔。 输出说明 如果a能被b整除&#xff0c;输出yes&#xff0c;否则在同…

山区老人爱的礼物丨守护银龄,情暖寒冬

为让山区老人们在寒冷的冬天感受到来自社会的温暖&#xff0c;新年伊始&#xff0c;北京传益千里携手志愿者再次走进酉阳土家族苗族自治县木叶乡分发新的一轮山区老人爱的礼物&#xff0c;让更多的物资走向有需要的人群。 中午阳光正好&#xff0c;志愿者们走进山林中的人家&am…

文件销毁 硬盘销毁 数据销毁 物料销毁 淼一护航数据安全最后一公里

文件销毁、硬盘销毁、数据销毁以及物料销毁&#xff0c;是现代商业和行政管理中必须面对的重要环节。随着信息化程度的加深&#xff0c;数据安全和隐私保护已经成为全社会共同关注的焦点&#xff0c;而数据销毁则是确保信息安全的重要手段。淼一护航数据安全最后一公里&#xf…

开源协议简介和选择

软件国产化已经提到日程上了&#xff0c;先来研究一下开源协议。 引言 在追求“自由”的开源软件领域的同时不能忽视程序员的权益。为了激发程序员的创造力&#xff0c;现今世界上有超过60种的开源许可协议被开源促进组织&#xff08;Open Source Initiative&#xff09;所认可…

SCA面面观 | 企业该如何选择组件检测工具?

一般来说&#xff0c;一个软件应用程序可以被分解成若干部分&#xff0c;为软件程序解耦&#xff0c;以减少整个应用程序的复杂性&#xff0c;这些部分就是软件组件。以一种标准化的方式相互作用&#xff0c;使得组件可以像机器的“零部件”一样被换入或换出&#xff0c;因组件…

wait 和 notify 这个为什么要在synchronized 代码块中?

一个工作七年的小伙伴&#xff0c;竟然不知道” wait”和“notify”为什么要在 Synchronized 代码块中 。 好吧&#xff0c;如果屏幕前的你也不知道&#xff0c;请在公屏上刷”不知道“。 对于这个问题&#xff0c;我们来看看普通人和高手的回答。 一、问题解析 1. wait 和 n…

理解 Node.js 中的事件循环

你已经使用 Node.js 一段时间了&#xff0c;构建了一些应用程序&#xff0c;尝试了不同的模块&#xff0c;甚至对异步编程感到很舒适。但是有些事情一直在困扰着你——事件循环&#xff08;Event Loop&#xff09;。 如果你像我一样&#xff0c;花费了无数个小时阅读文档和观看…

将音频与视频格式互转的7 个顶级工具方法

你是否遇到过需要将视频文件从一种格式转换为另一种格式的情况&#xff1f; 在编辑家庭电影或者专业电影工作室工作&#xff0c;我们经常需要将视频文件转换成不同的格式。市场上有很多自称能够高效转换的工具&#xff0c;但是我们要时刻警惕诈骗工具&#xff0c;它们可能会耗…

【mac-m1 docker 安装upload-labs靶场】

1.搜索upload-labs docker search upload-labs 2.下载upload-labs docker pull c0ny1/upload-labs 3.启动 docker run -it -d --name uploadlabs -p 80:80 c0ny1/upload-labs --platform linux/amd64 4.访问127.0.0.1:80 注意点&#xff1a;后续使用的时候会报错 需要手动创…

BAT036:TXT与DOC格式互转、DOC与DOCX格式互转

引言:编写批处理程序,可实现txt与doc文档格式互转、doc与docx文档格式互转。 一、新建Windows批处理文件 参考博客: BAT002:在右键菜单新建中添加【Windows批处理文件】_为右键菜单添加bat-CSDN博客 二、TXT与DOC格式互转 1.右键新建的批处理文件,点击【编辑】。 ​ …

虚幻UE 增强输入-触发器

上一篇增强输入基础&#xff1a;虚幻UE 增强输入-第三人称模板增强输入分析与扩展 主要对第三人称模板的增强输入进行分析、复刻和扩展 本篇将会对增强输入中的触发器中的各参数进行讲解 文章目录 前言触发器参数1、下移TriggerDown2、已按下TriggerPressed3、已松开TriggerRel…

新手深入浅出理解PyTorch归一化层全解析

目录 torch.nn子模块normal层详解 nn.BatchNorm1d BatchNorm1d 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.BatchNorm2d BatchNorm2d 函数简介 函数工作原理 参数详解 使用技巧与注意事项 示例代码 nn.BatchNorm3d BatchNorm3d 函数简介 参…

为什么在国内考CISP比CISSP好?

在国内考CISP比CISSP好的原因主要有以下几点&#x1f447; 1️⃣国内认证认可度高 &#x1f48e;CISP是国内信息an全领域的重要认证&#xff0c;得到了国内政fu、企业和行业的高度认可。 2️⃣国内考试难度相对较低 由于CISP的考试内容与国内信息an全领域的实际情况更加贴近&am…

MySQL 8.0.32 双写参数和innodb_redo

版本为mysql 8.0.32 数据库内存和磁盘架构 #ib_16384_0.dblwr #ib_16384_0.dblwr和#ib_16384_2.dblwr 这两个文件有什么区别 从架构图中&#xff0c;不难看出这两个文件是双写buffer文件。 双写缓冲区是一个存储区域&#xff0c;在 InnoDB将页面写入 InnoDB数据文件中的正确…