モバメのメール本文と画像をGoogleDriveに自動保存するスクリプトを作ってみた。
はじめに
有料記事になっていますが、基本の設定は無料範囲でも行えるようになっています。また、Gmailのフィルタの作成の設定方法などもありますので、少しでも興味がありましたらごらんいただければと思います。
なお、有料メールは契約した人へのサービスです。
受信したGoogle Driveのフォルダを一般に公開したり、他人と共有するなどを行う行為は絶対にお止めください。
事前準備
モバイルメールの送信先をgmailに変更してください。
すでにgmailに設定している方はそのままで大丈夫です。
※変更のやり方はここでは解説しません。
なお、これから設定するスクリプトは、AKB48とHKT48のメールで確認済みです。
※ソースの修正やURLの確認などがあるのでPCで作業するのがおすすめです。
仕組み
今回の方法では、gmailで受信したメールにラベルを付与し、Google Apps Scriptでラベルがつけられたメールを対象に、google driveにメールを保存していきます。
注意点として、今回のスクリプトでは一日分のメールを処理します。
また、メールの処理数が最大500件までとなっているため、500件以上受信した場合取りこぼしが発生する場合があります。
それでは、設定をして行きましょう。
Google Driveの設定
まずは、Google driveにモバイルメール保存用のフォルダを作成します。
フォルダ名は何でもかまいません。
自分は、「_モバメ」にしました。
フォルダ名でソートしたときに一番上に来て探しやすいからです。
後でこのフォルダ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}
画像を保存したいメールの一覧が表示されるのを確認しましょう。
メールが確認できたら、検索ボックス右側の「▼」をクリックしてフィルタを作成し、ラベル付けのを設定をします。
フィルタを作成ボタンをクリックし「ラベルを付ける」「一致するメッセージにもフィルタを適用する」にチェックを付けます。
その後、「ラベルを選択」をクリックし「新しいラベル」を選んでラベルを追加します。自分は「モバメ」にしました。
このラベル名は後で使いますので、フォルダIDと一緒にメモしておきましょう。
最後に「フィルタを作成」ボタンでフィルタを作成しましょう。
ラベルを選択して、メールにちゃんとラベルがついている事を確認しましょう。
ちゃんとメールが表示されていたら設定完了です。
Google App Scriptの設定
Gmailのラベル設定が完了したら、Google Apps Script(GAS)を設定します。
まずは、Google Apps Scriptのページにアクセスしましょう。
http://script.google.com/
開いたら、左上の「新しいプロジェクト」をクリックしてプロジェクトを作成します。「無題のプロジェクト」をクリックしてプロジェクトの名前をわかりやすいように変更しておきます。ここでは「モバメ保存」にしました。
名前を変更したら、画像のコード部分(赤枠部分)にスクリプトをコピーします。
まず、赤枠内のスクリプトを全て削除します。その後、この下のコード(黒枠内のコード)を先ほどの赤枠内にコピーします。
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
このような感じになります。
ここで、Google DriveのフォルダIDとGmailで設定したラベル名を設定します。
それぞれ、さきほどコピーしたコードの【基本設定】の部分を変更します。
'XXXXXXXXX' の部分をメモしたフォルダIDに変更します。
'モバメ'の部分をGmailで設定したラベル名に変更します。
※この記事通り「モバメ」に設定した場合は変更しなくてかまいません。
最後に画面上部の「保存」ボタンをクリックしてプロジェクトを保存します。
保存が完了すると、「保存」ボタンの右隣の「実行」ボタンが有効になるのでクリックして実行します。
しばらく待つと「承認が必要です」というポップアップが表示されますので「権限を確認」ボタンを押します。
しばらくすると「このアプリはGoogleで確認されていません」が表示されるので、左下の「詳細」リンクをクリックします。
「モバメ保存(安全ではないページに移動)」リンクがでてくるので、そのリンクをクリックします。
アクセスの許可画面が表示されますので、右下の「許可」ボタンを押してGmailとGoogleドライブへのアクセス許可を与えます。
添付画像の3個以外の許可を求められた場合、スクリプトが違う可能性がありますので、スクリプトのコピーからやり直してみてください。
処理が終わると、元の画面に戻りますのでもう一度「実行」ボタンを押して処理を実行してみて下さい。
1時間以内にメールが届いていると、Google Driveに受信したメールのメールテキストと画像が保存されていると思います。
メールは西暦+メールアドレス(メンバー)毎に保存されます。
2021年にmember@hkt48.comというメールアドレスから受信すると
[2021]member というフォルダが作成されてその中に保存されます。
定期実行を設定する
スクリプトの動作が確認できたら最後の仕上げです。
先ほどのスクリプトを一定間隔毎に実行する設定を行います。
Google Apps Scriptの画面に戻って、左メニューから時計アイコンの「トリガー」を選択します。
右下の「トリガーを追加」ボタンでトリガーを追加します。
「分ベースのタイマー」「30分おき」に設定を変更して保存を行います。
このような画面になれば完了です。
これで全ての設定が終わりです。
お疲れ様でした。
役に立った!すごい!と思っていただけた方、是非カンパお願いいたします。
カンパしていただけた方には、おまけで過去のデータを一度全部取得するスクリプトもご紹介したいと思います。
--------------------------------------------------------
ここから先は
¥ 250
この記事が気に入ったらチップで応援してみませんか?