モバメのメール本文と画像をGoogleDriveに自動保存するスクリプトを作ってみた。

はじめに

有料記事になっていますが、基本の設定は無料範囲でも行えるようになっています。また、Gmailのフィルタの作成の設定方法などもありますので、少しでも興味がありましたらごらんいただければと思います。

なお、有料メールは契約した人へのサービスです。
受信したGoogle Driveのフォルダを一般に公開したり、他人と共有するなどを行う行為は絶対にお止めください。

事前準備

モバイルメールの送信先をgmailに変更してください。
すでにgmailに設定している方はそのままで大丈夫です。
※変更のやり方はここでは解説しません。
なお、これから設定するスクリプトは、AKB48とHKT48のメールで確認済みです。

※ソースの修正やURLの確認などがあるのでPCで作業するのがおすすめです。

仕組み

今回の方法では、gmailで受信したメールにラベルを付与し、Google Apps Scriptでラベルがつけられたメールを対象に、google driveにメールを保存していきます。

注意点として、今回のスクリプトでは一日分のメールを処理します。
また、メールの処理数が最大500件までとなっているため、500件以上受信した場合取りこぼしが発生する場合があります。

それでは、設定をして行きましょう。

Google Driveの設定

まずは、Google driveにモバイルメール保存用のフォルダを作成します。
フォルダ名は何でもかまいません。
自分は、「_モバメ」にしました。
フォルダ名でソートしたときに一番上に来て探しやすいからです。

スクリーンショット 2021-04-18 10.10.10@0.5x

後でこのフォルダIDを使いますので、この段階でメモを取っておきます。

フォルダIDはGoogleDriveで該当のフォルダを開いたときのURLの一番最後に表示されます。以下の様なURLの場合、XXXXXXXXXの部分がフォルダIDです。
なおフォルダIDはフォルダ名を変更しても変わらないので、フォルダ名は後で変更してもかまいません。

https://drive.google.com/drive/folders/XXXXXXXXX

Gmailの設定

Google Driveの設定とフォルダIDの確認ができたら、今度はGmailを設定していきましょう。

まずは、Gmailの画面を開いて、スクリプトで処理したいメール(保存したモバイルメール)を検索します。
ここでは、AKB48とHKT48のモバイルメールを検索してみましょう。

メールを検索部分に以下のテキストを入力してください。

{from:@sp.hkt48.jp from:@mm.akb48.co.jp}

画像を保存したいメールの一覧が表示されるのを確認しましょう。

スクリーンショット 2021-04-18 10.57.08

メールが確認できたら、検索ボックス右側の「▼」をクリックしてフィルタを作成し、ラベル付けのを設定をします。

スクリーンショット 2021-04-18 12.53.23@0.5x

フィルタを作成ボタンをクリックし「ラベルを付ける」「一致するメッセージにもフィルタを適用する」にチェックを付けます。

スクリーンショット 2021-04-18 12.56.32@0.5x

その後、「ラベルを選択」をクリックし「新しいラベル」を選んでラベルを追加します。自分は「モバメ」にしました。
このラベル名は後で使いますので、フォルダIDと一緒にメモしておきましょう。

スクリーンショット 2021-04-18 12.56.44

スクリーンショット 2021-04-18 12.57.07

最後に「フィルタを作成」ボタンでフィルタを作成しましょう。

スクリーンショット 2021-04-18 13.08.08

ラベルを選択して、メールにちゃんとラベルがついている事を確認しましょう。

スクリーンショット 2021-04-18 13.13.05@0.5x

ちゃんとメールが表示されていたら設定完了です。

Google App Scriptの設定

Gmailのラベル設定が完了したら、Google Apps Script(GAS)を設定します。

まずは、Google Apps Scriptのページにアクセスしましょう。
http://script.google.com/

スクリーンショット 2021-04-18 13.34.32@0.5x

開いたら、左上の「新しいプロジェクト」をクリックしてプロジェクトを作成します。「無題のプロジェクト」をクリックしてプロジェクトの名前をわかりやすいように変更しておきます。ここでは「モバメ保存」にしました。

画像11

名前を変更したら、画像のコード部分(赤枠部分)にスクリプトをコピーします。

スクリーンショット 2021-04-18 14.13.12@0.5x

まず、赤枠内のスクリプトを全て削除します。その後、この下のコード(黒枠内のコード)を先ほどの赤枠内にコピーします。

function save_mobile_mail() {
 // 【基本設定】
 // https://drive.google.com/drive/folders/{この部分}
 let folder_id = 'XXXXXXXXX';
 // Gmailで設定したラベル名を入力してください
 let label = 'モバメ';

 // ここから先、プログラムがわかる人以外は変更しないでください。
 let base = DriveApp.getFolderById(folder_id);
 // モバメ未処理を取得
 let search_date = new Date()
 let thread = GmailApp.search("label:" + label + " after:" + Utilities.formatDate(search_date, "JST", "yyyy/MM/dd"), 0, 500);
 let message = GmailApp.getMessagesForThreads(thread);

 let myRegexp = /src="([\s\S]*?)">/g;
 let response, file_blob, new_file, _match,
   mess, _from, _subject, _body, _attachs, email_body, urls, url

 for (let i = 0; i < message.length; i++) {
   for (let j = 0; j < message[i].length; j++) {
     mess = message[i][j]
     _body = mess.getBody()
     _from = mess.getFrom()
     _subject = mess.getSubject()
     email_body = mess.getPlainBody()
     _match = _from.match(/[<](.*)@/)
     _attachs = mess.getAttachments();
     if(_match == null) continue;
     var user_name = _match[1];
     if(user_name === 'info' || user_name === 'akb48-mail') {
       // インフォメーション系のメールは除外
       continue;
     }
     let datestr = Utilities.formatDate(mess.getDate(),"JST", "yyyy");
     user_name = '[' + datestr + ']' + user_name
     let folder = base.getFoldersByName(user_name)
     if( folder.hasNext() ) {
       // フォルダが見つかった場合は最初のフォルダを採用
       folder = folder.next();
     } else {
       // フォルダが見つからなかった場合はフォルダを作成
       folder = base.createFolder(user_name);
     }
     datestr = Utilities.formatDate(mess.getDate(),"JST", "yyyyMMdd_HHmmss");

     try {
       // メール本文テキストがあれば処理済み
       let files = folder.getFilesByName(datestr + '.txt')
       if( files.hasNext() ) {
         // ファイルが存在した場合処理しない
         continue;
       }
       // メール本文のファイルをテキストで作成
       let body = _subject + "\n-----------------------\n" + email_body
       new_file = folder.createFile(datestr + '.txt', body, MimeType.PLAIN_TEXT);
     } catch (e) {
       Logger.log(e);
       continue;
     }

     if(_attachs) {
       let cnt = 1;
       for(let k = 0; k < _attachs.length; k++) {
         try {
           file_blob = _attachs[k];
           let tmp = file_blob.getContentType();
           if(tmp === 'image/jpeg') {
             ext_name = 'jpg'
           } else if(tmp === 'image/gif') {
             ext_name = 'gif'
           } else if(tmp === 'image/png') {
             ext_name = 'png'
           } else {
             ext_name = ''
           }
           save_image(folder, datestr, ext_name, file_blob, cnt++, email_body)
         } catch (e) {
           Logger.log(e);
         }
       }
     }

     // URL一覧抽出
     urls = _body.match(myRegexp)
     if (urls) {
       let cnt = 1;
       for (let k = 0; k < urls.length; k++) {
         url = urls[k].slice(5, -2)
         _match = url.match(/ext=(.*)/)
         if(_match == null) continue;
         var ext_name = _match[1];

         try {
           response = UrlFetchApp.fetch(url);
           file_blob = response.getBlob();
           if(file_blob.getBytes().length < 4800 && ext_name === '.gif') {
             // ファイルサイズが小さかったら絵文字なので除外
             continue
           }
           save_image(folder, datestr, ext_name, file_blob, cnt++, email_body)
         } catch (e) {
           Logger.log(e);
         }
       }
     }
   }
 }
}

function save_image(folder, datestr, ext_name, file_blob, cnt, email_body) {
 let base_name = String(email_body.trim()).replace(/\r?\n/g, '')
 let fileName = datestr + '_' + base_name.slice(0, 15) + '_' + String(cnt) + '.' + ext_name;
 file_blob.setName(fileName);
 let new_file = folder.createFile(file_blob);
 // ファイルの情報にメールの本文を追加。
 new_file.setDescription(email_body);
}
// END

このような感じになります。

スクリーンショット 2021-04-18 14.18.40

ここで、Google DriveのフォルダIDとGmailで設定したラベル名を設定します。
それぞれ、さきほどコピーしたコードの【基本設定】の部分を変更します。

スクリーンショット 2021-04-18 14.33.00

'XXXXXXXXX' の部分をメモしたフォルダIDに変更します。
'モバメ'の部分をGmailで設定したラベル名に変更します。
※この記事通り「モバメ」に設定した場合は変更しなくてかまいません。

最後に画面上部の「保存」ボタンをクリックしてプロジェクトを保存します。

スクリーンショット 2021-04-18 14.18.40@0.5x2

保存が完了すると、「保存」ボタンの右隣の「実行」ボタンが有効になるのでクリックして実行します。
しばらく待つと「承認が必要です」というポップアップが表示されますので「権限を確認」ボタンを押します。

スクリーンショット 2021-04-18 14.39.49

しばらくすると「このアプリはGoogleで確認されていません」が表示されるので、左下の「詳細」リンクをクリックします。

スクリーンショット 2021-04-18 14.43.58@0.5x

「モバメ保存(安全ではないページに移動)」リンクがでてくるので、そのリンクをクリックします。

スクリーンショット 2021-04-18 14.45.00@0.5x

アクセスの許可画面が表示されますので、右下の「許可」ボタンを押してGmailとGoogleドライブへのアクセス許可を与えます。
添付画像の3個以外の許可を求められた場合、スクリプトが違う可能性がありますので、スクリプトのコピーからやり直してみてください。

画像20

処理が終わると、元の画面に戻りますのでもう一度「実行」ボタンを押して処理を実行してみて下さい。
1時間以内にメールが届いていると、Google Driveに受信したメールのメールテキストと画像が保存されていると思います。

メールは西暦+メールアドレス(メンバー)毎に保存されます。

2021年にmember@hkt48.comというメールアドレスから受信すると
[2021]member というフォルダが作成されてその中に保存されます。

定期実行を設定する

スクリプトの動作が確認できたら最後の仕上げです。

先ほどのスクリプトを一定間隔毎に実行する設定を行います。
Google Apps Scriptの画面に戻って、左メニューから時計アイコンの「トリガー」を選択します。

スクリーンショット 2021-04-18 14.59.56@0.5x

右下の「トリガーを追加」ボタンでトリガーを追加します。
「分ベースのタイマー」「30分おき」に設定を変更して保存を行います。

スクリーンショット 2021-04-18 15.05.37

このような画面になれば完了です。

スクリーンショット 2021-04-18 15.07.31

これで全ての設定が終わりです。
お疲れ様でした。

役に立った!すごい!と思っていただけた方、是非カンパお願いいたします。

カンパしていただけた方には、おまけで過去のデータを一度全部取得するスクリプトもご紹介したいと思います。

--------------------------------------------------------

ここから先は

4,201字 / 6画像

¥ 250

この記事が気に入ったらチップで応援してみませんか?