タグ別アーカイブ: Gmail

Gmailの検索機能あれこれ

| コメントをどうぞ

Gmailの検索、使ってますか?

Gmailは実に様々な検索機能をもっています。

標準の検索ボックスでは以下の条件を利用してメールを検索することができます。

  • From
  • To
  • 件名
  • キーワード(含む、含まない)
  • 添付ファイルあり
  • チャットは除外する
  • サイズ
  • 期間

しかし、実際にはもっと多くの検索条件を利用することができます。

続きを読む

Gmail Java IMAP Extensionを使ってGmailを既読にする

| コメントをどうぞ

以前、こちらのエントリでGmailをIMAPを使って読み込む手法を紹介しました。

Gmailのメールの本文を直接開くURLを取得する方法

今回は同じGmailのIMAP用ライブラリを使用して、Gmailの特定のメールを既読にする手法を紹介します。

では早速ソースコードです。

package work;

import java.util.Properties;

import com.google.code.com.sun.mail.imap.IMAPSSLStore;
import com.google.code.javax.mail.Folder;
import com.google.code.javax.mail.Message;
import com.google.code.javax.mail.MessagingException;
import com.google.code.javax.mail.Session;
import com.google.code.javax.mail.Flags.Flag;
import com.google.code.javax.mail.search.GmailMessageIDTerm;

public class Sample {

    public static void main(String[] args) throws MessagingException{
        final String email = "email@gmail.com"; //メールアドレス
        final String password = "password"; //パスワード
        final String host = "imap.gmail.com"; //GmailのIMAPホスト名
        final String messageId = "xxxxxxxxxxxxxxx";  //既読にするメールのID(16進数表記)

        Properties props = new Properties();
        props.setProperty("mail.store.protocol", "imaps");
        Session session = Session.getDefaultInstance(props, null);
        IMAPSSLStore store = new IMAPSSLStore(session, null);
        Folder inbox = null;

        try {
            store.connect(host, email, password);
            inbox = store.getFolder("Inbox");
            inbox.open(Folder.READ_WRITE);

            GmailMessageIDTerm term
                = new GmailMessageIDTerm(Long.toString(Long.parseLong(messageId, 16)));
            Message[] messages = inbox.search(term); //対象のメッセージを検索
            if(messages != null){
                for(Message message : messages){
                    if(message != null){
                        message.setFlag(Flag.SEEN, true); //メッセージを既読にする
                    }
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }finally{
            if (inbox.isOpen()) {
                inbox.close(true);
            }
            if(store.isConnected()){
                store.close();
            }
        }
    }
}

なお、上記のコードはメッセージIDを使ったGmailの検索の例でもあります。
GmailのメッセージIDは各メールを開いた際のURLの末尾にある16進数になります。

  • 例: https://mail.google.com/mail/u/0/?shva=1#inbox/18b94a75cff13147

で、実際に検索を行う際はこの16進数表記の文字列をロング値に変換してやる必要があるので注意が必要です。

Gmailのメールの本文を直接開くURLを取得する方法

| 2件の返信

Googleは様々なサービスのAPIを公開しており、Gmailもその中の一つです。
今回は、GmailをIMAP APIを使ってメールの情報を取得する方法を紹介します。

IMAPでGmailを取得する

GmailをIMAPで取得するためのAPIとして、OracleからJavaMailが提供されています。
http://www.oracle.com/technetwork/java/javamail/index.html

上記のページの右側のDownloadsから、javamail1_4_4.zip (2011年12月20日時点)をダウンロードします。
ダウンロードした zip を解凍すると、mail.jar を取得できます。

このライブラリを使ったメールの取得については下記の記事を参照してください。
http://harikrishnan83.wordpress.com/2009/01/24/access-gmail-with-imap-using-java-mail-api/

 

メールの本文を開くURLを取得する

JavaMailを使用した場合、メールのタイトルや本文は取得できますが、メールを直接開くURLは取得できません。

そこで、JavaMailの拡張版を使います。
https://code.google.com/p/java-gmail-imap/
JavaMail 1.4.4を拡張したもので、メッセージ(メール)ごとに以下の情報を取得できます。

  • メッセージID
  • スレッドID
  • ラベルリスト

このライブラリのパッケージは、JavaMail 1.4.4と競合しないように以下のように定義されています。

  • com.google.code.com.sun.mail
  • com.google.code.javax.mail

JavaMailから変更する場合は拡張版のクラスをimportするように修正します。

 

メールのURL取得のサンプル 

以下のサンプルでは、最新のメール10件のメールを取得してタイトルとURLとラベルを出力しています。
Gmailは以下のURLでメールを直接開くことができます。
https://mail.google.com/mail/u/0/?shva=1#inbox/messageId

import java.net.URLEncoder;
import java.util.Properties;

import com.google.code.com.sun.mail.imap.IMAPFolder;
import com.google.code.com.sun.mail.imap.IMAPMessage;
import com.google.code.com.sun.mail.imap.IMAPSSLStore;
import com.google.code.javax.mail.FetchProfile;
import com.google.code.javax.mail.Folder;
import com.google.code.javax.mail.Message;
import com.google.code.javax.mail.Session;

public class GetGmailURL {

 private static String email = "email@gmail.com";
 private static String password = "password";
 private static int msg_num = 10;
 private static String host = "imap.gmail.com";

 public static void main(String[] args) throws MessagingException {
  Properties props = new Properties();
  props.setProperty("mail.store.protocol", "imaps");
  Session session = Session.getDefaultInstance(props, null);
  IMAPSSLStore store = new IMAPSSLStore(session, null);
  Folder inbox = null;
  try {
   store.connect(host, email, password);
   inbox = store.getFolder("Inbox");
   inbox.open(Folder.READ_ONLY);
   int count = inbox.getMessageCount();
   Message messages[] = inbox.getMessages(count-msg_num, count);
   FetchProfile fp = new FetchProfile();
   fp.add(IMAPFolder.FetchProfileItem.X_GM_MSGID);
   fp.add(IMAPFolder.FetchProfileItem.X_GM_THRID);
   fp.add(IMAPFolder.FetchProfileItem.X_GM_LABELS);
   inbox.fetch(messages, fp);

   for(int i=msg_num; i>0; i--){
    System.out.println("Title: " + messages[i].getSubject());
    IMAPMessage im = (IMAPMessage) messages[i];
    String msgId = Long.toHexString(im.getGoogleMessageId());
    String url = "https://mail.google.com/mail/u/0/?shva=1#inbox/" + msgId;
    System.out.println("URL: "url);
    String[] labels = im.getGoogleMessageLabels();
    if(labels!=null){
     for(String label: labels){
      System.out.println("Label: " + label);
     }
    }
    System.out.println();
   }
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   if(inbox.isOpen()) {
    inbox.close(true);
   }
   if(store.isConnected()){
    store.close();
   }
  }
 }
}

実行結果

Title: Box Buzz: Good-bye Box.net, Hello Box
URL: https://mail.google.com/mail/u/0/?shva=1#inbox/13459016de7c3784
Label: Cloud Service
:
:

ブラウザで上記のURLを開くとGmailのメールの本文が開きました。