使用geronimo-javamail_1.4发送邮件的有关说明

【我的Segmentfault原文】https://segmentfault.com/a/1190000008054230

 

前言

  之所以要写这篇文章,是因为在平时工作中出现这样一种场景,领导要求用JavaMail开发邮件发送,功能开发测试好以后,发现项目用的jar包是geronimo-javamail_1.4_spec-1.3.jar,而不是Oracle官方的mail.jar,两者不能完全等同。若不清楚这点,就会出现一些不必要的麻烦。

一、关于Apache Geronimo

  一个用于企业系统开发的开源项目,你会惊讶于百度竟然没有多少可参考资料,就连百度百科上的介绍也只有几百字,谷歌上倒有不少介绍,英语不好,暂时略过。作为一个J2EE应用服务器,在Eclipse早已提供开发支持,配置截图如下:

【百度百科】

Apache Geronimo 是 Apache 软件基金会的开放源码J2EE服务器,它集成了众多先进技术和设计理念。
这些技术和理念大多源自独立的项目,配置和部署模型也各不相同。
Geronimo能将这些项目和方法的配置及部署完全整合到一个统一、易用的模型中。

  另外,好在IBM developerWorks中国上给出完整的介绍和详细的使用教程,下面介绍内容摘自IBM developerWorks中国的Geronimo 入门:(注:IBM developerWorks中国有不少关于它的技术文章,推荐参考学习)

  • Geronimo 中集成的开放源码项目|开放源码项目 |说明|

Apache Tomcat 5.5支持 Java Servlet 2.4 和 JavaServer Pages™(JSP) 2.0 的 Web 层应用服务器
Jetty支持 Java Servlet 2.4 和 JavaServer Pages™(JSP) 2.0 的 Web 层应用服务器 —— 可以替代 Tomcat 服务器
ActiveMQ开放源码的 Java Message Service(JMS) 1.1 应用程序提供者,支持消息驱动 bean(MDB)
OpenEJB开放源码的 Enterprise JavaBeans(EJB)容器系统和 EJB 服务器,支持 Enterprise JavaBeans 2.1,包括 Container Managed Persistence 2(CMP2)和 EJB Query Language(EJBQL)
Apache Axis 和 Scout一种 Simple Object Access Protocol(SOAP)实现(Axis)和 JSR 93(JAXR)实现(Scout),用于 Web 服务和 Web Services Interoperability Organization(WS-I) Basic Profile 支持
Apache Derby完全成熟的关系数据库管理系统(RDBMS),支持本机 Java Database Connectivity(JDBC)
  • 集成在 Geronimo 中的开放源码项目|开放源码项目 |说明|

Spring Framework流行的应用程序框架,用于从轻量级 Inversion of Control(IoC)组件构建应用程序
ServiceMix开放源码工具集,支持 Java Business Integration(JBI)并且为面向服务体系结构(SOA)实现提供 Enterprise Service Bus(ESB)

  当然以上介绍的内容和我要讲的内容关系不大,仅作知识普及。介绍内容好像没有提到我说的geronimo-javamail_1.4,不过从我的理解角度来讲,geronimo-javamail_1.4是Apache基于Geronimo开发的JavaMail服务组件,还有类似的servlet组件和JTA组件等,这些组件都有单独的jar包,Geronimo官网上我并没找到这些jar包,而是在outofmemory网站的Maven中央仓库找到的。(http://maven.outofmemory.cn/o...

二、geronimo-javamail_1.4使用说明

1、jar包不全,导致邮件发送异常报错

  简单将Apache的geronimo-javamail_1.4_spec-1.3.jar等同Oracle官方的mail.jar,沿用原有代码进行邮件发送测试,出现如下异常错误信息:

javax.mail.NoSuchProviderException: Unable to locate provider for protocol: smtp at javax.mail.Session.getProvider(Session.java:237) at javax.mail.Session.getTransport(Session.java:346) 

  从报错信息来看,是缺少名为smtp的provider,信息很明确,却不知从何排查。我当时的第一反应是,两者的配置方式可能不同,但从网上大部分给出的意见是用回原来的mail.jar包(比如stackoverflow:Unable to locate provider for protocol: smtp),以致于我也开始放弃其他解决方案。但是当我将这种解决方案用在项目中,我开始产生另外一种顾虑,geronimo-javamail_1.4会不会已经在其他功能中使用了?(这个评估不到位,就可能导致不必要的风险),再者项目用的是Maven依赖库,进行jar删除操作也是一件麻烦的事,而仅加多mail.jar又会引发其他问题(参看JavaMail邮件发送不成功的那些坑人情况及分析说明的“4、jar包重叠存在javax.mail.*”)。

  于是,我又尝试搜索可能的其他解决方案,不过这次从我尝试翻墙试试谷歌,果然无意间看到了一个关于Geronimo JavaMail 1.4的官方指导说法,内容如下:(链接:http://geronimo.apache.org/ma...

  原来是因为缺少geronimo-javamail_1.4_provider这个配套jar包,可是在stackoverflow这个专业的问答社区网站也没见人提及,这也足以说明Geronimo JavaMail 1.4确实还应用得不是很广泛。

2、jar包版本配套不兼容,导致邮件内容错误

  虽然问题是找到,但也很快出现的另外一个问题,项目使用的是geronimo-javamail_1.4_spec-1.3.jar,geronimo-javamail_1.4_provider该用哪个版本呢?我想邮件发送是基本常用功能,应该不会改动太大,代码应该是兼容的。由于没有找到官方给的配套版本说明,我就先从outofmemory网站的Maven中央仓库下载了最新的provider-1.8.3.jar。测试发现发送的邮件无标题且内容乱码,一下子抛出了一个jar包配套兼容性的问题。

  抱着试试看的想法,我又下载了provider-1.3.jar和provider-1.4.jar,结果测试都正常。这下问题来了,到底选1.3还是1.4呢?把问题和风险上报领导,领导也是举棋不定了...既然官方说明是javamail_1.4_spec-1.6.jar配套javamail_1.4_provider-1.7.jar,那javamail_1.4_spec-1.3.jar就参考配套javamail_1.4_provider-1.4.jar吧,也只能这么参考选择了...(其实也是一个不太科学的选择方法)

转载于:https://www.cnblogs.com/JackFe/p/6557367.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值