OpenCms6.0.0本身已具有MailForm结构化类型用于网站在线发送邮件,可是在表单项中没有FILE,无法发送其它文件类型的附件,必须修改MailForm结构化类型,并重新去编译org.opencms.frontend.templateone.form中的内容。由于使用JavaMail来发送邮件是很简单的事,而且我本身也有已经写好的邮件发送类,只需要加入邮件附件发送的功能即可,因此决定自行编写新的类来发送邮件及其附件。
如果你用Google或是Baidu可以从网上搜到大片的使用JavaMail发送邮件及附件的例子和文章,皆由JavaMail本身的一个例子而来,此例子中先使用MimeMultipart multi来创建一个信体(这是要发附件所必须的),然后使用MimeBodyPart mbp1 、MimeBodyPart mbp2 来分别创建多个信体内容,文本的信体内容直接使用mbp1.setText(msgText1),而要加文件附件则使用mbp2.setDataHandler(),DataHandler只按受DataSource、Object String和URL类型,例子中直接使用FileDataSource fds =new FileDataSource(filename)来创建一个DataSource,然后使用mbp2.setDataHandler(new DataHandler(fds))将这个附件放进去。filename来自本地的文件名,本身必须存在,所以它是无法使用客户端的文件名来创建的,因此看到网上有好多人使用此例子后才发现在客户端上传的文件报错无法发送附件(那是当然了,有的例子中Form中的数据都没封装,只是取得客户端的文件名去创建当然找不到文件抛出异常了)。
解决办法之一:在客户端发送邮件提交文件附件时,先上传此文件到服务器,这样才能使用上传后得到的路径和文件名来创建DataSource发送文件附件,而使用FILE表单项必须使用ENCTYPE="multipart/form-data"来封装数据,这样使用request.getParameter就无法获得表单其它选项的值了。所幸有jspsmartupload这个上传组件,它将表单中封装的数据转换成了byte[]类型,然后进行截取,将文件上传后使用myUpload.getRequest().getParameter("formname")即可获得所需要的表单提交后的值,这样虽然解决了问题,但是所发送的邮件附件文件并不是我所需要保存的,而且在上传时还进行了一次磁盘写的操作,对性能也有影响,那么为何不在文件上传读到内存中直接来创建呢,请看我的第二个解决方法。
解决方法之二:使用jspsmartupload组件将文件上传后直接取得文件流来创建DataSource。本身FileDataSource并不支持从InputStream来创建DataSource,所以我们需要编写一个新的FileDataSource,在网上已经有ByteArrayDataSource.java文件,它支持以InputStream、byte[]和String来创建DataSource,使用ByteArrayDataSource fds = new ByteArrayDataSource(files,"application/octet-stream");我们即可使用InputStream、byte[]和String来创建DataSource发送文件附件。不幸的是我们无法直接使用jspsmartupload组件来取得上传文件的stream,jspsmartupload组件的文档中只有getContentString返回文件内容的String,如果附件是纯文本文件用此String来创建DataSource发送附件没有问题的,可是文件类型如果是其它格式,如Word、图片或压缩包,则文件无法使用了,另一个getBinaryData返回的是byte类型,需要循环读出,无奈之下只有反编译jspsmartupload中的File.class,在其中新加了返回InputStream,代码如下:
public InputStream getBinValue (){
InputStream ip =new DataInputStream(new ByteArrayInputStream(m_parent.m_binArray, m_startData,m_size));
return ip;
}
这样我们创建InputStream,使用myUpload.getFiles().getFile(0).getBinValue();获得上传文件的Stream来创建DataSource发送邮件附件,然后再关闭它。
以上两种方法均可解决在客户端发送邮件附件的问题,大家可自行取舍。
原文地址:http://www.maxuan.com/opencms/article/archive/200709/20070918.html
分享到:
相关推荐
javamail jaf jspsmartupload 开发文档,java邮件开发,文件上传等
基于JaVaMail的Web邮件客户端的设计与实现
能模拟电子邮件的发送,包括qq、sina(新浪)、163等邮件,使用SMTP协议(smtp.qq.com smtp.sina.com smtp.163.com)
介绍了如何利用javamail实现带附件的邮件发送,附有代码
这是我们学习JSP时~书上介绍的几个组件分别实现文件上传下载,发送EMail,制作图表以及报表!希望对童鞋们有点用!~~
javaMail 用附件路径,文件流 byte[] 或 base64 字符串 实现发送附件功能
此源码是使用javamail发送邮件,可以实现静默发送邮件,可以发送附件资源等。有相应的使用说明,快捷好用
该资源是一个javamail发送邮件的例子,里面集成了别人的文件发送的功能,单次发送邮件只能上传一个附件。是一个测试方法,拿过来改一改邮件的地址和密码就可以使用了
利用JavaGUI和javamail实现的email客户端.pdf
web界面用封装的webmail.jar写的四川联通电子渠道邮件客户端,支持群发,
基于Javamail开发的带界面的邮件客户端,功能包括包括邮件发送,邮件转发,发送附件,邮件接受,邮件删除,邮件查询等。
06 使用JavaMail发送带附件的邮件.exe06 使用JavaMail发送带附件的邮件.exe
里面详细的介绍了JavaMail发邮件(包括单个附件和多个附件)的机制,还有JavaMail正常使用所需要的JAR包,源程序例子经过本人详细且严格的测试,大家下载下来就可以直接使用啦。
使用javamail,commons-mail发送邮件实例。 内含: eclipse工程文件夹 所用到的几个最新jar包,如commons-mail,jaf(activation)等。
软件课程设计的参考资料,可以参考一下,提供开始的思路
本资源是一个集合发送图片,附件,内容,HTML等得JAVAMAIL代码,并且可以同时发送多个附件多个图片,只需填充VO类,即可直接调用并发送邮件,例子已经写好,只要填充上必要值即可,经163,qq,sina测试没有问题,有...
本人最新写了一个邮件收发的例子,可以处理中文的 包括发送附件,附件标题也可以是中文的,可以给大 家参考下!希望能给大家一些帮助!
基于javamail1.4实现邮件发送,支持多收件人、抄送人、多附件等
jsp/servlet 模式的发送邮件系统 可发送多个附件 存在的问题为 subject可能会乱码 有问题可以给我留言
使用JavaMail发送邮件,可以发送附件,邮件的内容也可以是html格式的。在工作中做的小demo