java发送邮件到qq邮箱

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

<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.mfbz.cn/a/293317.html

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

相关文章

机器视觉系统选型-镜头选型常见误区—焦距选择公式

视觉工程师在选择镜头时经常要用到一个公式来选择镜头的焦距。根据这个公式&#xff0c;如果 已知芯片大小、拍摄视野和工作距离的要求&#xff0c;可以算出镜头的焦距。在大部分情况下&#xff0c;这个 公式是可以用的。但这只是一个近似公式&#xff0c;有些情况下使用这个公…

广义双曲分布、KS检验与抄底沪指

上一篇笔记我们抛出一个问题&#xff0c;沪指大跌 4%时&#xff0c;能不能抄底&#xff1f;今天的笔记&#xff0c;我们就通过 KS 检验&#xff0c;找出沪指的概率分布&#xff0c;进而回答这个问题。在后面的笔记中&#xff0c;我们还将换一个方法继续回答这个问题。 K-S 检验…

Matlab/F#/R进行数据分析和建模算法的经验,vb.net输给他了

微软放弃了vb.net的开发&#xff0c;但是持续花费巨资投入F#,简单一看他的语法就是qbasic ,vb6一样。鹿死谁手&#xff0c;谁能相信vb.net竟然被f#给干掉了。外面有vb6语法的python成了全球第一的编程语言,内部还有强大的教授开发的这工具扯后腿。 有人说为什么中国搞不出像mat…

漏洞复现--天融信TOPSEC两处远程命令执行

免责声明&#xff1a; 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(6)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置&#xff08;5&#xff09; 2.2 HOST主桥 本节以MPC8548处理器为例&#xff0c;说明HOST主桥在PowerPC处理器中的实现机制&#xff0c;并简要介绍x86处理器系统使用的HOST主桥。 …

一文讲透Stata计量经济学中如何分中东西区域回归?

stata如何分中东西区域回归本质上是异质性检验。 异质性检验即针对样本进行分类分组&#xff0c;基于各组样本分别开展的实证检验。异质性检验通常在基准回归之后&#xff0c;基准回归依据的是全部的样本&#xff0c;当基准回归得到的结果较为显著&#xff0c;即核心解释变量显…

多线程基础入门【Linux之旅】——上篇【线程控制,线程互斥,线程安全】

目录 前文 回望页表 一&#xff0c;什么是线程 二&#xff0c;使用 pthread_create &#xff08;线程创建&#xff09; 三&#xff0c;线程控制 1 &#xff0c;线程共享进程数据&#xff0c;但也拥有自己的一部分数据: 2&#xff0c; 线程 VS 进程优点 3&#xff0c;…

服务器内存介绍

本篇文章用于介绍服务器内存&#xff0c;包括基本概念、内存演进、规格识别、内存条配置规则等 1、基本概念 服务器内存是指安装在服务器主板上的用于存储和处理数据的硬件组件。它是服务器中的主要性能关键因素之一&#xff0c;对于服务器的运行速度、多任务处理能力和数据处…

Linux 进程(九) 进程等待

子进程退出&#xff0c;父进程如果不管不顾&#xff0c;就可能造成‘僵尸进程’的问题&#xff0c;进而造成内存泄漏&#xff0c;所以父进程回收子进程是必然要做的。 另外&#xff0c;进程一旦变成僵尸状态&#xff0c;那就刀枪不入&#xff0c;“杀人不眨眼”的kill …

线性代数笔记6 1.4

学习视频&#xff1a; 2.2 矩阵运算&#xff08;二&#xff09;_哔哩哔哩_bilibili 包括内容&#xff1a; p23 3.2 线性相关线性无关 p24 3.3 向量的秩&#xff08;一&#xff09; p25 3.3 向量的秩&#xff08;二&#xff09; p26 4.1 线性方程组 p27 4.2 线性方程组有解…

一篇文章带你了解基于 Jenkins 流水线方式部署的好处

在软件开发过程中&#xff0c;部署是将代码从开发环境转移到生产环境的关键步骤。传统的部署方式可能涉及多个手动步骤和容易出错的过程。然而&#xff0c;基于 Jenkins 流水线方式部署可以带来许多好处&#xff0c;包括提高效率、一致性和可靠性。本文将探讨基于 Jenkins 流水…

【Spring实战】21 Spring Data REST 常用功能详细介绍

文章目录 1. 资源导出&#xff08;Resource Exporting&#xff09;2. 查询方法&#xff08;Query Methods&#xff09;3. 分页和排序&#xff08;Pagination and Sorting&#xff09;4. 关联关系&#xff08;Associations&#xff09;5. 事件&#xff08;Events&#xff09;6. …

Parallels虚拟机启动后,Mac主机无法上网怎么办

文章目录 1.问题2.解决 1.问题 部分用户在运行Parallels Desktop的Windows 11打开后&#xff0c;Windows上网没有问题 &#xff0c;但是Mac主机不能访问带域名的网站&#xff0c;而访问带ip的网站没问题&#xff0c;退出parallels虚拟机以后&#xff0c;mac网络恢复正常。 2.…

【管理篇 / 恢复】❀ 07. macOS下用命令刷新固件 ❀ FortiGate 防火墙

【简介】随着苹果电脑的普及&#xff0c;很多管理员都会通过苹果电脑对飞塔防火墙进行管理。当防火墙需要命令状态下刷新固件时&#xff0c;在macOS下用命令刷新固件&#xff0c;将会是一个小小的挑战。 首先是硬件的连接&#xff0c;USB配置线的USB一头&#xff0c;接入MAC的U…

【亚马逊云科技】自家的AI助手 - Amazon Q

写在前面&#xff1a;博主是一只经过实战开发历练后投身培训事业的“小山猪”&#xff0c;昵称取自动画片《狮子王》中的“彭彭”&#xff0c;总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域&#xff0c;如今终有小成…

高并发下的计数器实现方式:AtomicLong、LongAdder、LongAccumulator

一、前言 计数器是并发编程中非常常见的一个需求&#xff0c;例如统计网站的访问量、计算某个操作的执行次数等等。在高并发场景下&#xff0c;如何实现一个线程安全的计数器是一个比较有挑战性的问题。本文将介绍几种常用的计数器实现方式&#xff0c;包括AtomicLong、LongAd…

IO进程线程Day4

1> 创建出三个进程完成两个文件之间拷贝工作&#xff0c;子进程1拷贝前一半内容&#xff0c;子进程2拷贝后一半内容&#xff0c;父进程回收子进程的资源 #include <myhead.h> //使用三个进程完成两个文件的拷贝工作 //两个子进程分别拷贝文件的上下两部分 //父进程回…

基础知识:晶振的驱动功率测量方法

驱动功率 驱动功率是指振荡电路工作时晶体谐振器的功耗。 保持晶体谐振器低于驱动功率是很重要的。超过驱动功率&#xff0c;可能会引起频率和等效串联电阻的意外变化。 按如下方法计算驱动功率 : 驱动功率 I &#xff65;R1 I&#xff1a;驱动功率 [有效值] R1&#xff1a…

【Mybatis系列】Mybatis判断问题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

简单的MySQL高可用还不快来学

MHA高可用 传统的MySQL主从架构会存在单点故障问题 MySQL集群高可用方案 单主&#xff1a;keepalived MHA MMM 多主&#xff1a;MySQL cluster PXC 1 MHA 1.1 MHA简介 MHA&#xff08;Master High Availability Manager and tools for MySQL&#xff09;目前在MySQL高可…
最新文章