`
liuc121
  • 浏览: 6203 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

oracle ilearning邮件发送的配置修改

阅读更多

1.背景介绍:公司10多年一直做oracle ilearning的实施,oracle是不提供源码的,我们只能靠自己反编译、继承等一些手段来实现客户化,系统发送邮件功能有一个配置文件可配置,但是要求不验证邮箱密码通过javamail发送邮件。之前我们面对的客户主要的都是一些大型企业客户,他们一般都有自己的邮件服务器,在邮件服务器上做一下设置就行,但是目前一些客户一般都使用网易、腾讯等企业邮箱,这些供应商一般不会提供免验证发送邮件的。这就需要我们解决这个问题,有两个方案:一、自己搭建一个邮件服务器。二、修改oracle ilearning原始发送邮件功能的代码。

 

2.进入正题:我这边使用Apache的James mail自己搭建过邮件服务器。但自己搭建邮件代价较大,这里说一下如何修改原始功能代码使用javamail发送邮件。

oracle ilearning邮件发送功能的配置在 ~WEB-INF/ilearning.properties文件中

# *******************************************************************

#Example: MAIL_HOST=smtp02.us.oracle.com
MAIL_HOST=smtp.163.com

#ADMIN_EMAIL: The email address where system generated emails will be sent from
#Recommendation: set to valid email address
#Default setting: nobody@<domain>
#Example: ADMIN_EMAIL=admin@mycompany.com
#This email account is used for forgot password emails.  Bounced emails
#will be returned to this address.
ADMIN_EMAIL=admin@163.com

 MAIL_HOST对应的是邮件服务器发送地址,ADMIN_EMAIL是发件人。

 

那么oracle ilearning 原始代码是怎么调用的呢?没有源码,只有通过简单的找回密码功能一步一步一层一层的找。终于使用强大的MyEclipse反编译工具插件(附件可下载),找到邮件发送类:oracle.ila.common.collaboration.email.EmailUtil。以下是反编译出来的部分代码

//发送失败后重复尝试发送的次数
public static final int RESEND_EMAIL = 5;

//构造函数
public EmailUtil() {
	Properties props = setMailHost();
	this.session = Session.getDefaultInstance(props, null);
	this.msg = new MimeMessage(this.session);
}

//设置smtp邮件发送地址配置
private Properties setMailHost(){
     Properties _props = new Properties();
     _props.put("mail.smtp.host", ILAProperties.getMailHost());
 
     return _props;
}

//具体的发送逻辑代码
private void transportMessageToMailer(boolean forceSend)
     throws SendFailedException, MessagingException{
     SendFailedException lastError = null;
     int count = 0;
     for (int i = 0; i < 5; ++count) {
       lastError = null;
       try {
         Transport.send(this.msg);
       }
       catch (SendFailedException es) {
         Address[] validUnsent = es.getValidUnsentAddresses();
         Address[] vailidSent = es.getValidSentAddresses();
         Address[] InvalidAddress = es.getInvalidAddresses();
 
         if ((validUnsent == null) && (validUnsent == null) && (InvalidAddress == null))
         {
           lastError = es;
         }
         else
         {
           if ((forceSend) && (validUnsent != null))
           {
             Transport.send(this.msg, validUnsent);
             throw new SendFailedException(es.getMessage(), es, validUnsent, null, es.getInvalidAddresses());
           }
 
           throw es;
         }
       }
       ++i;
     }
 
     if (lastError != null) {
       Logger.error("EmailUtil ->transportMessageToMailer: SMTP Connection Failed - Have tried  " + Integer.toString(count) + " times to send message");
       throw lastError;
     }
   }

 以上反编译的结果肯定会和源码有些差别的,很明显的错误需要修改一下即可。那么我们就来说说,如何修改可实现配置验证邮箱密码发送邮件。

第一步,检查反编译出来的代码是否有错,解决明显的错误,可能大家会忽视下面一个错误:

private void transportMessageToMailer(boolean forceSend)
     throws SendFailedException, MessagingException
   {
     SendFailedException lastError = null;
     int count = 0;
    //发编译的结果常量直接变成了具体的值 for (int i = 0; i < 5; ++count) {
     for (int i = 0; i < RESEND_EMAIL; ++count) {
       lastError = null;
       try {
         Transport.send(this.msg);
	//这里很明显漏了一个return ,如果不加return那么系统会一次性发送5封相同的邮件。下面加上
		return;
       }
       catch (SendFailedException es) {
         Address[] validUnsent = es.getValidUnsentAddresses();
         Address[] vailidSent = es.getValidSentAddresses();
         Address[] InvalidAddress = es.getInvalidAddresses();
 
         if ((validUnsent == null) && (validUnsent == null) && (InvalidAddress == null))
         {
           lastError = es;
         }
         else
         {
           if ((forceSend) && (validUnsent != null))
           {
             Transport.send(this.msg, validUnsent);
             throw new SendFailedException(es.getMessage(), es, validUnsent, null, es.getInvalidAddresses());
           }
 
           throw es;
         }
       }
       ++i;
     }
 
     if (lastError != null) {
       Logger.error("EmailUtil ->transportMessageToMailer: SMTP Connection Failed - Have tried  " + Integer.toString(count) + " times to send message");
       throw lastError;
     }
   }

第二步,自己创建添加一个javamail的验证类

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

/**
 * @author Chan Lewis
 * @version 2014-3-24
 */
public class MyAuthenticator extends Authenticator{
	String userName = null;
	String password = null;

	public MyAuthenticator() {
	}

	public MyAuthenticator(String username, String password) {
		this.userName = username;
		this.password = password;
	}

	protected PasswordAuthentication getPasswordAuthentication() {
		return new PasswordAuthentication(userName, password);
	}

}

 第三步,修改邮件的初始化配置

//构造函数
public EmailUtil(){
  Properties props = setMailHost();
  //是否验证密码,可在ilearning.properties中添加配置
  String isValidateStr = ILAProperties.getProperty("SMTP_AUTH");
  if(null!=isValidateStr && "true".equalsIgnoreCase(isValidateStr)){  //如果验证密码
	  //添加初始化配置
          props.put("mail.smtp.port", "25");
	  props.put("mail.smtp.auth", "true");
	  MyAuthenticator authenticator = new MyAuthenticator(ILAProperties.getProperty("ADMIN_EMAIL"), ILAProperties.getProperty("ADMIN_PASSWORD"));
	  this.session = Session.getDefaultInstance(props, authenticator);
  }else{ //如果不验证密码
	  this.session = Session.getDefaultInstance(props, null);
  }
  this.msg = new MimeMessage(this.session);
}

 ilearning.properties中添加相关配置SMTP_AUTH 、ADMIN_PASSWORD

# *******************************************************************

#Example: MAIL_HOST=smtp02.us.oracle.com
MAIL_HOST=smtp.163.com
SMTP_AUTH=true

#ADMIN_EMAIL: The email address where system generated emails will be sent from
#Recommendation: set to valid email address
#Default setting: nobody@<domain>
#Example: ADMIN_EMAIL=admin@mycompany.com
#This email account is used for forgot password emails.  Bounced emails
#will be returned to this address.
ADMIN_EMAIL=admin@163.com
ADMIN_PASSWORD=password

#******************************************************************************

OK到此为止就修改完成了。这样修改之后,既可以使用javamail不验证发送邮件,也可以验证用户名密码发送邮件,具体可在ilearning.properties文件里面配置。

 

3.问题答疑:有些新手可能还会问,我这边反编译后怎么替换原始功能呢?

答:原始的功能除oracle官方发布的补丁之外,一般都打包在ilearning.jar中,主要看你现在使用的web服务器,一般买了oracle ilearning的基本都是使用oracle IAS服务器的,所以把自己修改的java文件生成类文件放到对应的目录即可。另外一种办法是通过打包技术把生成的类文件重新打包到ilearning.jar(不建议使用)。

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    Oracle iLearning 产品综述 白皮书

    Oracle iLearning 5.0 产品综述. Oracle iLearning是一种企业级的学习管理系统,可作为订阅服务或发放许可的产品来提供。其中,订阅服务具有使用方便和费用低廉的特点,它通过Web提供个性化教育,是一种可在整个...

    提高培训质量和效率 降低培训管理成本 有力支撑人才发展 Oracle iLearning构筑宝钢网络培训系统.pdf

    【Oracle iLearning构筑宝钢网络培训系统】 Oracle iLearning是一款高效的企业级在线学习管理系统,它在宝钢集团的网络培训系统中起到了关键作用,显著提高了培训质量和效率,同时降低了培训管理成本,对人才培养...

    宝钢上马Oracle iLearning网络培训系统.pdf

    【Oracle iLearning网络培训系统】 Oracle iLearning是Oracle公司提供的一种先进的在线学习和培训管理系统,旨在帮助企业提升培训质量和效率。宝钢集团有限公司采用Oracle iLearning构建的新一代网络培训系统上线后...

    ilearning教程

    ilearning配置类,防止ilearning类中的丢失国际化,需要重新编译此文件。

    基于Oracle的HRMIS系统在发电厂的应用.pdf

    该系统的构建基于Oracle数据库,采用B/S架构,集成了Oracle Discoverer和Oracle iLearning两个子系统。Oracle Discoverer使得用户能够快速访问和分析关系型数据库中的数据,而Oracle iLearning则提供了便捷全面的...

    vbchengxudfsf

    根据提供的文件内容,本文主要介绍了Oracle FY09合作伙伴能力认证计划的相关信息,包括该计划的目的、利益回报、面向对象以及如何获得能力认证等关键知识点。 ### Oracle FY09合作伙伴能力认证计划 #### 计划说明 ...

    基于RxJava响应式框架Datamill.zip

    基于RxJava 的函数式 Reactive 风格的 Java web 框架。...  Server server = new Server(  rb -&gt; rb.ifMethodAndUriMatch(Method.GET, "/status", r -&gt; r.respond(b -&gt; b.ok()))  ....

    ilearning-view:集成学习环境,视图层

    "ilearning-view" 是一个专为集成学习环境设计的视图层项目,主要基于JavaScript语言开发。在现代软件开发中,视图层是用户界面的关键组成部分,负责展示数据并处理用户的交互。它与模型(Model)和控制器...

    ilearning-rust

    【ilearning-rust】项目是针对Rust编程语言的一个学习资源集合,旨在帮助开发者深入了解和掌握Rust。Rust是一种系统级编程语言,注重安全、速度和并发性,由Mozilla研发,广泛应用于操作系统、浏览器组件、游戏引擎...

    2012届华为校园招聘上机考试题.docx

    根据提供的文档信息,我们可以归纳出两个主要的技术知识点:一个是关于选秀节目评分算法的实现,另一个则是数组排序及特定格式输出的编程任务。接下来,我们将详细地解析这两个知识点。 ### 1....

    一个好的学习管理系统

    1. 学习管理系统实例:LMS系统包括Blackboard、WebCT、IBM LearningSpace、Oracle iLearning、Moodle、Atutor和Claroline等,它们各自具有不同的特性和优势。 2. 什么是学习管理系统?LMS是一种软件系统,通过Web...

    HR-主流软件对比

    - iLearning模块提供强大的外部培训和评估功能。 - 报表工具Discoverer相对易于使用。 - 缺点: - 补丁更新频繁,可能未完全开发完毕。 - 实施和升级过程复杂。 - 未内置门户功能,与其他系统集成困难。 - HR...

    OTN硬件介绍

    OTN硬件介绍,OTN是光纤远距离传输的应用设备,掌握OTN技术是对光纤传输的技术升级。

    京浙闽区域XXXX年中期工作总结.pptx

    产品销售主要集中在iTEST(19家)、Ilearning(10家)、写作(5家)和代理数据库(3家)。 在销售工作中,强调了与产品部的互动,成功进行了针对院校(如清华、人大)的主题营销活动,以及区域性的市场活动(如北京...

    教育培训信息化

    东航庞大的高质量要求的培训目标的实现,告诉我们:当企业对iLearning——在线学习管理系统有了足够的认识之后,企业迈向教育培训信息化的步伐也就加速了,自然也加快了企业成长的步伐。目前,东方航空在企业的教育...

    京浙闽区域中期销售工作总结.pptx

    iLearning作为自主学习资源,适用于图书馆和外语专业,提供学习资源的自建、管理、评估等功能。 市场开发活动的特色体现在主题活动上,如北京地区参加人大多媒体产品活动,借助核心院校开展地区性营销,强调产品...

    INFO-467_LSL:iLearn 实验室脚本库

    2. **实践编程技巧**:通过实验和修改脚本,你可以提高编程技巧,学习如何在第二人生中创建动态和交互的对象。 3. **学习事件处理**:了解不同类型的事件,以及如何编写响应事件的代码。 4. **模拟现实世界行为**:...

    华为OD的具体介绍.doc

    - **内部资源**:华为为OD员工提供了丰富的内部资源,包括wiki社区、ilearning学习平台等,这些平台有助于员工提升专业技能和个人能力。 - **发展空间**:OD员工能够获得与正式员工相似的职业发展机会,通过参与项目...

Global site tag (gtag.js) - Google Analytics