附錄: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; }
?