服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

java mail api及其应用 ―― 一个邮件列表服务器的实现 (二)(转贴)


  邮件列表服务经常用于为工作组提供基于email的讨论环境,订阅者通过它讨论共同感兴趣的问题。

   本文提供的示例程序listserver是一个简单的邮件列表转发服务器:它从指定帐号读取新邮件并发送给所有订阅者。java mail api不仅使得实现其基本功能相当简单(使用缺省的pop3和smtp),而且保证了程序易于支持任何可能遇到的系统环境。

   运行该程序需要包含以下支持文件:java mail (mail.jar)、jaf(activation.jar)以及缺省的pop3支持(pop3.jar),如下面dos批命令文件所示(这些jar文件可以从sun的java mail主页下载,参见相关资源):

   @echo off

   path .;d:/jdk1.1/bin

   set classpath=.;d:/jdk1.1/lib/classes.zip;activation.jar;mail.jar;pop3.jar

   java listserver %1 %2 %3 %4 %5 %6 %7 %8 %9

   程序启动后先由main()过程读取命令行参数,如邮件服务器、邮件帐号、更新周期等。接下来创建listserver实例,最后进入“读取新邮件并转发给订阅者/等待直到下一次检查时间到来”无限循环。listserver的核心功能(即读取和转发所有新邮件)在process()过程实现,其主要操作过程为:

   ◆获取javax.mail.session实例,并进而获得javax.mail.store实例。

   ◆利用javax.mail.store实例获得缺省收件箱(inbox)javax.mail.folder实例。

   ◆使用javax.mail.folder对象提取新邮件,存储为javax.mail.message对象数组。

   ◆创建javax.mail.fetchprofile以(潜在地)优化对特定邮件组成成分的提取。

   请注意此处javax.mail.fetchprofile类的应用。fetchprofile类提供邮件协议提供者特有可选参数,其目的是更有效地实现邮件组成成分的预提取。java mail api鼓励延迟提取邮件成分――即仅在真正需要的时候才提取。这不仅有利于改善系统的响应时间,某些操作(如显示邮件标题列表)也能够从中得到好处。下面代码说明了fetchprofile的基本用法:

   // 提取所有邮件的属性和标记
message[] messages = folder.getmessages();
fetchprofile fp = new fetchprofile();
fp.add(fetchprofile.item.envelope);
fp.add(fetchprofile.item.flags);
fp.add("x-mailer");
folder.fetch(messages, fp);


   sendmsg()过程由processmsg()调用,负责分析指定收件并将它转发给所有订阅者。它首先获得缺省session实例,然后创建javax.mail.transport对象发送消息:

   // 设置属性并获得缺省进程实例
properties props = new properties();
props.put("mail.smtp.host", _smtphost);
session session = session.getdefaultinstance(props, null);
......
// 发送消息
transport transport = session.gettransport(smtp_mail);
transport.connect(_smtphost, _user, _password);
transport.sendmessage(newmessage, _tolist);


   邮件字段(如收件人、发件人、邮件主题和日期等)的设置方法如下:

   // 创建新邮件 address replytolist[] = { new internetaddress(replyto) };
message newmessage = new mimemessage(session);
if (_fromname != null)
newmessage.setfrom(new internetaddress(from,
_fromname + " / " + replyto));
else
newmessage.setfrom(new internetaddress(from));
newmessage.setreplyto(replytolist);
newmessage.setrecipients(message.recipienttype.bcc, _tolist);
newmessage.setsubject(subject);
newmessage.setsentdate(sentdate);


   填写邮件内容应该区分其类型(纯文本和复合内容使用不同方法):

   // 填写邮件内容 object content = message.getcontent(); //原邮件内容
string debugtext = "主题: " + subject + ", 发送日期: " + sentdate;
if (content instanceof multipart)
{
debugmsg("转发复合内容邮件 (" + debugtext + ")");
newmessage.setcontent((multipart)message.getcontent());
}
else
{
debugmsg("转发纯文本邮件 (" + debugtext + ")");
newmessage.settext((string)content);
}



   可以看到,javax.mail.internet.mimemessage内容读取例程getcontent()只需要一次调用就可以读取复杂的分级复合邮件。

 

扫描关注微信公众号