tabimoba.net

とあるエンジニアの雑記帳

メールに貼り付けた添付ファイルや本文をGoogle Docsへ登録するプログラム(サンプルコード)

メールに貼り付けた添付ファイルや本文をGoogle Docsへ登録するプログラムを作成しました - 旅モバ。のサンプルコードを公開します。PHPで書きました。不必要な変数や冗長な部分とか変な部分がありますが、めんどうなのでそのまま掲載します。

Java(JRE or JDK)と、google-docs-upload - A tool for batch uploading documents to a Google Docs account with recursive directory traversing. - Google Project HostingPear_Mail,Pear_Net_POP3,Pear_MimeDecodeが必要です。MTA(Sendmailやqmail)は必要有りませんが、POP3サーバにアクセス可能な環境と、受信専用のメールアカウント1つが必要になります。

サンプルコードは以下より。

pop3_host           = "ssl://pop.gmail.com";
$work->pop3_port           = "995";
$work->pop3_username       = "gmailのユーザー名";
$work->pop3_password       = "gmailのパスワード";

// GoogleDocs接続情報
$work->docs_username       = "gmailのユーザー名";
$work->docs_passwd         = "gmailのパスワード";

// テンポラリデータ出力先
$work->tmpdir           = "メールで受信した添付ファイルの一時保管先ディレクトリ";
$work->tmpdir2          = $work->tmpdir . "/";
$work->jardir           = "jarファイルの保管先ディレクトリ";

// 処理実行
$work->getDocuments();

//



class docsimport {
        var $pop3_host;         // POP3サーバアドレス
        var $pop3_port;         // POP3サーバポート
        var $pop3_username; // POP3サーバ接続時のユーザー名
        var $pop3_password; // POP3サーバ接続時のパスワード

        var $mail_from;         // 送信元アドレス(from)
        var $mail_to;           // 送信先アドレス(to)
        var $mail_subject;      // 送信メールタイトル
        var $tmpdir2;
        var $tmpdir;
        var $jardir;

        var $docs_username;
        var $docs_passwd;

        function getDocuments() {
        /*
                POP3サーバからのメール取得→
                添付ファイル(TXT)の文字コードを変換→
                SMTPサーバへ接続してメール送信をするfunction
                -----------------------------------------------------------------
                $dat                 POP3サーバから取得したデータ(配列)
                $datcnt              $datの配列数(メール件数 - 1)
                -----------------------------------------------------------------
        */

                // POP3サーバへ接続して、データを取得
                $dat    = $this->pop3Connect();

                // メール件数を取得
                $datcnt = count($dat) - 1;

                // 取得データ(添付されたテキストファイル)をmimeデコード&ISO-2022-JPへ変換&送信
                if ($dat[0] != false) {
                        for ($i=0;$i<=$datcnt;$i++) {
                                $result = $this->decodeDat2($dat[$i]);
                                // $this->smtpConnect($result["body"]);
                        }
                }

                // GoogleDocsへインポート
                system('chmod -R 777 ' . $this->tmpdir);
                $cmd = '/usr/bin/java -jar ' . $this->jardir .  'google-docs-upload.jar ' . $this->tmpdir . ' --username ' . $this->docs_username . ' --password ' .$this->docs_passwd;
                system($cmd);
                system('chmod -R 777 ' . $this->tmpdir);
                system('rm -rf ' . $this->tmpdir .'/*');

        }

        function pop3Connect() {
        /*
                POP3サーバへ接続して、新着メッセージを受信するfunction
                ※PEAR Net_POP3モジュールを使用
                -----------------------------------------------------------------
                $params["host"]      pop3サーバ接続先アドレス
                $params["port"]      pop3サーバ接続先ポート
                $params["username"]  pop3サーバ接続ユーザー名
                $params["password"]  pop3サーバ接続パスワード

                $pop                 PEAR Net_POP3モジュール
                $nummsg              新着メッセージ数
                                     新着メッセージが無い場合は0
                                     新着メッセージがある場合は1以上
                $nowrow              配列の現在行(0〜)
                $dat                 POP3サーバから受信した生データを格納する配列
                -----------------------------------------------------------------
        */

                // POP3サーバ接続情報をセット
                $params["host"]         = $this->pop3_host;
                $params["port"]         = $this->pop3_port;
                $params["username"]     = $this->pop3_username;
                $params["password"]     = $this->pop3_password;

                // POP3サーバへ接続
                $pop = new Net_POP3();
                $pop->connect($params["host"],$params["port"]);
                $pop->login($params["username"],$params["password"],USER);

                // 新着メッセージの件数を取得
                $nummsg = $pop->numMsg();

                // POP3サーバよりデータを取得
                if ($nummsg == 0 || $nummsg == false) {
                        $dat[0] = false;
                } else {
                        for($i=1;$i<=$nummsg;$i++) {
                                $nowrow = $i - 1;
                                $dat[$nowrow] = $pop->getMsg($i);
                                print $nowrow;
                        }
                }

                // POP3サーバとの接続を切断
                $pop->disconnect();

                // 取得結果を返す
                return $dat;
        }

        function decodeDat2($dat){
        /*
                メール生データをデコードする Ver2
                ※mimeDecodeが必要
        */
                // メールデータ取得
                $params['include_bodies'] = true;
                $params['decode_bodies']  = true;
                $params['decode_headers'] = true;
                $params['input'] = $dat;
                $params['crlf'] = "\r\n";
                $structure = Mail_mimeDecode::decode($params);

                // 件名を取得
                $mail_subject = $structure->headers['subject'];

                switch(strtolower($structure->ctype_primary)){
                        case "text":            // シングルパート(テキストのみ)
                                // メール本文取得
                                $mail_body = $structure->body;

                                // 保存
                                $filename  = mb_convert_encoding($mail_subject,"UTF-8","ISO-2022-JP");
                                $mail_body = mb_convert_encoding($mail_body,"UTF-8","ISO-2022-JP");
                                if ($filename <> '') {
                                        $filename  = date("Y-m-d_H-i-s") . '_' . $filename . '.txt';
                                        $fp = fopen($this->tmpdir2 .$filename,"w");
                                        $length = strlen($mail_body);
                                        fwrite ($fp,$mail_body,$length);
                                        fclose ($fp);
                                        print $filename;
                                }
                                break;

                        case "multipart":
                                $kk=0 ;
                                foreach($structure->parts as $part){
                                        $mail_body = $part->body;

                                        //添付ファイル名取得
                                        $filename = $structure->parts[$kk]->d_parameters['filename'];
                                        if ($filename == '') {
                                                $filename = $mail_subject . '.txt';
                                                $mail_body = mb_convert_encoding($mail_body,"UTF-8","ISO-2022-JP");
                                        }
                                        $filename = mb_convert_encoding($filename, "UTF-8", "ISO-2022-JP");
                                        $kk++ ;

                                        if ($filename <> '') {
                                                $filename = date("Y-m-d_H-i-s") . '_' . $filename;

                                                // 保存
                                                $fp = fopen($this->tmpdir2 .$filename,"w" );
                                                $length = strlen( $mail_body );
                                                fwrite( $fp, $mail_body, $length );
                                                fclose( $fp );
                                                print $filename;
                                        }
                                }
                                break;

                        default:
                                $mail_body = "";
                }
        }

}


?>