附录:listserver.java
/**
* 类listserver提供基本的邮件列表服务功能:读取指定邮件帐号的所有新邮件,然后转发给
* 在emaillistfile文件中指定的所有邮件帐号(订阅者).emaillistfile中的邮件帐号格式
* 为每一行一个邮件帐号.
*/
import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
public class class1
{
private static final string inbox = "inbox", pop_mail="pop3", smtp_mail="smtp";
private boolean debugon = false;
private string _smtphost = null,
_pop3host = null,
_user = null,
_password = null,
_emaillistfile = null,
_fromname = null;
private internetaddress[] _tolist = null;
//main():创建和启动listserver实例
public static void main(string args[])
throws exception
{
//检查输入参数
if (args.length < 6)
{
system.err.println("usage: java listserver smtp服务器 pop3服务器 pop3帐号 pop3帐号密码 订阅者清单文件 检查周期(分钟) 发信人名称");
system.exit(1);
}
// 将命令行参数赋值给对应的变量
string smtphost = args[0], //smtp服务器
pop3host = args[1], //pop3服务器
user = args[2], //pop3邮件帐号
password = args[3], //pop3邮件帐号密码
emaillistfile=args[4], //订阅者清单文件
fromname = null; //发信人名称
int checkperiod = integer.parseint(args[5]); //新邮件检查周期
if (args.length > 6)
fromname = args[6];
// 创建listserver实例,循环处理新邮件
listserver ls = new listserver();
ls.setdebug(false);
while (true)
{
ls.debugmsg("listserver启动...");
ls.process(smtphost, pop3host, user, password, emaillistfile, fromname);
ls.debugmsg("listserver暂停 (休息 " + checkperiod + " 分钟)");
thread.sleep(checkperiod*1000*60);
}
}
// process(): 检查新邮件,调用 processmsg() 处理单个邮件
public void process(string smtphost, string pop3host, string user, string password, string emaillistfile, string fromname)
throws exception
{
_smtphost = smtphost;
_pop3host = pop3host;
_user = user;
_password = password;
_emaillistfile = emaillistfile;
if (fromname != null)
_fromname = fromname;
// 将订阅者帐号读入 java.util.vector
vector vlist = new vector(10);
bufferedreader listfile = new bufferedreader(new filereader(emaillistfile));
string line = null;
while ((line = listfile.readline()) != null)
{
vlist.addelement(new internetaddress(line));
}
listfile.close();
debugmsg("共计 " + vlist.size() + " 个订阅者");
_tolist = new internetaddress[vlist.size()];
vlist.copyinto(_tolist);
vlist = null;
// 获得 session 对象
properties sysproperties = system.getproperties();
session session = session.getdefaultinstance(sysproperties, null);
session.setdebug(debugon);
// 连接pop3邮件服务器
store store = session.getstore(pop_mail);
store.connect(pop3host, -1, _user, _password);
// 打开缺省文件夹
folder folder = store.getdefaultfolder();
if (folder == null)
throw new nullpointerexception("没有缺省邮件文件夹");
folder = folder.getfolder(inbox);
if (folder == null)
throw new nullpointerexception("无法打开文件夹: " + folder);
folder.open(folder.read_write);
// 获得新邮件数
int totalmessages = folder.getmessagecount();
if (totalmessages == 0)
{
debugmsg(folder + " 没有新邮件");
folder.close(false);
store.close();
return;
}
// 获得所有新邮件的属性和标记
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);
// 处理每一个新邮件
for (int i = 0; i < messages.length; i++)
{
if (!messages[i].isset(flags.flag.seen))
processmsg(smtphost, messages[i]);
messages[i].setflag(flags.flag.deleted, true);
}
folder.close(true);
store.close();
}
// processmsg(): 分析单个新邮件并调用sendmsg()将它转发给所有订阅者
private void processmsg(string smtphost, message message)
throws exception
{
string replyto=_user, subject, xmailer, messagetext;
date sentdate;
int size;
address[] a=null;
// 获得邮件头信息 (发件人,收件人,邮件主题,发送日期等.)
if ((a = message.getfrom()) != null)
replyto = a[0].tostring();
subject = message.getsubject();
sentdate = message.getsentdate();
size = message.getsize(); string[] hdrs = message.getheader("x-mailer");
if (hdrs != null)
xmailer = hdrs[0];
// 转发邮件
sendmsg(_user, sentdate, replyto, subject, message);
}
// sendmsg():将指定邮件转发给所有订阅者
private void sendmsg(string from, date sentdate, string replyto,
string subject, message message)
throws exception
{
// 获得缺省 session实例
properties props = new properties();
props.put("mail.smtp.host", _smtphost);
session session = session.getdefaultinstance(props, null);
// 创建转发邮件,填写各栏目
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);
}
// 转发邮件
transport transport = session.gettransport(smtp_mail);
transport.connect(_smtphost, _user, _password);
transport.sendmessage(newmessage, _tolist);
}
private void debugmsg(string s)
{
if (debugon)
system.out.println(new date() + "> " + s);
}
public void setdebug(boolean state) { debugon = state; }
闽公网安备 35060202000074号