2014-01-16 34 views
6

Gmailからメールを読むためのコードを書いています。だから初めて私が立ち上げたときに、それは新しい電子メールを読みます。それはいいです。しかし、私はそれを2回目に発射するときに、以前に得たものと同じ電子メールを受け取ることはしません。Javaが未読メールを取得する

たとえば、3つの未読メールがある場合、初めて起動すると3になります。しかし、もう一度起動すると、何も取得されません(既に3があるため)。新しいメールがあり、それをもう一度起動すると、最後のメールだけを取得し、3つのメールを最初に取得する必要はありません。

私は十分にはっきりしています。私はhttp://alvinalexander.com/java/javamail-search-unseen-unread-messages-mailbox-pop3

package javamailtests; 

import java.io.InputStream; 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import java.util.Properties; 
import javax.mail.*; 
import javax.mail.internet.*; 
import javax.mail.search.*; 

public class JavaMailSearchInbox { 

    public static void main(String args[]) throws Exception { 

    // mail server info 
    String host = "pop.gmail.com"; 
    String user = "USER"; 
    String password = "PASS"; 

    // connect to my pop3 inbox in read-only mode 
    Properties properties = System.getProperties(); 
    Session session = Session.getDefaultInstance(properties); 
    Store store = session.getStore("pop3"); 
    store.connect(host, user, password); 
    Folder inbox = store.getFolder("inbox"); 
    inbox.open(Folder.READ_ONLY); 

    // search for all "unseen" messages 
    Flags seen = new Flags(Flags.Flag.SEEN); 
    FlagTerm unseenFlagTerm = new FlagTerm(seen, false); 
    Message messages[] = inbox.search(unseenFlagTerm); 

    if (messages.length == 0) System.out.println("No messages found."); 

    for (int i = 0; i < messages.length; i++) { 
     // stop after listing ten messages 
     if (i > 10) { 
     System.exit(0); 
     inbox.close(true); 
     store.close(); 
     } 

     System.out.println("Message " + (i + 1)); 
     System.out.println("From : " + messages[i].getFrom()[0]); 
     System.out.println("Subject : " + messages[i].getSubject()); 
     System.out.println("Sent Date : " + messages[i].getSentDate()); 
     System.out.println(); 
    } 

    inbox.close(true); 
    store.close(); 
    } 
} 
+1

@CarlPalssonいいえこれはクライアントのオプションです。これはPOP3の本質的な機能ではありません。メッセージをサーバーに保存するかサーバーから削除するかを選択できます。実際には、クライアントがそのオプションを選択するとメッセージを削除する余分な手間がかかります。 – EJP

+0

@EJPああ、明確にしてくれてありがとう! – 8bitcat

+0

そのホストからのGmailメールを取得するのは難しいです – Behe

答えて

0

からコードを使用

私は、「未読としてマーク」に読み込まれた古いメッセージを返す示唆するかもしれませんか?

+0

はい、私がそれを行うと、次にそれらを読むと同じメッセージが正しく表示されますか? – user1700594

+0

「読んでマークする」という意味ですか?もしそうなら、私のクライアントが既に何かを読んでいるかどうかを私はどのように知ることができますか?私は、例えば、サンダーバードと言うと、サーバー上で彼が新しい電子メールをどのように知っていて、何が古いのですか?彼はIDや何かをローカルに保管してから、サーバーをどこから始めるべきかチェックしますか? – user1700594

0
import java.util.*; 
import javax.mail.*; 

    public class ReadingEmail { 
    public static void main(String[] args) { 
    Properties props = new Properties(); 
    props.setProperty("mail.store.protocol", "imaps"); 
    try { 
     Session session = Session.getInstance(props, null); 
     Store store = session.getStore(); 
    store.connect("imap.gmail.com", "[email protected]", "Password"); 

     Folder inbox = store.getFolder("INBOX"); 
     inbox.open(Folder.READ_ONLY); 
     Message msg = inbox.getMessage(inbox.getMessageCount()); 
     Address[] in = msg.getFrom(); 
     for (Address address : in) { 
      System.out.println("FROM:" + address.toString()); 
     } 
     Multipart mp = (Multipart) msg.getContent(); 
     BodyPart bp = mp.getBodyPart(0); 
     System.out.println("SENT DATE:" + msg.getSentDate()); 
     System.out.println("SUBJECT:" + msg.getSubject()); 
     System.out.println("CONTENT:" + bp.getContent()); 
      } catch (Exception mex) 
     mex.printStackTrace(); 
        } 
      } 
     } 
1

私はこの醜い例を作りました。そして、それは働いて、見たものを含むすべてのメッセージを取得します。古いメールアカウントを持っている場合は、適切にあなたが必要とするだけのメールを取得する必要があります。もちろん、

Properties props = System.getProperties(); 
props.setProperty("mail.store.protocol", "imaps"); 
Session session = Session.getDefaultInstance(props, null); 

try { 
    Store store = App.session.getStore("imaps"); 
    store.connect("imap-mail.outlook.com", "email", "password"); 

    Folder folder = App.store.getFolder("Inbox"); 
    folder.open(Folder.READ_ONLY); 
    Message[] msgs = folder.getMessages(); 

    for (Message msg : msgs) { 
     System.out.println(msg.getSubject()); 
    } 
}catch(MessagingException e) { 
    System.out.println(e); 
} 

が、そうでない場合は、このコードは非常に重いプロセスを開始します。

これは役に立ちそうです。

関連する問題