Translate

2012年1月12日木曜日

Gmail POP の怪




※まだ解決してません


うーん、
Gmailをjavamail1-4.4を使ってメッセージ取得
をためしたけど、250件づつしかできない..


あるWebアプリを運営していて結果を
所定のGmailアカウントへ送信していて
1万件くらいたまったので、
JavaMail APIを使ってCSVファイル化するプログラムを組んで
INBOX内のメールの本文を読み取る処理を書き実行した..


JavaMailサンプル

 // POPサーバへ接続するための情報をPropertiesへセットする
 Properties mailProps = new Properties();

 // Gmailへ接続する場合のサーバFQDN
 mailProps.setProperty("mail.pop3.host","pop.gmail.com");
 // GmailはPOP3sのようだ
 mailProps.setProperty("mail.pop3.port", "995");
 // 接続時のタイムアウト
 mailProps.setProperty("mail.pop3.connectiontimeout", "60000");
 // POP3通信中タイムアウト
 mailProps.setProperty("mail.pop3.timeout", "60000");
 // POP3sなのでSSLSocketFactoryを指定
 mailProps.setProperty("mail.pop3.socketFactory.class",
  "javax.net.ssl.SSLSocketFactory");
 mailProps.setProperty("mail.pop3.socketFactory.fallback", "false");
 mailProps.setProperty("mail.pop3.socketFactory.port", "995");

 // javax.mailのセッションインスタンス取得
 Session mailSession = Session.getInstance(mailProps,
  new Authenticator(){
   protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(
     "hogehoge@gmail.com", "hogehoge_password");
   }
  }
 );

 // デバッグモードをTRUEにするとSystem.errにたくさんログが出る
 // RETRIEVE後既読にならなかった
 mailSession.setDebug(false);

 // POP3接続し、ストアオブジェクト取得
 Store store = mailSession.getStore("pop3");

 // 接続(認証)
 store.connect();

 // finally句で使うので宣言だけ
 Folder folder = null;

 try{
  // INBOX=受信トレイで決め打ちらしい
  folder = store.getFolder("INBOX");

  // このサンプルはRETRIEVEだけなので読み取り専用
  folder.open(Folder.READ_ONLY);

  // 取得可能件数(たくさん未読メールがある場合、
  // 私の環境では毎回250件)
  int total = folder.getMessageCount();

  for(int pos=0;pos<total;pos++){
   // getMessageのポジションは1から始まる
   Message message = folder.getMessage(pos+1);

   // messageからサブジェクトやコンテンツを取得する処理


  }
 }finally{
  folder.close(false);
 }



..んだけど、
Folder#getMessageCount()しても毎回250が帰ってきて
なんでか250件づつしかとれない。

取得した250件も
古いメッセージから順番になってる。
#javamailデバッグモードだとおなじメール範囲

うーん、一度に250件とかの制約がサーバにあるのかな..

..Googleってみると同じようなことを考えている人はいる様子

英語のサイトでも
明確な答えを出してる所が見つからない..

たとえばこんなのとか..

Is there a 250 messages limit when do pop?
http://www.google.com/support/forum/p/gmail/thread?tid=4e95906f3f8cad33&hl=en



これは勝手な憶測だけど、
Gmail側がPOPサーバの負荷を考慮して
制限をつけていて
制限値については公表していない
というところかもしれない。


結局バッチプログラム化して40回ぶんまわして対応した..


AppEngineで作ったアプリなので
BigTableに入れるよりかわPOPで吸い出しのほうが
楽かなと思ったけど..

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...