LoginSignup
7
7

More than 5 years have passed since last update.

[GMail] ラベルのない受信メールの送信アドレスと受信回数を教えてくれる処理作った。

Posted at

なにこれ?

Gmailでラベルのついていない受信メールを一通りチェックして、そのメールの送信者のアドレスと受信回数を一覧にしてメールで教えてくれるGoogle Apps Scriptです。
自動化っていいですよね。

メイドちゃん構想で色々作ってる中のひとつです。
http://qiita.com/tienlen/items/34aa9da98149d1992dfc

公開理由

Google Apps Scriptで作ったものの制約が結構きつかったり、Google Apps Scriptの挙動の問題でこれだったら他の言語で書いたほういいわぁってところがあり、実際使うにせよ、他の言語でGmail API使って作りなおしたほうがいいかもと思い、使わなそうなので公開することにしました。
つまりいらない子なので、里子に出しました。

注意事項

  • Archiveしてるメールも対象にしてるので、検索範囲をInboxのみにしてません。そのせいでチャットも対象になっちゃってるけど...
  • 500件以上を一気にとろうとしてますが、それを外部関数にしたのはHash(連想配列)に別の連想配列を追加/連結する処理を色々試してみましたがデバッグしてて期待値を得られなかったからです。(ぶっちゃけ諦めただけ)
  • 注意事項というか、実際使っててなんですが、1500件ぐらいのデータさばこうとしたら処理時間がかかるだの、タイムアウトだのでGoogleさんにエラーメッセージはかれて怒られました。 多分、100〜300件ぐらいしか実際はさばけないと思います。
  • メールアドレスのヴァリデーション(正規表現のチェック)外したらちょっとは早くなるかな?

ライセンス

これに関しては今後使わないかもしれない可能性大なので、どうでもいいんですが、かといって他の人が「これ俺が作った」って言いやがったら嫌なので、MITライセンスのつもりで使ってください。

ソースコード

recieved.gs
// 他の処理でも使ってるものは定数にしている
// set your email address.
var YOUR_EMAIL_ADDRESS = "あなたのGmailアドレス";
// string for regular expression check
var EMAIL_REGEX = /[a-zA-Z0-9\._\-]+@[a-zA-Z0-9\.\-]+\.[a-z\.A-Z]+/g;

function getNoLabelSenders() {
  var query = 'has:nouserlabels';
  var threadAll = 0;
  var offset = 0;
  var limit = 500;
  var mailAddress = getEmailAddress();
  var AddressList = {};
  var hasMore = true;
  while (hasMore) {
    var threads = GmailApp.search(query, offset, limit);
    if (threads.length < limit) {
      hasMore = false;
    }
    offset = offset + limit;
    for (var i = 0; i < threads.length; i++) {
      var thread = threads[i];
      var firstMessage = thread.getMessages()[0];
      var sender = firstMessage.getFrom().match(EMAIL_REGEX)[0];
      if (sender && sender != mailAddress) {
        if (AddressList[sender] != undefined) {
          AddressList[sender] += 1;
        } else {
          AddressList[sender] = 1;
        }
      }
      // Logger.log(sender);
    }
    // GmailApp.searchだと1回で500件までしか取れないので、
    // whileで回して全件取るようにしてますが、
    // 数が多いとタイムアウトとかで怒られるので、
    // その場合は強制的にhasMore = falseにしてください。
    // hasMore = false;
  }
  // Logger.log(AddressList);
  if (AddressList) {
    var message = "These messages don't have label \n\n";
    for (key in AddressList) {
      message = message + key + ': ' + AddressList[key] + " messages\n";
    }
    GmailApp.sendEmail(mailAddress, '[Report] No label massages', message);
  }
}

function getEmailAddress() {
  // Sessionだと認証を求められる代わりに定数や変数で指定しなくてもOK
  // 嫌だったら YOUR_EMAIL_ADDRESSの方を使ってください
  return Session.getEffectiveUser().getEmail();
  // return YOUR_EMAIL_ADDRESS;
}
7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7