問題描述:
用Pop3收取gmail的郵件(摘錄)
用pop3收取gmail的郵件 入口參數: 用戶名 / 密碼 做一個線程,每15分鐘檢查一次郵箱,收取郵箱的郵件,並解碼後將標題顯示出來
當我看完問題後,靈機一動,馬上想到用java.util.TimerTask 和java.util.Timer類實現是最合適不過,雖然用線程也可以,可是會付出一些不必要的勞動;並且TimerTask類也是依靠線程來實現功能的
代碼如下:
java 代碼
測試類:
import java.util.*;
public class Test{
public static void main(String[] args)throws Exception{
MailTimerTask task=new MailTimerTask();
Timer mailTimer=new Timer();
mailTimer.schedule(task,2000,15*60*1000);
}
}
import java.util.*;
import java.io.UnsupportedEncodingException;
import java.security.*;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeUtility;
import java.lang.RuntimeException;
public class MailTimerTask extends TimerTask{
private static Store store=null;
//靜態初始化模塊
//保證後臺只存在一個Store 連接
static{
try{
connect("@mailName","@mailPassword");
}catch(Exception e){
e.printStackTrace();
}
}
public void run(){
try{
System.out.println("正在讀取郵箱");
this.printNewMails(this.getNewMails("@mailName","mailPassword"));
}catch(Exception e){
e.printStackTrace();
}
}
public static void connect(String mailName,String mailPassword)throws Exception{
Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
Properties props = System.getProperties();
props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
props.setProperty("mail.pop3.socketFactory.fallback", "false");
props.setProperty("mail.pop3.port", "995");
props.setProperty("mail.pop3.socketFactory.port", "995");
Session session = Session.getDefaultInstance(props,null);
URLName urln = new URLName("pop3","pop.gmail.com",995,null, mailName,mailPassword);
store = session.getStore(urln);
store.connect();
}
public Message[] getNewMails(String mailName,String mailPassword)throws Exception{
//當Store實例沒有存在連接時
if(store.isConnected()){
connect(mailName,mailPassword);
}
Folder inbox = store.getFolder("INBOX");
inbox.open(Folder.READ_ONLY);
FetchProfile profile = new FetchProfile();
profile.add(FetchProfile.Item.ENVELOPE);
//假定存在沒有閱讀的郵件爲新郵件
if(inbox.getUnreadMessageCount()>0){
int fetchCount=inbox.getMessageCount()-inbox.getUnreadMessageCount();
if(fetchCount==0){
return inbox.getMessages();
}
Message[] messages = inbox.getMessages(1,2);
return messages;
}
else{
System.out.println("不存在新郵件");
throw new RuntimeException("不存在新郵件");
}
}
public void printNewMails(Message[] msgs)throws Exception{
for(Message msg:msgs){
String text=msg.getSubject();
if (text == null)
System.out.println("該郵件無題");
else if (text.startsWith("=GBK") || text.startsWith("=gb2312"))
text = MimeUtility.decodeText(text);
else
text = new String(text.getBytes("gb2312"));
System.out.println("--"+text);
}
}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.