JavaMail邮件发送不成功的那些坑人情况及分析说明(巨坑跳出专用姿势)

https://blog.csdn.net/xyw591238/article/details/69530950

 

前言

 

  JavaMail的使用本身并不难,网上有不少案例,简单易懂,而且有详细的中文注解。但是由于JavaMail的机制设置不够完善,特别是异常出错时的参考信息太少,给初学者造成了不少麻烦,而我就是其中之一。在此,把我遇到过得那些坑总结出来,以免大家重蹈覆辙,浪费时间。(注:后续还有遇到新的问题,我会持续更新到这里)

一、JavaMail概述

  JavaMail是由Sun定义的一套收发电子邮件的API,不同的厂商可以提供自己的实现类。但它并没有包含在JDK中,而是作为JavaEE的一部分。

  厂商所提供的JavaMail服务程序可以有选择地实现某些邮件协议,常见的邮件协议包括:

  • SMTP:简单邮件传输协议,用于发送电子邮件的传输协议;

  • POP3:用于接收电子邮件的标准协议;

  • IMAP:互联网消息协议,是POP3的替代协议。

  这三种协议都有对应SSL加密传输的协议,分别是SMTPS,POP3S和IMAPS。除JavaMail服务提供程序之外,JavaMail还需要JAF(JavaBeans Activation Framework)来处理不是纯文本的邮件内容,这包括MIME(多用途互联网邮件扩展)、URL页面和文件附件等内容。下图描述了JavaMail的体系结构。

(图片来源:http://blog.csdn.net/t12x3456...)

  • mail.jar:此JAR文件包含JavaMail API和Sun提供的SMTP、IMAP和POP3服务提供程序;

  • activation.jar:此JAR文件包含JAF API和Sun的实现。

(有关JavaMail的介绍我只摘要部分,详细介绍请参考:http://blog.csdn.net/zapldy/a...)

二、各种问题及分析说明

  后面列举出来的报错信息需要开启Session的debug模式,具体配置方式如下:

 
  1. Session sendMailSession = Session.getInstance(pro, authenticator);

  2. sendMailSession.setDebug(true);

1、后台显示邮件发送成功但未收到邮件

问题现象

  使用新浪邮箱发送邮件,尝试两种邮件发送方式,分别是“A@sina .cn发送给A@sina .cn”和“A@sina .cn发送给B@sina .cn”,摘要部分后台打印信息:

 
  1. 250 ok queue id 355937395546

  2. QUIT

  3. 221 smtp-5-121.smtpsmail.fmail.xd.sinanode.com

  4. Sent message ***@sina.cn successfully....

  使用163邮箱发送邮件,尝试C@126.com发送给A@sina .cn,摘要部分后台打印信息:

 
  1. 250 Mail OK queued as smtp7,C8CowADnDNooqmNYHWsYGw--.30359S3 1482926655

  2. QUIT

  3. 221 Bye

  4. Sent message ***@sina.cn successfully....

  5.  

  登录新浪邮箱确认有smtp服务且处于开通状态,也尝试重新开启smtp服务,仍然邮件发送不成功。网上也有不少人反馈用手机客户端无法使用新浪邮箱发送邮件,随后我尝试用foxmail登录新浪邮箱,也出现只能接收邮件而不能发送邮件的情况。

问题分析

  基本确定是新浪邮箱问题,至于是smtp服务问题,还是做什么限制就不清楚了。好像平时也没多少人用新浪邮箱发邮件,通过网页登录也是能发邮件的,凑合能用,毕竟是免费邮箱嘛。

  这是用JavaMail发送邮件遭遇的第一个问题,案例都是参考别人原封不动拿过来用的,却发了收不到邮件。换了几个参考案例,问题现象相同。我开始怀疑别人给的案例代码问题,毕竟堂堂的新浪邮箱还不至于这么不靠谱。然后,就是基于这样的判断,我就吃了大亏,一直在分析代码和配置方式,也在各大论坛搜“发送邮件成功却收不到邮件”,发现出现问题的不在少数,而且多半给出的建议是检查代码有没有问题,然后提问的人也没了回复下文,这就导致了很大的误导性。这正是因为这个原因,我也白白地耗了好几天时间,直到最后发现原来原因是这么简单...有时别人的解答能够事半功倍,但是这种依赖性还是不靠谱的,有时自己的排错思路更重要

2、向新浪邮箱发信被退信

问题现象

  平时开发测试,不想用私人常用邮箱,于是注册了搜狐邮箱,并尝试向新浪邮箱发送邮件,不过很快搜狐邮箱收到退信(这种情况JavaMail是不会提示判断信息的),退信内容如下:

<A@sina .cn>: host freemx1.sinamail.sina.com.cn[202.108.35.47] said:
554 Rejected due to the sending MTA's poor reputation. Please refer
http://mail.sina.com.cn/help2... Please refer to
http://chengxin.mail.sina.com... 123.125.123.1
(in reply to DATA command)

问题分析

  通过访问退信信息里面的链接(新浪邮箱诚信平台),基本确定搜狐邮箱服务器被拉黑了。当然,不是被新浪拉黑,而是进了RBL黑名单,新浪参考其数据进行了屏蔽。这个已经超出了个人能力范围,果断放弃新浪邮箱,改向其他邮箱发送。

【RBL黑名单】

RBL是英文Realtime BlackholeList的缩写,即实时黑名单列表。在该列表中的IP地址对外发布过垃圾邮件。是由第三方的反垃圾邮件组织提供的检查垃圾邮件发送者地址的服务。

【查询网站】

MXToolBox:http://mxtoolbox.com/ 
BlackListAlert:http://www.blacklistalert.org/

3、向163邮箱发信未收到且也无未退信

问题现象

  通过搜狐邮箱向新浪邮箱发信遭遇退信后,我尝试自己发给自己,正常收到邮件。考虑模拟测试要尽量真实,我改向163邮箱发信,结果出现后台显示发信成功,163邮箱却没收到邮件,但本地邮箱并没收到退信通知。

问题分析

  这说明“后台显示邮件发送成功但未收到邮件”的情况,原因还是多种多样的,不仅可能发件服务器有问题,还可能是收件服务器的问题。收件服务器有的给你退信,有的还收了直接丢弃,真是什么奇葩情况都有,多加注意吧。

4、jar包重叠存在javax.mail.*

问题现象

  从Oracle官网下载下来JavaMail相关jar包是mail.jar,导入进去测试后报各种奇葩错误。下面的异常信息是在项目中已有geronimo-javamail_1.4_spec-1.3.jar的情况下导入mail.jar后报出来的:

 
  1. com.sun.mail.smtp.SMTPSendFailedException: 530 Authentication required

  2. at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:1388)

  3. at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:959)

  4. at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:583)

  5.  

  不仔细看还以为是账号或密码填错了,其实只要把geronimo-javamail_1.4_spec-1.3.jar剔除,重新发邮件就正常了。

问题分析

  上面只是我贴出来的报错情况之一,这些报错是不一定能够复现,因为导包就存在问题,重叠存在javax.mail.*。我是在出现第一个问题(“后台显示邮件发送成功但未收到邮件”)的时候,在网上看到别人说的这种情况(javaMail发送邮件成功却收不到邮件或收到邮件无主题无收件人乱码),而后我就开始逐个排查定位,目前通过我所知道的情况来看,重叠存在javax.mail.*的jar有mail.jar、geronimo-javamail_1.4_spec-1.x.jar、mailapi.jar和javaee.jar。
  排查的方法也很简单,比如打开javax.mail.Session,然后定位它所在的jar,剔除后再找下一个jar包。

5、jar包正确的情况下也出现报错

问题现象

  在jar包正常且配置正确的情况下,我也遇到过不少报错情况。出现的情况基本是前几次发邮件都正常,然后再发一次又突然出现报错,再试一次问题又不复现,贴出几种报错信息如下:

(报错1)

 
  1. DEBUG SMTP: Sending failed because of invalid destination addresses

  2. RSET

  3. DEBUG SMTP: MessagingException while sending, THROW:

  4. javax.mail.SendFailedException: Invalid Addresses;

  5. nested exception is:

  6. com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 <*@163.com>: Relay access denied

  7. at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1862)

  8. at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1118)

(报错2)

 
  1. Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not convert socket to TLS;

  2. nested exception is:

  3. javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed

(报错3)

 
  1. javax.mail.SendFailedException: Send failure (javax.mail.MessagingException: Could not connect to SMTP host: smtp.sohu.com, port: 25 (java.net.ConnectException: Connection timed out: connect))

  2. at javax.mail.Transport.send(Transport.java:163)

  3. at javax.mail.Transport.send(Transport.java:48)

  4. at javamail.EmailSender.sendMail(EmailSender.java:91)

  5. at javamail.EmailSender.main(EmailSender.java:64)

(报错4)

 
  1. 250-zw_71_47

  2. 250-AUTH PLAIN LOGIN

  3. 250 STARTTLS

  4. DEBUG SMTP: Found extension "AUTH", arg "PLAIN LOGIN"

  5. DEBUG SMTP: Found extension "STARTTLS", arg ""

  6. DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM

  7. DEBUG SMTP: AUTH LOGIN command trace suppressed

问题分析

  因为这些报错不具有可复现性,测试过程中我也司空见惯,当然90%以上的情况邮件发送都是正常,代码方面也是综合了多个案例提炼出来的,而且代码大同小异,也看过官方提供的样例,配置内容都差不多,代码问题可能性较小,也不排除smtp服务器抽风了,目前我暂时忽略。   当然,如果有分析出是代码问题,也欢迎留言告知分享。(注:后面文章我会将我的代码粘贴出来共享)

6、发信成功后,回应的信息不同

问题现象

  我将JavaMail代码在外网测试邮件发送成功时,后台打印信息结尾内容基本如下:

 
  1. 250 Mail OK queued as smtp7,C8CowADnDNooqmNYHWsYGw--.30359S3 1482926655

  2. QUIT

  3. 221 Bye

  当我将JavaMail代码移植到内部环境测试邮件发送成功时,后台打印信息结尾内容如下:

 
  1. 250 Message accepted for delivery

  2. QUIT

  3. 221 srv201.mail.*.* SMTP Service closing transmission channel

问题分析

  通过上网查询资料得知,250和221这样的编码实际是smtp交互的消息编码,其中221代表邮件会话即将结束,这意味着所有消息都已被处理。编码后面的信息“srv201.mail.. SMTP Service closing transmission channel”和“Bye”的意思类似,可以忽略具体内容,知道221代表邮件发送正常即可。

三、附录

1、SMTP错误码及建议解决方法
2、SMTP errors and reply codes
3、javaMail发送邮件成功却收不到邮件或收到邮件无主题无收件人乱码
4、新浪邮箱诚信平台

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python通过发邮件通知自己电脑被入侵

我对IT技术有着狂热的追求&#xff0c;虽然现在很渣&#xff0c;但是我有颗钻研的心&#xff0c;例外我还比较喜欢看小说&#xff0c;相信看过最强黑客的人对里面的黑客的技术佩服得无以复加&#xff0c;黑客一般对自己的电脑数据都比较在意&#xff0c;一般都会设置些密码等并…

如何在线伪造邮箱发件人,用任意邮箱发送邮件

今天邮箱收到一封自己域名发过来的邮件&#xff0c;但是询问当事人说并没有发送相关邮件&#xff0c;于是去百度了下&#xff0c;看是否可以伪造发件人&#xff0c;于是找到一个网站 http://tool.chacuo.net/mailanonymous&#xff0c;这个网站可以用任意的邮箱地址发邮件&…

单播通信、主播通信和广播通信

单播 简介 单播&#xff08;unicast&#xff09;是指封包在计算机网络的传输中&#xff0c;目的地址为单一目标的一种传输方式。每次只有两个实体相互通信&#xff0c;发送端和接收端都是唯一确定的。它是现今网络应用最为广泛&#xff0c;通常所使用的网络协议或服务大多采用…

Qt 之图形(转换)

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 QTransform 用于指定坐标系的 2D 转换 - 平移、缩放、扭曲&#xff08;剪切&#xff09;、旋转或投影坐标系。绘制图形时&#xff0c;通常会使用。 QTransform 与 QMatrix 不…

全网最全!!Qt实现图片旋转及图片旋转动画的几种方式

实现图片旋转的两种方式 第一种方案 使用 QPixmap 的 transformed 函数来实现旋转&#xff0c;这个函数默认是以图片中心为旋转点&#xff0c;不能设置旋转的中心点&#xff0c;使用如下&#xff1a; QMatrix matrix; matrix.rotate(45);QLabel *Label new QLabel(); Label-…

网页特效——女儿国国王

目录 &#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&#x1f49d;&…

不使用插件,小程序也能完整的渲染富文本(视频展现,图片自适应)

用过小程序rict-text的帅哥靓女们&#xff08;说的就是正在看文章的你&#xff09;都知道&#xff0c;rich-text是无法解析富文本中的video标签的&#xff0c;本文教你如何优雅的在不使用插件的情况下完整的渲染富文本 首先是富文本图片自适应的问题 当我们从后端拿到富文本数…

让AI替你打工?CHATGPT提升开发效率

1 需求分析 提取需求关键点 ChatGPT 通过对需求文档的分析&#xff0c;自动提取关键需求和功能点&#xff0c;方便开发团队更好地理解项目需求。 2 技术方案 大表更新方案 在某支付业务中&#xff0c;有一个大表4000万行数据&#xff0c;使用的 mysqlA5.6 的版本&#xff…

应聘求职自荐信优秀范文5篇

应聘求职自荐信优秀范文篇1 尊敬的领导&#xff1a; 您好!衷心的感谢您在百忙之中翻阅我的这份材料&#xff0c;并祝愿贵单位事业欣欣向荣&#xff0c;蒸蒸日上! 我是哈尔滨理工大学测控技术及通信工程学院________届毕业生&#xff0c;自从今日大学之后&#xff0c;高考后的轻…

如何写出一份优秀的简历和求职信?

写一份优秀的简历和求职信是成功求职的重要一步。 01、简历 突出重点信息&#xff1a;把最重要的信息放在简历的前面&#xff0c;例如您的工作经验和教育背景等。 使用简明扼要的语言&#xff1a;在简历中使用简短的句子和简明扼要的语言&#xff0c;让招聘者能够快速了解您的…

公司计算机程序员英语怎么说,计算机程序员英文求职信范文模板

计算机程序员英文求职信范文模板 Dear Mr. Arline, I would like to be considered as a candidate for the assistant computer programmer position advertised in the Philadelphia Inquirer on April 28, 2004. I’m currently finishing my degree in Computer Science at…

写一份好的求职简历,让面试官对你刮目相看

简历是一块敲门石&#xff0c;但这块敲门石是什么材质的&#xff0c;恐怕见仁见智。那么什么样的简历才能是一块优质敲门石呢&#xff0c;下面的一些个人见解&#xff0c;希望能给正在或正准备寻找更好发展机会的测试工程师们有所帮助。 一、针对在测试行业中已经有所感悟的人&…

【重要】2023年上半年有三AI新课程规划出炉,讲师持续招募中!

2023年正式起航&#xff0c;想必大家都已经完全投入到了工作状态中&#xff0c;有三AI平台今年将在已有内容的基础上&#xff0c;继续进行新课程开发&#xff0c;本次我们来介绍今年上半年的课程计划&#xff0c;以及新讲师招募计划。 2023年新上线课程 我们平台的课程当前分为…

在微信上部署GPT-4.0!

自从OpenAI开放api以后&#xff0c;使得基于GPT的各类二次开发的应用逐渐多了起来。笔者也在前几天也刚刚收到了GPT-4的api使用资格。 由于众所周知的原因&#xff0c;在OpenAI官网使用GPT多少有点不那么顺畅。笔者曾经尝试过一些本地化部署个人GPT的项目&#xff0c;比如基于C…

什么是LoRA模型,如何使用和训练LoRA模型?你想要的都在这!

什么是LoRA模型 LoRA的全称是LoRA: Low-Rank Adaptation of Large Language Models&#xff0c;可以理解为stable diffusion&#xff08;SD)模型的一种插件&#xff0c;和hyper-network&#xff0c;controlNet一样&#xff0c;都是在不修改SD模型的前提下&#xff0c;利用少量…

JDBC

JDBC背景知识&#xff1a;JDBC的使用1&#xff1a;驱动包的下载2&#xff1a;驱动包引入3&#xff1b;代码实现1&#xff1a;创建数据源2&#xff1a;和数据库创建网络连接3&#xff1a;构造sql语句4&#xff1a;执行sql5&#xff1a;释放资源sql语句的构建细节 查找操作&#…

计算机专业博士未来的方向,清华学霸、UCLA计算机博士专业导师手把手教你申请...

原标题:清华学霸、UCLA计算机博士专业导师手把手教你申请 封面插图来源:Behance 专业导师 Charles 硕士毕业于清华大学 UCLA 计算机博士在读 研究方向:人工智能、机器学习、自然语言处理 要不要考虑申请CS博士? 我一直坚定想去美国读 CS Ph.D,但是身边有人会问我 CS为什么…

UCLA Stata FAQ:Stata常见问题详解

Stata 现场班报名中…… Stata连享会 精品专题 || 精彩推文 文章目录 [Stata 现场班报名中……](https://gitee.com/arlionn/stata_training/blob/master/README.md) Stata Frequently Asked QuestionsTransferring data to/from StataStata to HLM Stata Graphical User Inte…

心理学博士vs计算机博士,UCLA心理学博士排名,地表最客观干货

原标题&#xff1a;UCLA心理学博士排名&#xff0c;地表最客观干货 加州大学洛杉矶分校是一间位于美国加利福尼亚州洛杉矶的公立学校。UCLA是美国商业金融、高科技产业、电影艺术等专业人才的摇篮。UCLA是加利福尼亚大学系统中的第二所大学&#xff0c;与柏克莱加利福尼亚大学(…