都内SEのプログラミング勉強と雑記

2008年より都内でSEをしてます。業務システムをリプレイスし続けてきました。ここでは主にjavaやその周辺技術関連を紹介予定。学ぶことリスト:https://docs.google.com/spreadsheets/d/1G4lUqbHxsMf4PGgeRVe1ZL3JTOjlSTrqsJYe1CKz9UY/edit?usp=sharing

Gmailの特定メールをLineで通知

Line Notifyに登録

Line Notify

マイページからアクセストークンの発行

トークンは発行後に表示されます。

閉じると二度と表示されないので忘れずコピーしておきます。

GASを実行

以下をテンプレートとして「何分毎」と「Your Line Token」の箇所を書き換える

////(該当したメールが既読扱いになるかも?)

const sendLine = (body, lineToken) => {
  let options = {
    "method": "post",
    "payload": {
      'message': body
    },
    "headers": { "Authorization": "Bearer " + lineToken }
  };
  UrlFetchApp.fetch("https://notify-api.line.me/api/notify", options);
}

const setSearchCondition = () => {
  const now = Math.floor(new Date().getTime() / 1000);
  const interval = 15; //〇分前~現在の新着メールを取得 #--トリガーをこれに合わせておく!!
  const term = now - (60 * interval);
  const subject = 'subject:"お知らせ|重要|不在"'; // 件名 「|」つなぎでor条件を指定できる
  
  //検索条件候補
  // const subject = "subject:件名"; // 件名
  // const label = "label:ラベル"; // ラベル
  // const term = "after:2022/1/1 before:2022/1/31"; // 日付
  // const from = "<from:test@gmail.com>"; // 送信者
  //実態は件名+日付といった複数指定の条件は "subject:件名 after:2022/1/1 before:2022/1/31" のように半角スペース区切りで指定可能

  //XX分前の新着(未読)で指定件名のメールを取得
  return '(is:unread ' + subject + ')';
}

const searchMail = (searchCondition) => {
  return GmailApp.search(searchCondition);
}

const getMessages = (searchResult) => {
  const mails = GmailApp.getMessagesForThreads(searchResult);

  let detailMessages = []
  for (const messages of mails) {
    const message = messages.pop()
    detailMessages.push(
      "\n【Date】: " + message.getDate()
      + "\n【From】: " + message.getFrom()
      + "\n【Subject】: " + message.getSubject()
      + "\n【Body】: \n" + message.getPlainBody().slice(0, 200)
    )
  }

  GmailApp.markThreadsRead(searchResult);
  return detailMessages;
}

const main = () => {
  const lineToken = "XXXXXXXXXXXXXXXXXXX"; //Your Line Token

  const result = searchMail(setSearchCondition())
  if (result.length > 0) {
    const messages = getMessages(result)

    messages.forEach(message => {
      sendLine(message, lineToken)
    })
  }
}

実行対象の関数が main になっていることを確認し「実行」を押下する。

初回起動に許可を求められるので詳細を表示して権限付与する。

対象のメールが飛んで来たら準備完了。

トリガーを設定し自動実行する

決まった時間ごとに実行されるようにGASのトリガーを設定する。

引用

follow us in feedly