Java使用JavaMail API实现原生邮箱发送功能的方法

 更新时间:2026年02月26日 09:41:24   作者:长路 ㅤ  
文章介绍了如何使用JavaMailAPI在Java后端实现原生邮箱发送功能,包括配置邮件服务器、获取校验码以及解决SSL握手异常的问题,需要的朋友可以参考下

前言

涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。

原生集成邮箱实现

引入pom.xml

邮件发送借助javax.mail工具类

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

前提配置

1、163、新浪邮箱不需要 SSL 加密,QQ 邮箱需要 SSL 加密,在下面实现中开启了SSL加密。

2、若是想要发送邮件得需要先登陆到对应的邮件服务器,那么必不可少的就是校验码,如何获取校验码如下:

设置-开启,根据如下开启指示开启即可获取校验码:

功能实现

package com.dtstack.knowledge.ai.server.util;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.Message;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

/**
 * @ClassName MailUtil
 * @Author ChangLu
 * @Date 2022/1/25 18:28
 * @Description TODO
 */
public class MailUtil {

    public static void main(String[] args) throws Exception {
        sendQQMail("939974883@qq.com", "changlu@dtstack.com", "sdfdsfdsdfds");
    }

    private static SimpleDateFormat DATE_FORMAT_TOOL = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 向指定qq发送邮件
     * @param FROM 发送者qq
     * @param to 接受者qq
     * @param code 发送者qq的授权码(需要去qq邮箱进行授权)
     * @throws Exception
     */
    public static void sendQQMail(String FROM, String TO, String code) throws Exception {
        Properties props = new Properties();

        // 开启debug调试
        props.setProperty("mail.debug", "true");
        // 发送服务器需要身份验证
        props.setProperty("mail.smtp.auth", "true");
        // 设置邮件服务器主机名
        props.setProperty("mail.host", "smtp.qq.com");
        // 发送邮件协议名称
        props.setProperty("mail.transport.protocol", "smtp");

        // 针对 JDK 17 的 SSL 协议配置
        props.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");

        //开启SSL加密
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.ssl.socketFactory", sf);

        Session session = Session.getInstance(props);

        //消息对象配置信息
        Message msg = new MimeMessage(session);
        //设置标题名称
        msg.setSubject("测试");
        StringBuilder builder = new StringBuilder();
        builder.append("\n " + "<h1>欢迎你加入智蜂工作室!</h1>");
        builder.append("\n时间 " + DATE_FORMAT_TOOL.format(new Date()));
        //设置短信内容(setContent可以设置发送内容的类型格式)
        msg.setContent(builder.toString(), "text/html;charset=UTF-8");
        msg.setFrom(new InternetAddress(FROM));//发送人的邮箱地址

        //进行连接
        Transport transport = session.getTransport();
        transport.connect("smtp.qq.com", FROM, code);
        transport.sendMessage(msg, new Address[] { new InternetAddress(TO) });//接收人的邮箱地址
        transport.close();
    }


}

效果:

问题解决

报错:javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)

解决方式:

补充配置项参数:

// 针对 JDK 17 的 SSL 协议配置
props.setProperty("mail.smtp.ssl.protocols", "TLSv1.2");

到此这篇关于Java使用JavaMail API实现原生邮箱发送功能的方法的文章就介绍到这了,更多相关JavaMail API原生邮箱发送内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MyBatis 多表联合查询及优化方法

    MyBatis 多表联合查询及优化方法

    大家都知道Hibernate 是全自动的数据库持久层框架,它可以通过实体来映射数据库,通过设置一对多、多对一、一对一、多对多的关联来实现联合查询,接下来通过本文给大家介绍MyBatis 多表联合查询及优化,需要的朋友可以参考下
    2022-08-08
  • SpringBoot获取当前运行环境三种方式小结

    SpringBoot获取当前运行环境三种方式小结

    在使用SpringBoot过程中,我们只需要引入相关依赖,然后在main方法中调用SpringBootApplication.run(应用程序启动类.class)方法即可,那么SpringBoot是如何获取当前运行环境呢,接下来由小编给大家介绍一下SpringBoot获取当前运行环境三种方式,需要的朋友可以参考下
    2024-01-01
  • 通过Java实现自己动手写ls命令

    通过Java实现自己动手写ls命令

    在前面的文章中,我们仔细的介绍了关于ls命令的使用和输出结果,在本篇文章当中我们用Java代码自己实现ls命令,更加深入的了解ls命令
    2022-10-10
  • 基于Java实现空间滤波完整代码

    基于Java实现空间滤波完整代码

    空间滤波是一种采用滤波处理的影像增强方法。其理论基础是空间卷积和空间相关。这篇文章主要介绍了基于Java的空间滤波代码实现,需要的朋友可以参考下
    2021-08-08
  • 【IntelliJ IDEA】Maven构建自己的第一个Java后台的方法

    【IntelliJ IDEA】Maven构建自己的第一个Java后台的方法

    本篇文章主要介绍了Maven构建自己的第一个Java后台的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • 浅谈Java list.remove( )方法需要注意的两个坑

    浅谈Java list.remove( )方法需要注意的两个坑

    这篇文章主要介绍了浅谈Java list.remove( )方法需要注意的两个坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 对Spring中bean线程安全的讨论

    对Spring中bean线程安全的讨论

    这篇文章主要介绍了对Spring中bean线程安全的讨论,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-06-06
  • Java常用字节流和字符流实例汇总

    Java常用字节流和字符流实例汇总

    这篇文章主要介绍了Java常用字节流和字符流实例汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Lucene 索引删除策略源码解析

    Lucene 索引删除策略源码解析

    这篇文章主要为大家介绍了Lucene 索引删除策略源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • java字符串与字符数组之间的互转方式

    java字符串与字符数组之间的互转方式

    这篇文章主要介绍了java字符串与字符数组之间的互转方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论