くらげnote

"ぼやき" by くらげ(fal)

Gmail を LINE に転送する 2022/01

あまり数学とは関係ないですが、忘れそうなので個人用の備忘録として記事にします.

やりたいこと

  • 受信したGmailをLINEに転送する
  • 無料で行う

GAS ("Google Apps Script" の略らしい) を用い, Gmailの新着メールをLINEに転送する by Google Apps Script - パンダのプログラミングブログさんのコードを用いることで実装できた.

JavaScriptを初めて触った(そのうえ, 今後触る予定もない)ので, 詰まったことや忘れそうなことだけを記載.

LINE Notify Token を設定する。

LINE Notify にログインし、 右上の「メニュー - マイページ 」を選択. ページ下部にある「アクセストークンの発行(開発者向け)」から、 「トークンを発行する」をクリック. トークン(長い英数字の文字列)が表示される. トークンは1度しか表示されないので, コピーを忘れずに. (発行は1回きりではないので, 忘れたらやり直すこともできるが...)

Google Apps Script (GAS) の設定

Apps Script – Google Apps Script の左上、「新しいプロジェクト」を選択.

GASのホーム画面

コードを書く.

1. LINEトークンを貼り付ける.

 // LINE Notify のトークンを hoge に貼り付ける
const LINE_NOTIFY_TOKEN = 'hoge'
const ENDPOINT = 'https://notify-api.line.me/api/notify' 

先程コピーしたLINE Notify のトークンを貼り付ける. (元の記事の中には、「プロパティに格納しておきましょう。」などと記述があるのですが、現在(2022/01/26)のバージョンでのやり方が不明でした... 取り急ぎ、このコードで動きます)

2. 転送したいメールを検索する条件を与える

// Fromのアドレスを指定
const FROM_ADDRESS = ['abc@example.com','important.com' ].join(' OR ')
// 同期する間隔(分)
const MINUTES_INTERVAL = 5

上記の例では, abc@example.comと, important.comのどちらかが, Fromのアドレスに含まれる場合にメールが転送される. MINUTES_INTERVAL は同期する間隔を指定し, 例では5分となる.

他にも,

// To のアドレスを指定
const TO_ADDRESS = [''].join(' OR ')
// Subject を指定
const SUBJECT = [''].join(' OR ')

などもできる. 尚, [''] のままにした場合は, 空文字列となり全てのメールが転送される.

3. 検索条件を指定する

  const now = Math.floor(new Date().getTime() / 1000)
  const intervalMinutesAgo = now - (60 * MINUTES_INTERVAL)
  const query = `(is:unread from:(${FROM_ADDRESS}) to:(${TO_ADDRESS}) subject:(${SUBJECT}) after:${intervalMinutesAgo})`
  const threads = GmailApp.search(query)

query に検索条件をすべて詰め込んでいる.

  • "is:unread"は未読のみを対象にする. 指定しなければ既読のものも含まれる.
  • "from:(${FROM_ADDRESS}) to:(${TO_ADDRESS}) subject:(${SUBJECT}) "は先程格納した値を使うように指定する.
  • Date().gettime() で, UNIX 元期 からのミリ秒が得られるので, 秒に換算したものをnowに格納. intervalMinutesAgoMINUTES_INTERVAL 分前であるから, これ以後に受け取ったメールのみを転送するようにafterで指定.

4. 転送する文言を得る

  for (const messages of mails) {
    const latestMessage = messages.pop()
    messageDate = latestMessage.getDate()
    messageDate = Utilities.formatDate(messageDate,"JST", "yyyy/MM/dd HH:mm:ss")
    const notice = `
--------------------------------------
件名: ${latestMessage.getSubject()}
受信日: ${[messageDate]}
--------------------------------------

${latestMessage.getPlainBody().slice(0, 350)}
`
    notices.push(notice)

    latestMessage.markRead()
  }

元のサイトのコードでは日時表記がmmddyyyyだった & 時刻がアメリカ時間で表示されるので, 手を加えた.

    messageDate = latestMessage.getDate()
    messageDate = Utilities.formatDate(messageDate,"JST", "yyyy/MM/dd HH:mm:ss")

yyyy/MM/dd HH:mm:ss 表記にできる. ("HH"を"hh"にすると12時間表記になる. ) formatDate の詳細は Google Apps Script メモ - formatDate にあった.

latestMessage.markRead() をつけることで, メールを既読にできる.

完成

メモしておきたいことは以上.

Gmailの新着メールをLINEに転送する by Google Apps Script - パンダのプログラミングブログさんの記事がとても勉強になった. (というかJavascriptを何も理解しないまま完成してしまった...)

参考文献

Gmailの新着メールをLINEに転送する by Google Apps Script - パンダのプログラミングブログ

https://gadgelaun.com/?p=18985

Google Apps Script メモ - formatDate