javaMail 使用SMTP邮箱服务器发送邮件

2023-10-31

POP3/SMTP协议

smtp默认端口是:25

接收邮件服务器:pop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465
海外用户可使用以下服务器
接收邮件服务器:hwpop.exmail.qq.com ,使用SSL,端口号995
发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465
 
 

废话不多说,直接上代码

        if (useSSL == true) {
            String smtpPort = "465";
            props.setProperty("mail.transport.protocol", "smtp"); // 使用的协议(JavaMail规范要求)
            props.setProperty("mail.smtp.host", smtphost);
            props.setProperty("mail.smtp.auth", "true");
            props.setProperty("mail.smtp.port", smtpPort);
            props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.socketFactory.port", smtpPort);
            // props.put("mail.smtp.starttls.enable", "true");
            props.setProperty("mail.smtp.ssl.enable", "true");
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.socketFactory", sf);
        } else {
            String smtpPort = "25";
            props.setProperty("mail.transport.protocol", "smtp");
            props.setProperty("mail.smtp.host", smtphost);
            props.setProperty("mail.smtp.auth", "true");
            props.setProperty("mail.smtp.port", smtpPort);
            props.setProperty("mail.smtp.socketFactory.fallback", "false");
            props.setProperty("mail.smtp.socketFactory.port", smtpPort);
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            props.put("mail.smtp.ssl.socketFactory", sf);
        }
        Authenticator authenticator = new Authenticator() {
            @Override
            protected javax.mail.PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(sendmail, sendpassword);
            }
        };
        Session session = Session.getDefaultInstance(props, authenticator);
        // 2. 根据配置创建会话对象, 用于和邮件服务器交互
        // Session session = Session.getDefaultInstance(props);
        session.setDebug(true); // 设置为debug模式, 可以查看详细的发送 log
        System.getProperties().setProperty("mail.mime.splitlongparameters", "false");

以上方法已经可以处理大部分的邮件发送业务了,但是今天遇到一个坑爹的问题,客户使用的是office365的邮箱,上面的方法用不了了,郁闷......

经过和客户确认,他们使用的office365邮箱,

端口是:587

SMTP服务器是:smtp.office365.com

加密方法是:STARTTLS

 

 

 

于是我就改了代码将上面的465端口全部改为了587,结果还是不行,连接超时

查看资料发现如果要使用365邮箱需要注释一些配置

//props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory")
// props.setProperty("mail.smtp.ssl.enable", "true");

 

按网上说的改了以后,信心满满的去测试,结果还是不行,报了下面的错误

javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful [HK2PR0401CA0024.apcprd04.prod.outlook.com]

        at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:965)
        at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:876)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:780)
        at javax.mail.Service.connect(Service.java:366)
        at javax.mail.Service.connect(Service.java:246)
        at com.vamtoo.dsm.common.util.EmailUtil.testConnectBySmtp(EmailUtil.java:201)
        at com.vamtoo.dsm.controller.SysParamController.save(SysParamController.java:100)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

接着找原因,发现还要添加一个配置

props.put("mail.smtp.starttls.enable", "true");

添加完以后测试发现还是报错

com.sun.mail.smtp.SMTPSendFailedException: 451 5.7.3 STARTTLS is required to send mail.......

需要在ssl配置中再添加一个配置

props.put("mail.smtp.starttls.required", "true");

至此问题解决

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javaMail 使用SMTP邮箱服务器发送邮件 的相关文章

随机推荐

  • linux shell脚本双引号转义,Linux Shell脚本中单引号(‘)和双引号(“)的区别

    在Linux操作系统上编写Shell脚本时候 我们是在变量的前面使用 符号来获取该变量的值 通常在脚本中使用 param 这种带双引号的格式 但也有出现使用 param 这种带引号的使用的场景 首先大家看一段例子 root linux na
  • JAVA代码保护工具DashO Pro v10.0.0 Beta 2重磅上线!更新DashO Gradle插件!

    DashO是一个Java和Android的混用程序 它提供企业级应用的加固和屏蔽 大大降低了知识产权盗窃 数据盗窃 盗版和篡改的风险 分层混淆 加密 水印 自动失效 反调试 反篡改 反仿真器 反挂钩 反根设备解决方案 为世界各地的应用程序提
  • 单片机毕业设计 stm32智能电子秤系统设计与实现 - 物联网 嵌入式

    文章目录 0 前言 1 简介 2 主要器件 3 实现效果 4 设计原理 4 1 STM32F103C8T6 4 2 HX711压力传感器 5 部分核心代码 6 最后 0 前言 这两年开始毕业设计和毕业答辩的要求和难度不断提升 传统的毕设题目
  • Simulink Simscape基础仿真电路

    在网上找了挺多关于MATLAB Simulink simscape仿真电路的资料都没有自己想要的 大都是Sympowersystem的教程 最后还是上了YouTube观看了一些教程 现在做下学习记录 由于我电脑上安装了2016和2010两个
  • 身份和访问管理解决方案:混合型IAM

    对于依赖于本地 IT 基础结构和传统安全模型的组织 可以更轻松地验证和授权企业网络内的所有内容 包括设备 用户 应用程序和服务器 尝试从公司网络外部获取访问权限的用户使用虚拟专用网络 VPN 和网络访问控制 NAC 进行身份验证 随着云和远
  • java中equals的重写_Java重写equals方法(重点讲解)

    为什么equals 方法要重写 判断两个对象在逻辑上是否相等 如根据类的成员变量来判断两个类的实例是否相等 而继承Object中的equals方法只能判断两个引用变量是否是同一个对象 这样我们往往需要重写equals 方法 我们向一个没有重
  • Hadoop-The variance for this alert is **MB which is 20% of the **MB average (**MB is the limit)

    The variance for this alert is MB which is 20 of the MB average MB is the limit 1 调整如下阀值 2 检查HDFS文件系统使用率 清空HDFS上的 trash垃
  • SpringBoot+ftp 实现文件的上传、下载与删除

    SpringBoot ftp 实现文件的上传 下载与删除 一 引包 二 配置 三 代码 3 1配置类 3 2 接口服务 3 3controller层示例 不做过多解释 可移植 比较简单方便 一 引包 3 8 0是目前最新的 除非重大更新 基
  • Python基础——常见数据类型总结

    在Python中常见的数据类型有以下8个类型 分别是 int 整数类型 整形 float 浮点类型 浮点型 bool 布尔类型 str 字符串类型 list 列表类型 tuple 元组类型 dict 字典类型 set 集合类型 接下来一一展
  • hdd和虚拟服务器区别,Docker容器与虚拟机的区别

    我曾经将Docker容器视为轻量级 精简的虚拟机 进行这种比较是有道理的 因为至少在Docker的最初市场中 总是将其与虚拟机进行比较 例如 Docker花费的启动时间少于VM 等等 但是docker容器不是虚拟机 让我们对Docker容器
  • java redis cluster_Redis的cluster模式

    Redis集群是Redis提供的分布式数据库方案 集群通过分片 Sharding 来进行数据共享 并提供复制和故障转移功能 节点 一个节点就是一个运行在集群模式下的Redis服务器 Redis服务器在启动的时候会根据cluster enab
  • ERROR: Could not build wheels for pycocotools, lap, which is required to install pyproject.toml-base

    python 在windows系统上安装pycocotools lap是出现无法安装的情况 报错如下 原因是缺少C 的编译工具 并且pycocotools需要安装windows版本 解决步骤 1 下载BuildTools 下载地址 Buil
  • Spark学习之机器学习包ML

    Spark的ML软件包 其操作是基于DataFrame的 ML包括转换器 Transformer 评估器 Estimator 管道 Pipeline 1 转换器 Transformer 通常是将一个新列附加到DataFrame来转换数据 从
  • React入门

    目录 React简介 官网 介绍描述 React的特点 React高效的原因 React的基本使用 效果 相关js库 创建虚拟DOM的两种方式 虚拟DOM与真实DOM React JSX XML JSON JSX 渲染虚拟DOM 元素 JS
  • 二进制部署Kubernetes

    操作系统 centos7 5 x86 docker 19ce 软件 Kubernetes 1 18 角色 k8s master1 192 168 31 71 组件 kube apiserver kube controller manager
  • C语言atoi函数将字符串类型转换为整型

    atoi 是C标准库中的一个函数 用于将字符串转换为整数 函数原型如下 int atoi const char str 参数 str 是一个指向要转换的字符串的指针 atoi 函数会尝试将字符串中的数字部分转换为整数 并返回转换后的整数值
  • 基于深度学习的验证码自动识别(caffe)

    最近在学习使用caffe 然后就想试着玩玩验证码识别 结果非常非常棒 深度学习确实是非常强大的 废话少说 跟我走进验证码自动识别 caffe安装 此处省略一万字 网上教程千千万 你一定可以找到 接着往下看 剧情描述 之前对京东的某些数据进行
  • 《剑指offer》---22.数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent 求base的exponent次方 保证base和exponent不同时为0 解题分析 使用快速幂解决 代码 class Solution public d
  • Spring Boot + Vue3前后端分离实战wiki知识库系统<十一>--文档管理功能开发三

    文档内容的显示 在上一次Spring Boot Vue3前后端分离实战wiki知识库系统 十 文档管理功能开发二文档管理模块还差文档的显示木有完成 所以接下来先将这块模块给收尾了 增加单独获取内容的接口 概述 在前端页面文档查询时 只查询了
  • javaMail 使用SMTP邮箱服务器发送邮件

    POP3 SMTP协议 smtp默认端口是 25 接收邮件服务器 pop exmail qq com 使用SSL 端口号995 发送邮件服务器 smtp exmail qq com 使用SSL 端口号465 海外用户可使用以下服务器 接收邮