Gmailのメールの構造

GmailのメールをGoogle Apps Scriptで扱えるようになりたい、と思ったとき、まず最初に理解しないといけないのは「Google Apps Scriptで、メールがどのように管理されているか」という点です。

Google Apps Scriptでは、メールは「スレッド」と「メッセージ」というもので管理されます。スレッドというのは、メールに返信してやり取りをした場合、一連のメールをまとめて扱うためのものです。そしてスレッドにまとめられている1通1通のメールがメッセージです。

これらは、「GmailThread」と「GmailMessage」というオブジェクトとして用意されています。この2つのオブジェクトを自由に扱えるようになることが最初の目標と考えましょう。

といっても、いきなり「GmailThreadやGmailMessageといったオブジェクトを操作して……」なんていわれてもよくわからないかもしれませんね。そこで、まずは簡単にGmailThreadオブジェクトを取り出せる機能を使ってみましょう。それは「トレイ」です。

Gmailには、いくつかのトレイが標準で用意されています。それらのトレイにあるスレッドをまとめて取り出すメソッドが、GmailAppオブジェクトに用意されています。以下のようなものです。

受信トレイのスレッド
GmailApp.getInboxThreads()

優先トレイのスレッド
GmailApp.getPriorityInboxThreads()

迷惑メールスレッド
GmailApp.getSpamThreads()

スター付きスレッド
GmailApp.getStarredThreads()

ゴミ箱スレッド
GmailApp.getTrashThreads()

これらは、それぞれのトレイにあるスレッドをGmailThreadオブジェクトの配列として取り出します。後は繰り返しなどを使って、GmailThreadオブジェクトを順に取り出し処理すればいいのです。

GmailThreadのタイトルを調べる

GmailThreadオブジェクトには、いくつかの便利なメソッドが用意されています。ここでは「タイトルを調べるメソッド」を使ってみましょう。

《GmailThread》.getFirstMessageSubject();

このメソッドは、スレッドの最初のメールのタイトルを返すものです。スレッドは、返信でやり取りをする一連のメールの集まりですから、タイトルは最初のものが「〇〇」とすると、それ以降は「Re:〇〇」といった形になりがちです。ですから、1通目のメールのタイトルがわかれば、そのスレッドがどういうメールの集まりかだいたいわかるわけですね。

では、先ほどのトレイのスレッドを取り出すメソッドと、スレッドのタイトルを調べるメソッドを組み合わせて、「受信トレイにあるスレッドのタイトルを表示する」という処理を考えてみましょう。スクリプトエディタを開いて、以下の関数を記述して下さい。


function getInboxThreads() {
  var threads = GmailApp.getInboxThreads();
  for (th in threads) {
    Logger.log(threads[th].getFirstMessageSubject());
  }
}
  • 受信トレイのスレッドをログダイアログに表示する。

この関数を実行したら、「表示」メニューの「ログ」メニューを選んで、ログ出力のダイアログを表示して下さい。そこに受信トレイにあるメールのタイトルが表示されます。

このスクリプトでは、GmailApp.getInboxThreadsで受信トレイのGmailThread配列を取り出します。そして、forを使ってそこから順にGmailThreadを取り出し、getFirstMessageSubjectで取り出したタイトルをLogger.logでログ出力します。getInboxThreadsとgetFirstMessageSubjectさえわかれば、このようなシンプルなスレッド処理スクリプトは作れるようになります。

今日届いた迷惑メールを知らせる

基本がわかったところで、前回やった「メールを送信する」処理と組み合わせ、もう少し役に立ちそうなものを作ってみましょう。

例として、その日に届いた迷惑メールをまとめてメールでレポートする、というものを考えてみました。Gmailの迷惑メール対策は非常によくできたものですが、ときどき、迷惑メールでないものまで勝手に迷惑メールに判断してしまうことがあります。その日届いた迷惑メールのリストが毎日送られてくるようになっていれば、ざっと見て「これは迷惑メールじゃないぞ」というものを簡単にチェックできますね。


function getSpamThreads() {
  var threads = GmailApp.getSpamThreads();
  var message = "※本日届いたメールの内、以下のものが迷惑メールに分類されています。\n\n";
  for (th in threads) {
    var thd = threads[th];
    if (getYMD(thd.getLastMessageDate())){
        message += thd.getFirstMessageSubject() + '\n';
    }
  }
  var address = 'example@example'; // ★送信先
  var subject = '※スパム・レポート';
  MailApp.sendEmail(address, subject, message);
}

function getYMD(d) {
  var dlm = '-';
  var dt = new Date();
  var today = dt.getFullYear() + dlm + dt.getMonth() + dlm + dt.getDate();
  var target = d.getFullYear() + dlm + d.getMonth() + dlm + d.getDate();
  return today == target;
}

(注)★マークの変数addressの値を自分のメールアドレスに書き換えて利用して下さい。

  • 実行すると、迷惑メールのタイトルをメールで送る。

getSpamThreadsが、迷惑メールのレポートを送る関数で、getYMDはDateが今日の日付かチェックするものです。

ここでは、getSpamThreadsで迷惑メールのスレッドをまとめて取り出し、繰り返しで処理をしています。

繰り返し内では、getLastMessageDateというメソッドを使っています。これは、スレッドの最後のメールが届いた日時をDateインスタンスとして返すものです。これで迷惑メールの日付を取り出し、getYMDで今日の日付かどうかをチェックして、今日の日付のタイトルだけを変数にまとめてメール送信しています。

トリガー登録しよう

実際に送信して動作が確認できたら、「編集」「現在のプロジェクトのトリガー」メニューを選んでトリガーを以下のように登録しておきましょう。

実行――「getSpamThreads」
イベント――「時間主導型」「日タイマー」「午後11時~午前0時」

  • 現在のプロジェクトのトリガーで、日タイマーとしてgetSpamThreadsを登録しておく。

これで一日の終りに、その日届いた迷惑メールのタイトルをまとめてメールで送信するようになります。翌日、朝イチでメールの内容をざっと見れば、誤って迷惑メールに入っていないか確認できます。