Gmail Imap против Pop3 при использовании JavaMail API
Я пытаюсь получить непрочитанную почту из INBOX из учетной записи Gmail. Я написал небольшую демонстрационную программу и обнаружил, что pop3 в Gmail неожиданно ведет себя в ряде ситуаций
- Когда вы пытаетесь получить список доступных папок, Pop3 возвращает только INBOX, а не все метки, пока IMAP делает это правильно. Я вставляю код здесь.
POP3
public static Result getPop3FolderList()
{
Properties props = System.getProperties();
props.put("mail.store.protocol", "pop3s");
props.put("mail.pop3.host", "pop.gmail.com");
props.put("mail.pop3.user", Application.email);
props.put("mail.pop3.socketFactory", 995);
props.put("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.pop3.port", 995);
Session session = Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(Application.email, Application.pwd);
}
});
try{
Store store=session.getStore("pop3");
store.connect(Application.email,Application.pwd);
javax.mail.Folder[] folders = store.getDefaultFolder().list("*");
String opHtml = "<ul>";
for (javax.mail.Folder folder : folders) {
if ((folder.getType() & javax.mail.Folder.HOLDS_MESSAGES) != 0) {
opHtml += "<li>" + folder.getFullName()+ "+" + folder.getMessageCount() + "</li>";
}
}
opHtml += "</ul>";
return ok(opHtml).as("text/html");
} catch(MessagingException e) {
return ok("Error in getting list.<br />" + e.getMessage()).as("text/html");
}
}
IMAP
public static Result getImapFolderList()
{
Properties props = System.getProperties();
props.setProperty("mail.store.protocol", "imaps");
try {
Session session = Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(Application.email, Application.pwd);
}
});
javax.mail.Store store = session.getStore("imaps");
store.connect("imap.gmail.com", Application.email, Application.pwd);
javax.mail.Folder[] folders = store.getDefaultFolder().list("*");
String opHtml = "<ul>";
for (javax.mail.Folder folder : folders) {
if ((folder.getType() & javax.mail.Folder.HOLDS_MESSAGES) != 0) {
opHtml += "<li>" + folder.getFullName()+ ":" + folder.getMessageCount() + "</li>";
}
}
opHtml += "</ul>";
return ok(opHtml).as("text/html");
} catch (MessagingException e) {
return ok("Error in getting list.<br />").as("text/html");
}
}
- Даже при получении почты, когда я устанавливаю фильтр непрочитанных писем, gmail возвращает количество прочитанных писем, которые даже не являются частью входящей почты, но являются длинными заархивированными. IMAP, с другой стороны, ведет себя ожидаемо.
Дополнительная информация: я включил pop3 только для новой почты, а не с самого начала
Я использую pop3 неправильно или он сломан в gmail?
1 ответ
Решение
По-видимому, POP3 не обрабатывает папки. У меня была такая же проблема при доступе к почтовым ящикам Exchange - IMAP получает папки, POP3 получает только Входящие.
Я нашел больше информации здесь: Как получить подпапки / ярлыки Gmail, используя POP3?