工作中接到一个需求:大致是在三个系统中实现邮件自动发送功能,如果在三个系统都部署邮件发送程序的话会产生大量冗余代码,而且后期维护升级的时候也很麻烦。因此决定在一个系统中实现邮件发送功能,其他系统调用这个功能就行了。
发送邮件可以用javamail和linux的服务来实现,由于我对linux不是很熟悉,因此采用javamail;webservice可以为邮件功能提供一个接口,让其他系统可以通过这个接口实现邮件的发送。因此开发的关键点就是如何用javamail发送邮件和如何用webservice调用javamail发送邮件。
首先开发邮件发送程序,用javamail作为关键字google一下,得到一大堆示例,再去sun官网找到API,于是乒乒乓乓一个java发邮件的基类就出来了,然后根据需求编写每一种邮件的派生类,javamail的部分暂时搞定。 webservice通常用axis实现,这次发现系统里没有axis的jar却恰恰有xfire的jar,于是用xfire实现;xfire实现webservice超容易,主要就是在web.xml中配置一下servlet,在工程的src/META-INFO/xfire/service.xml声明service接口和实现类,然后webservice就算是部署上了,当然xfire功能还是很丰富很强大的,不过这次我也就需要这么一点点功能。
然后在另外两个系统里面设置一下client调用service。在设置client的时候碰到了麻烦,根据xfire官网的权威教程,使用client访问service非常简单,只需要: client.invoke(op, params); 即可调用service,结果发现这样调用的时候由于client端的校验程序,params中只能传递八种基本类型扩展型对象,死活传不了数组,于是经过仔细研究+同事讨论+大量google/baidu,采用这样的方式调用
service: Service serviceModel = new ObjectServiceFactory(Class clazz, String name, String namespace, Map properties);
XFireProxyFactory serviceFactory = new XFireProxyFactory();
MailService service;String url = "xxxxxxxx";
service = serviceFactory.create(serviceModel, url);
Client client = Client.getInstance(service);
client.setProperty(CommonsHttpMessageSender.HTTP_TIMEOUT, "0");
service.ooxx(); // 调用服务方法;
这样就可以将数组参数从client传递到server了,当然还可以用特殊类型绑定的方式传递对象,不过这次不需要这么复杂的东西。
webservice搞定以后剩下的就是调试和部署了。在将程序从windows开发平台部署到linux上的时候发现smtp验证始终通不过,一开始报500:bad syntax错误,通过使用另外一个smtp地址解决,然后报501 syntax.helo hostname。百思不得其解之下google/baidu半天,最后在sun论坛发现有高手告知解决办法:
properties.put("mail.smtp.localhost", smtphost);
加了这条属性之后终于邮件发送功能乖乖的运行了。HOHO。