邮件会话-活动会话过多



我正在尝试开发一个邮件程序来下载/读取来自互联网服务器的电子邮件(例如gmail、gmx…(。因此我需要:

  • 一个Message[]阵列,用于从服务器存储/复制INBOX文件夹
  • 一个连接到pop3服务器的Store-对象
  • Map<String,List<?>>,用于跟踪三个不同的列表,分别存储发件人地址、发送日期和邮件主题

由于每个方法都需要访问pop3服务器,因此会创建一个store-对象并连接到pop服务器。当在每种方法中分别创建store-对象时;javax.mail.AuthenticationFailedException";(太多axactive会话(。我想,对于Message[]-数组中的每封邮件,都会创建一个会话对象,从而获得大约1.800个会话。有没有一种方法可以创建store-对象或会话类型的全局方法?将相同的实例传递给每个方法?特别是,要为数组中的每条消息使用一个store-对象吗?

谢谢你的提示。

PS.:如果有必要的话,我不知道,但我在eclipse IDE 上使用javax.mail

哇,谢谢你的即时回复!我现在要做的是:

设置服务器属性:

protected Properties getServerProperties(String protocol, String host, String port){
Properties properties = new Properties();
properties.put(String.format("mail.%s.host", protocol), host);
properties.put(String.format("mail.%s.port", protocol), port);

properties.setProperty(String.format("mail.%s.socketFactory.class", protocol), "javax.net.ssl.SSLSocketFactory");
properties.setProperty(String.format("mail.%s.socketFactory.fallback", protocol), "false");
properties.setProperty(String.format("mail.%s.socketFactory.port", protocol), String.valueOf(port));
properties.setProperty("mail.pop3.port", "995");
properties.setProperty("mail.pop3.host", "pop.gmx.net");
properties.setProperty("mail.pop3.user", "****");
properties.setProperty("mail.pop3.ssl.protocols", "TLSv1.2");   
return properties;
}

正在创建消息[]-数组:

public Message[] return_messages(String protocol, String host, String port, String userName, String password) throws MessagingException {
Properties properties = getServerProperties(protocol, host, port);
Session session = Session.getInstance(properties, auth);
Store store = session.getStore(protocol);
store.connect("pop.gmx.net", userName, password);

folderInbox = store.getFolder("INBOX");
folderInbox.open(Folder.READ_ONLY);

Message[] messages = folderInbox.getMessages();
return messages;
}

打开邮件文件夹

public Store open_mail_folder(String protocol, String host, String port, String userName, String password) throws MessagingException {
Properties properties = getServerProperties(protocol, host, port);
Session session = Session.getInstance(properties, auth);
Store store = session.getStore(protocol);
store.connect("pop.gmx.net", userName, password);
return store;
}

在列表中存储邮件

Map<String,List<?>> map = new HashMap<String, List<?>>();
//@SuppressWarnings("static-access")
public Map<String, List<?>> downloadEmails(String protocol, String host, String port, String userName, String password) throws IOException {
Properties properties = getServerProperties(protocol, host, port);
Session session = Session.getInstance(properties, auth);

try {
Store store = null;

if(store == null) {
store = session.getStore(protocol);
store.connect("pop.gmx.net", userName, password);
}

folderInbox = store.getFolder("INBOX");
folderInbox.open(Folder.READ_ONLY);

Message[] messages = folderInbox.getMessages();

List<String> fromList = new ArrayList<String>();
List<Date> dateList = new ArrayList<Date>();
List<String> subjectList = new ArrayList<String>();

for(int i=0;i<messages.length;i++) {
Address[] from = messages[i].getFrom();

String from_temp = (String)(((InternetAddress)from[0]).getAddress());
fromList.add(from_temp);

Date date = messages[i].getSentDate();
dateList.add(date);

String subject = messages[i].getSubject();
subjectList.add(subject);
}

map.put("fromList", fromList);
map.put("dateList", dateList);
map.put("subjectList", subjectList);

String result = "";
StringBuilder textBuilder = new StringBuilder();

}catch (NoSuchProviderException ex) {
//for debugging only
System.out.println("No provider for protocol " + protocol);
ex.printStackTrace();
}catch (MessagingException ex) {
System.out.println("Could not connect to the message store");
ex.printStackTrace();
}

return map;
}

此外,由于与pop服务器的连接似乎在一段时间后自动关闭,我定期运行一个线程来检查连接是否仍然打开,如果没有,则重新连接:

public class Session_relog extends Mail_Reader implements Runnable {
static int session_count;
public Session_relog() {
// TODO Auto-generated constructor stub
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try {
Thread.sleep(30,000);
if(super.isopen_mail_folder("pop3", "pop.gmx.net", "955", "****", "****")==false) {
try {
super.open_mail_folder("pop3", "pop.gmx.net", "995", "****", "****");
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
Thread.sleep(30,000); 
continue;
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

}

最新更新