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

2019-04-14Groovy

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))
}

2019-04-14Groovy