免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1349 | 回复: 0
打印 上一主题 下一主题

JavaMail的初步实现 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-07-27 13:40 |只看该作者 |倒序浏览
前天完成了ASP用JMAIL发邮件,我想JSP一定也可以发邮件的。参考了网上一些文章以后,今天再写一篇JSP用JAVAMAIL发邮件,内容包括发通过SMTP(带SMTP验证)发简单邮件,中文主题乱码的解决。^_^
前天完成了ASP用JMAIL发邮件,我想JSP一定也可以发邮件的。参考了网上一些文章以后,今天再写一篇JSP用JAVAMAIL发邮件,内容包括发通过SMTP(带SMTP验证)发简单邮件,中文主题乱码的解决。^_^

参考文章:JAVAMAIL快速入门
链接:http://www.wendom.net/info/1118-1.htm

JavaMail发送邮件中主题乱码的解决方法
链接:http://www.daima.com.cn/Info/125/Info37743/

系统要求:
支持JAVA的PC操作系统;
如果你使用的是Java2企业版(J2EE)1.3,那么它已经自带有JavaMail,因此不需要进行额外的安装。但是如果你使用的是Java2标准版(J2SE)1.1.7及以后的版本,那么如果想要你的应用程序具备收发email的能力,下载并安装以下两个应用程序:
  l、JavaMail
  2、JavaBeans Activation Framework
  安装很简单,只需解压下载的文件(从SUN下载即可),并把所包含的jar文件添加到你机器的classpath下。
总共下载了6个jar包。其中mailapi.jar文件包含核心API类,而pop3.jar和smtp.jar文件包含各自的email协议实现部分。(在这篇文章中我们不使用imap.jar文件)。可以认为实现部分跟JDBC(Java数据库连接)驱动程序相似,不过它是用于消息系统而不是用于数据库而已。至于mail.jar文件,它包含了上面的每一个jar文件,因此,你可以在你的classpath中只包含mail.jar和activation.jar文件。
  Activation.jar文件允许你通过二进制数据流的形式处理MIME类型的访问。在后面“不仅仅可以发送普通文本”这一部分会讲到DataHandler类,你可以在那找到相关信息。
  至于记录,本文的余下部分没有对API做全面的讲解;不过你可以学着去做一做。如果你想更多的了解API信息,你可以查看每个下载包中的PDF文件以及Javadoc。
我的CLASSPATH是这样(前面的部分省略):E:j2sdk1.4.2libmail.jar;E:j2sdk1.4.2libactivation.jar(其实这样做还不够,后面会有说明)

通过SMTP发送email

  这个例子告诉你怎样通过SMTP发送一个基本的email消息。先新建两个文件:

//index.html
//这个是邮件发送内容填写页面:

撰写邮件


收信人地址:


主题:





发送">
重置">

//testmail.jsp
//邮件发送功能实现

中文处理代码-->
发送成功

try{

//从html表单中获取邮件信息
String tto=request.getParameter("to");
String ttitle=request.getParameter("title");
String tcontent=request.getParameter("content");

Properties props=new Properties();//也可用Properties props = System.getProperties();
props.put("mail.smtp.host","smtp.163.com");//存储发送邮件服务器的信息
props.put("mail.smtp.auth","true");//同时通过验证
Session s=Session.getInstance(props);//根据属性新建一个邮件会话
s.setDebug(true);

MimeMessage message=new MimeMessage(s);//由邮件会话新建一个消息对象

//设置邮件
InternetAddress from=new InternetAddress("yourmail@163.com");
message.setFrom(from);//设置发件人
InternetAddress to=new InternetAddress(tto);
message.setRecipient(Message.RecipientType.TO,to);//设置收件人,并设置其接收类型为TO
/*
ttitle = StringUtil.getString(ttitle, "GB2312");
ttitle = new String(Base64.encode((ttitle).getBytes()));
message.setSubject("=?GB2312?B?" + ttitle + "?=");
*/
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
message.setSubject("=?GBK?B?"+enc.encode(ttitle.getBytes())+"?=");
//message.setSubject(ttitle);//设置主题
message.setText(tcontent);//设置信件内容
message.setSentDate(new Date());//设置发信时间

//发送邮件
message.saveChanges();//存储邮件信息
Transport transport=s.getTransport("smtp");
transport.connect("smtp.163.com","yourmail","yourpass");//以smtp方式登录邮箱
transport.sendMessage(message,message.getAllRecipients());//发送邮件,其中第二个参数是所有
//已设好的收件人地址
transport.close();

%>
发送成功!
再发一封
}catch(MessagingException e){
out.println(e.toString());
}
%>

注意testmail.jsp代码中的这一段:

/*
ttitle = StringUtil.getString(ttitle, "GB2312");
ttitle = new String(Base64.encode((ttitle).getBytes()));
message.setSubject("=?GB2312?B?" + ttitle + "?=");
*/
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
message.setSubject("=?GBK?B?"+enc.encode(ttitle.getBytes())+"?=");

这里包括两个关于邮件主题中文乱码的解决方法,注释里边的不能用,原因是StringUtil可能是作者单独开发的类,你如果没有该类将不能编译成功。下面两句可以使用。

下面是本文参考的第二篇文章关于中文主题乱码的解释:

“在邮件正文中的乱码容易解决。但邮件主题的乱码无论怎样转码总是显示一堆乱码。到底应该怎么处理呢?

JavaMail中的邮件主题需要进行BASE64编码,格式形如:
=?GB2312?B?xPq1xMPcwuvS0b6t1tjWw6Osx+u+ob/stcfCvKOssqLQ3rjEw9zC66Oh?=
所以,直接使用msg.setSubject("中文主题"),或者msg.setSubject("中文主题".getBytes("8859_1"), "GB2312"))都一样会出现乱码。在设置邮件主题前需要将主题字串的字节编码为BASE64格式,并添加编码头,示例代码如下:
sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();    msg.setSubject("=?GB2312?B?"+enc.encode(subject.getBytes())+"?="); ”

到此为止代码已经开发完毕,把它们放在WEBSERVER相应目录下运行一下吧:结果在我这里发现了一些类似这样的错误:

Error: Unable to comple class "import javax.mail.*".......

程序提示我们没有找到javax.mail.*等类,但是我们前面的CLASSPATH设置是正确的(我用其它方式证明过了)。我通过重启PC,重启TOMCAT也没有解决问题。后来发现把mail.jar,activation.jar放在WEBAPP的目录(这里指放index.html&testmail.jsp的那个目录,而且应该是一个虚拟目录,不能是虚拟目录的子目录)的 /WEB-INF/lib/目录下SERVLET编译成功了(不懂的应该参考WEBAPP的目录结构相关内容)。在testmail.jsp中第一行我们是这样写的:import="java.util.*,javax.mail.*,javax.mail.internet.*" ,我觉得应该只和CLASSPATH有关才对,这个问题有待研究解决。

到此测试可以说是基本完成。邮件正常发送,中文主题在大多数情况可以正确显示(在我的GMAIL上还是乱码)。剩下的就是理解关于JSP的CLASSPATH和深入JAVAMAIL编程了。顺便说一下,在实际应用中应该用JAVABEAN和SERVLET实现,并结合数据库功能,效果将会更好(本文只作初步实现,这些内容不予讨论)^_^


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/5756/showart_37869.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP