2016-12-15 15 views
0

1つのメールボックスからメッセージを取得する最善の方法(サーバーからのメッセージをすばやく読み込む)がわかります(INBOX、OUTBOXなど)。私はフォルダーfeth()メソッドとgetMessages()メソッドを見つけましたが、私は2つのメソッドの間に何が良いか理解していません。javamail API(fetch()またはgetMessages())を使用してメールを取得する最善の方法は何ですか?

私の現在のコード使用そして、getMessages()メソッドが、それはまだ遅いです:

public static void fetch(String Host, String storeType, String user, 
    String password) { 
    try { 
    // create properties field 
    Properties properties = new Properties(); 
    properties.put("mail.store.protocol", "imaps"); 
    properties.put("mail.imaps.host", Host); 
    properties.put("mail.imaps.port", "993"); 
    properties.put("mail.imaps.starttls.enable", "true"); 
    Session emailSession = Session.getDefaultInstance(properties); 
    // emailSession.setDebug(true); 

    // create the IMAP store object and connect with the imap server 
    Store store = emailSession.getStore("imaps"); 

    store.connect(Host, user, password); 

    // create the folder object and open it 
    Folder emailFolder = store.getFolder("INBOX"); 
    emailFolder.open(Folder.READ_ONLY); 

    BufferedReader reader = new BufferedReader(new InputStreamReader(
     System.in)); 

    // retrieve the messages from the folder in an array and print it 
    Message[] messages = emailFolder.getMessages(); 
    System.out.println("messages.length---" + messages.length); 

    for (int i = 0; i < messages.length; i++) { 
     Message message = messages[i]; 
     System.out.println("---------------------------------"); 
     writePart(message); 
     String line = reader.readLine(); 
     if ("YES".equals(line)) { 
      message.writeTo(System.out); 
     } else if ("QUIT".equals(line)) { 
      break; 
     } 
    } 

    // close the store and folder objects 
    emailFolder.close(false); 
    store.close(); 

    } catch (NoSuchProviderException e) { 
    e.printStackTrace(); 
    } catch (MessagingException e) { 
    e.printStackTrace(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } catch (Exception e) { 
    e.printStackTrace(); 
    } 

}

誰かが右より良い方法だものを私に説明できます!

答えて

3

fetchメソッドは、メッセージデータを一括してプリフェッチするために使用します。通常、メッセージのメタデータ、ヘッダーなどを取得してキャッシュするために使用されます。これは、メッセージを処理するかどうかを判断するために少量のメッセージメタデータを調べる必要がある場合に便利です。

fetchメソッドを使用して、メッセージの内容全体を取得してキャッシュすることもできます。すべてのメッセージのすべてのコンテンツにアクセスしていない限り、fetchメソッドを使用してメッセージ全体を取得する必要はありません。そのように使用すると、複数のメッセージを一度に取得する点を除いて、POP3プロトコルのように動作します。明らかに、メッセージ全体をキャッシュすると、大量のメモリを使用することができます。

getMessagesメソッドはメッセージデータをまったく取得しません。それが行うのは、メッセージデータにアクセスできる「ハンドル」を提供することだけです。要求に応じてフェッチされます。 getSubjectメソッドを呼び出すと、(エンベロープのメタデータの一部である)Subjectを取得します。 fetchメソッドを使用してこのエンベロープデータをプリフェッチおよびキャッシュして、後続の操作をより効率的にすることができます。メッセージの本文や添付ファイルを読む必要があると判断した場合、その時点でそのデータが取得されます。

fetchメソッドの名前がprefetchAndCacheである必要があります。 :-)

+0

良い説明のために@Bill Shannonありがとう、今私はfetchとgetMessagesメソッドの機能を理解しています。あなたの説明では、IMAPよりPOP3プロトコルを使用してfetchメソッドを使用する方が良いですか、間違っていますか? –

+0

POP3を使用するほうが賢明なのは、すべての電子メールをダウンロードしてサーバーから削除し、できるだけ早く接続を終了する場合です。他のほとんどすべてについては、可能であればIMAPを使用してください。 –

関連する問題