tetsunosukeのnotebook

tetsunosukeのメモです

システムから来るメールなどを迷惑メールにしない(GoogleAppsScript)

昨日GASのハンズオンセミナーを開催した時に参加者の方と少しお話をして、どんなスクリプトを社内で動かしているか?みたいな例として、下記のようなスクリプトを紹介しました。

まあ社内でっていうか、完全に俺得として作ったものなんだけど。
AppsScriptの習作としてサンプルをちょっと改造してみたものです。

仕様としてはfromが自分の属している会社のドメインと同一のものがSPAMに入っていたらそれを復旧(inboxに入れて、未読に)するという処理です。元からついてたラベルとかあんだろみたいな話はとりあえず気にしない。

AppsScriptでfunctionを作ると、その関数が全部publicになるというか、メニューからの実行対象になってしまうので、そこらへんのデザインは、Building a Sites Application: Understanding Script DesignのSection 3 - Defining the TimeRecord and TimeSheet Classes in the Script を参考にしてみましたよ。

これをトリガーで定期的に実行すれば、SPAMに入ったことに気づかずに幸せになれる、ということになっています。

/**
 * 受信箱を処理。直接実行される関数
 * (サンプルの同名関数の中身をちょっと変えた)
 */
function processInbox() {
  // 自身のEmail
  var myEmail = Session.getActiveUser().getEmail();

  // 自身のドメイン
  var emailObj = new Email_();
  var myDomain = emailObj.getDomain(myEmail);
  // SPAM判定されているスレッドの一覧
  var threads = GmailApp.getSpamThreads();
  for (var i = 0; i < threads.length; i++) {
    // スレッドの取得
    var messages = threads[i].getMessages();
    // スレッドに含まれるメールから、情報を取得していく
    for (var j = 0; j < messages.length; j++) {
      if (emailObj.getDomain(messages[j].getFrom()) === myDomain) {
        // inbox へ入れて未読に
        threads[i].moveToInbox();
        threads[i].markUnread();
      }
    }
  }
};

/**
 * メールアドレスからドメイン部分を取得
 * user@example.com なら example.com 部分
 * getFrom() で取得したメールアドレスは、 "username" <user@example.com> 形式なので
 * その場合は考慮していない
 * (何か良いライブラリがあればそれを使えばいいと思いますが...)
 */
function Email_() {
  this.getDomain = function(emailAddress) {
    // 
    var userAndDomain = emailAddress.split("@");
    // 自身のドメイン (example.com)
    if (userAndDomain.length === 2) {
      return userAndDomain[1];    
    } else {
      return null;
    }
  }
}