2008/11/12

GroovyでGmailを一時ファイルの保存場所として使ってみる

Gmailは僕の生活のなかでとても重要な位置を占めています。もはやGmailなしでは仕事や生活が成り立たないぐらいです。

仕事やネットカフェ、友人の家などでPCにて作業した際にも、一時ファイルのアップロード先として自分に送信し、家で添付ファイルをダウンロード、ということをしていたのですが、手動でダウンロードした後に展開した後に展開し、指定フォルダに展開し、そのメールを削除という単純作業が面倒くさいと感じました。

そこで、IMAPにてファイルを受信、メールの削除をスクリプト化してみた。

以下のメソッドが、メールの削除とファイルの受信を行ってくれる。対象のメールを絞り込むためにはfindLogicにクロージャを引き渡します。引数は1つで、Messageクラスのインスタンスが引き渡されます。結果としてbooleanを返せばOK。

import javax.mail.Folder
import javax.mail.Message
import javax.mail.Session
import javax.mail.*
import javax.mail.internet.*



def getGmailAttachedFiles( user, password, findLogic )
{
    
    def files =  []
    
    def store = Session.getInstance(System.properties, null).getStore("imaps")
    store.connect("imap.gmail.com", 993, user, password)
    def folder = store.getFolder("INBOX")
    if (folder.exists())
    {
        
        folder.open(Folder.READ_ONLY)
        def message = folder.messages.find(findLogic)
        if( !message ) System.exit(0);
        
        switch(message.content)
        {
            case String:
                break;
            default:
                Multipart multiPart = message.content
                (0..<multiPart.count).each
                        { i ->
                            def part = multiPart.getBodyPart(i)
                            if( part.fileName )
                            {
                                def tmpdir = System.properties["java.io.tmpdir"]
                                def file = new File("${tmpdir}/${part.fileName}")
                                
                                file.withOutputStream
                                        { it << part.content }
                                
                                files << file
                            }
                        }
                break;
        }
        
        message.setFlag(Flags.Flag.DELETED, true)
        folder.close(false)
    }
    store.close()
    
    files
}

以下のように使用。

def files = getGmailAttachedFiles("username@gmail.com", "password")
        { it.subject == "in net coffee"  }
files.each{ renemeTo(new File("/home/genzou" + it.name)) }

0 件のコメント:

コメントを投稿