JavaMail 使用 IMAP 读取最近的未读邮件
Posted
技术标签:
【中文标题】JavaMail 使用 IMAP 读取最近的未读邮件【英文标题】:JavaMail reading recent unread mails using IMAP 【发布时间】:2015-04-25 16:20:13 【问题描述】:我需要从 Gmail 中检索未读邮件。我正在使用 Java 邮件 API。默认情况下,此 API 从最旧到最新检索邮件。但我需要先检索最近的邮件。可能吗?提前致谢。
【问题讨论】:
【参考方案1】:这里是例子。不要忘记在你的类路径中添加javax.mail。
import javax.mail.*;
import javax.mail.search.FlagTerm;
import java.util.*;
public class GmailFetch
public static void main( String[] args ) throws Exception
Session session = Session.getDefaultInstance(new Properties( ));
Store store = session.getStore("imaps");
store.connect("imap.googlemail.com", 993, "username@gmail.com", "password");
Folder inbox = store.getFolder( "INBOX" );
inbox.open( Folder.READ_ONLY );
// Fetch unseen messages from inbox folder
Message[] messages = inbox.search(
new FlagTerm(new Flags(Flags.Flag.SEEN), false));
// Sort messages from recent to oldest
Arrays.sort( messages, ( m1, m2 ) ->
try
return m2.getSentDate().compareTo( m1.getSentDate() );
catch ( MessagingException e )
throw new RuntimeException( e );
);
for ( Message message : messages )
System.out.println(
"sendDate: " + message.getSentDate()
+ " subject:" + message.getSubject() );
【讨论】:
【参考方案2】:确保使用 IMAP 协议,因为它支持标记。
对您的代码进行以下更改:
-
替换
inbox.open( Folder.READ_ONLY );
经过
inbox.open( Folder.READ_WRITE );
然后在阅读完消息后,像这样设置标志:
message.setFlag(Flags.Flag.SEEN, true);
完整示例:
import javax.mail.*;
import javax.mail.search.FlagTerm;
import java.util.*;
public class GmailFetch
public static void main( String[] args ) throws Exception
Session session = Session.getDefaultInstance(new Properties( ));
Store store = session.getStore("imaps");
store.connect("imap.googlemail.com", 993, "username@gmail.com", "password");
Folder inbox = store.getFolder( "INBOX" );
inbox.open( Folder.READ_WRITE );
// Fetch unseen messages from inbox folder
Message[] messages = inbox.search(
new FlagTerm(new Flags(Flags.Flag.SEEN), false));
// Sort messages from recent to oldest
Arrays.sort( messages, ( m1, m2 ) ->
try
return m2.getSentDate().compareTo( m1.getSentDate() );
catch ( MessagingException e )
throw new RuntimeException( e );
);
for ( Message message : messages )
System.out.println(
"sendDate: " + message.getSentDate()
+ " subject:" + message.getSubject() );
message.setFlag(Flags.Flag.SEEN, true);
【讨论】:
为什么需要这个?有一个接受的答案是三年前的...... 我同意@NicoHaase 的观点,我认为这张海报试图说您应该将SEEN
标志设置为 true,以便将其标记为已读,以便下次不再请求该消息该程序运行的时间。
如何只获取未读邮件,现在搜索方法似乎不接受Flag了。【参考方案3】:
JavaMail 为您提供一组 Message 对象。消息按接收顺序排列。如果您想首先查看最近收到的消息,请以相反的顺序遍历数组。如果您想首先查看最近发送的消息,则需要对数组进行排序,如另一个答案中所述。
【讨论】:
我想我知道他的问题是什么。至少这听起来像我的一个:如果您想在用户操作时立即更新屏幕,那么大多数 IMAP 服务器的 FETCH 响应顺序都不好。 “最高UID优先”会比“最低UID优先”更好。但这不是 Javamail 能解决的。【参考方案4】:我认为这可能有助于访问已读/未读/最近的邮件 根据需要更改变量。
// search for all "unseen" messages
Flags seen = new Flags(Flags.Flag.SEEN);// try changing this SEEN to RECENT
// set it true or false for seen & unseen mail
FlagTerm unseenFlagTerm = new FlagTerm(seen, false)
Message messages[] = inbox.search(unseenFlagTerm);
【讨论】:
以上是关于JavaMail 使用 IMAP 读取最近的未读邮件的主要内容,如果未能解决你的问题,请参考以下文章