【コード掲載】Google Apps Scriptを使って特定のメールでLINEに通知する

Gmailに特定のメールが届いていればLINEへ通知する、という仕組みをGoogle Apps Scriptを使って実現します。

例えば会社のメールアドレスをGmailに転送するようにしておいて、サーバ会社からサーバダウンの通知が来た時にLINEへ通知したりすることができます。(通知が来たら悲しいけどね・・・)

準備するものは大きく3つです。

21/07/03 追記 添付画像も一緒に送信する改良版を作りました。

LINEのトークンを取得する

LINEの送り先を特定するためのものです。

これは個人で取得する必要があります。

LINE Notify
LINE NotifyはGitHub,IFTTT,MackerelなどのWebサービスからの通知を、LINEで受信することが出来る便利なサービスです。

右上からログインします。

開発者用のトークンは取得が簡単なので、普段使っているLINEのアカウントでログインしてください。

マイページの以下のところからトークンを発行できます。

Google Apps Scriptを用意する

プログラムを書くファイルを用意します。

ブラウザでGoogleを開いてからログインした状態で右上メニューからドライブを開きます。

その後、以下のGoogle Apps Scriptをクリックしてください。

以下のような画面が開くので↓に書いているプログラムをコピペしてください。

以下、僕が書いたものです。

メールの送信元のチェックとタイトルのチェック方法を変えられるようになっています。

プログラムの上のほうにある大文字の変数は定数扱いなので、それぞれで変えてくださいね。

let SEARCH_WORD = '障害'; // GMAILの検索ワード

let MAIL_FROM = 'server-down@example.com'; // 送り元の名前も含む (XXX <test@example.com>)
let MAIL_FROM_MATCH = 1; // FROMのアドレスが一致しているか検証するか 0:検証しない 1:検証する

let MAIL_TITLE = '障害通知'; // タイトルチェックのモードに合わせて変更
let TITLE_EXACT_MATCH = 1; // 0: チェックしない 1: タイトルに含まれていればOK 2: 完全一致

let LINE_TOKEN = 'AAAAAAAAAAAAAAAABBBBBBBBBBBBBBXXXXXXXXXXXXXXXXX';

function searchAndSend(){
  // 指定した件名のスレッドを検索して取得 
  // 実行間隔の間に複数のメールが届く可能性がある場合は、合わせて件数を変更する
  let threads = GmailApp.search(SEARCH_WORD, 0, 1); 
  //スレッドからメールを取得し二次元配列に格納
  let messages = GmailApp.getMessagesForThreads(threads);
  for(let i in messages){
    // 届いたメールはスレッドの0番目
    let message = messages[i][0];

    // 必ずタイトルが一致したものだけを取得してくれるわけではないので
    // チェックが必要
    if(!checkTarget(message)){
      continue;
    }

    // スター有無によって実行済みを判定
    // スターが増えていくのがイヤならゴミ箱に入れる
    if(!message.isStarred()){
      sendMessage = createMessage(message);
      sendLine(sendMessage);
      //message.moveToTrash();
      message.star()
    }
  }
}

/**
 * ターゲットとして正しいか確認
 */
function checkTarget(message){
  // メールアドレスの一致チェック
  if(MAIL_FROM_MATCH == 1 && message.getFrom() != MAIL_FROM){
    return false;
  }

  if(TITLE_EXACT_MATCH > 0){
    // タイトルの完全一致
    if(TITLE_EXACT_MATCH == 2 && message.getSubject() != MAIL_TITLE){
      return false;
    }
    // タイトルの部分一致
    else if(TITLE_EXACT_MATCH == 1 && message.getSubject().indexOf(MAIL_TITLE) < 0){
      return false;
    }
  }

  return true;
}

/**
 * 送信メッセージを構築
 */
function createMessage(message){
  return message.getDate() + message.getPlainBody();
}

/**
 * LINE notifyで送信
 */
function sendLine(message){
   
  //Lineに送信するためのトークン
  let options =
   {
     "method"  : "post",
     "payload" : "message=" + message,
     "headers" : {"Authorization" : "Bearer "+ LINE_TOKEN}
 
   };
 
   UrlFetchApp.fetch("https://notify-api.line.me/api/notify",options);
}

この時点でテスト実行して意図した動き(特定のメールを拾えるか、LINEに通知が来るか)をするか確認してくださいね!

プログラムが一定間隔で動くようにセットする

プログラムを書く画面の左側の時計マークを押してトリガーを設定できる画面に移動します。

今回のプログラムだと5分に1回くらいのチェックでいいと思うので、トリガーをセットします。

設定は以上です!

コメント

  1. 匿名 より:

    助かりました、ありがとうございます!

  2. 匿名 より:

    gmaiに届いたメールの添付ファイル(jpg)をlineに自動転送ってできるのでしょうか?

    • Hiroki SanoHiroki Sano より:

      lineのAPIのパラメータとしては以下のものがあるようなのでlineのほうは対応してそうですね。
      imageThumbnail 省略可能 HTTP/HTTPS URL 最大 240×240px / JPEG のみ許可されます
      imageFullsize 省略可能 HTTP/HTTPS URL 最大 2048×2048px / JPEG のみ許可されます
      imageFile 省略可能 File LINE上の画像サーバーにアップロードします。
      対応している画像形式は、png, jpegです。
      imageThumbnail/imageFullsizeと同時に指定された場合は、imageFileが優先されます。

      GmailのほうはgetAttachmentsというメソッドで添付ファイルを取り出せるようです。

      lineのimageFileの型がFileとなっているので、そこに合わせられれば対応できそうだと思っています。

    • Hiroki SanoHiroki Sano より:

      画像の送信について自分も気になったのでやってみたらできました。
      以下の記事を見てみてください!
      https://www.blugrit.com/2021/07/02/gas-gmail-attachment-line/

タイトルとURLをコピーしました