はじめに
LINE Notifyのサービス終了に伴い、LINE公式アカウントのMessaging APIとGASスクリプトを利用して、Gmailに送られてくる特定のメールを自動でLINEに通知する仕組みを作りました。
参考にしたのはコチラ▼
準備すること
1. 通知用LINE公式アカウントの作成
まずは通知に使うためのLINE公式アカウントを作成します。
2. LINE Developersでの設定
-
LINE Developersコンソールで、新しいプロバイダーとチャネルを作成します。
- 作成したMessaging APIをクリックして、チャネル基本設定 > チャネルアクセストークン と Messaging API設定 > チャネルシークレット を発行します。(GASで使用)
- Webhookの設定を行い、GASで作成するスクリプトのURLを登録します。(GASを作成してから設定)
GASプロジェクトの作成:
// Line Message Api用 URL
const LINEMSGURL = "https://api.line.me/v2/bot/message/broadcast"
// Line Message Api用 トークン
const CHANELTOKEN = "チャネルアクセストークン"
// 1分置きにメールの確認を実施
function main() {
var msg = getNfMailMessage()
// 結果が空なら終了
if(msg == undefined) return
sendMessage(msg)
}
//Gmailのメールを確認する
function getNfMailMessage() {
var today = new Date();
var dateString = Utilities.formatDate(today, "GMT", "yyyy/MM/dd"); // 今日の日付
// 今日の日付のスレッドを検索
const threads = GmailApp.search('from:送信元アドレス after:' + dateString);
// 対象のスレッドがなければ、終了
if (threads.length == 0) return undefined;
// 未読メールを収集
var unreadMessages = [];
threads.forEach(function(thread) {
var messages = thread.getMessages();
messages.forEach(function(message) {
if (message.isUnread()) {
unreadMessages.push({
message: message,
date: message.getDate().getTime()
});
}
});
});
// 未読メールがなければ、終了
if (unreadMessages.length == 0) return undefined;
// 日時でソート(降順)
unreadMessages.sort(function(a, b) {
return b.date - a.date;
});
// 最新の未読メールを取得
var latestMessage = unreadMessages[0].message;
// デバッグ用ログ
Logger.log("検索されたスレッド数: " + threads.length);
Logger.log("未読メール数: " + unreadMessages.length);
Logger.log("取得したメールの日時: " + new Date(unreadMessages[0].date));
Logger.log("メールの件名: " + latestMessage.getSubject());
// メールを既読にする
latestMessage.markRead();
// メールから本文を取得
const res = latestMessage.getPlainBody();
// 本文がなければ、終了
if (res == undefined) return undefined;
return res;
}
// Line Apiでメッセージを送信
function sendMessage(msg) {
// 送信メッセージ
const payLoad = {
"messages" : [
{
"type" : "text",
"text" : msg
}
]
}
// ヘッダ
const header = {
"Content-Type": "application/json",
"Authorization": "Bearer " + CHANELTOKEN
}
// オプション
const options = {
"method" : "post",
"headers" : header,
"payload" : JSON.stringify(payLoad)
}
// 送信実施
UrlFetchApp.fetch(LINEMSGURL, options)
}
コードを設定します
下の2か所を変更して保存します。余計なスペースが入らないように注意!
-
'チャネルアクセストークン'
の''
の間に、LINE Developersで発行した チャネルアクセストークン(長期) を張り付けます。 -
'送信元のメールアドレス'
の''
の間に、通知したい 送信元のメールアドレス を入れます。
メールの件名で検索したい場合はsubject:"メールタイトル"
に変更
トリガーを設定します
実行する関数を選択して、1分おきに実行するように設定すれば、ほぼリアルタイムで通知されます。
- 時間ベースのトリガーのタイプを選択: 分ベースのタイマー
- 時間の間隔を選択(分): 1分おき
ウェブアプリとしてデプロイ
GASをデプロイしてスクリプトのURLをLINE DevelopersのWebhook URLに設定します。
Webhook設定
LINE Developers の設定に移ります。
管理画面を開いてMessaging API設定 > Webhook設定
の箇所にGASでデプロイしたURLを張り付けて更新します。
これで任意のメールがLINEに通知されるようになります。
その他注意点など
- セキュリティ: アクセストークンとチャネルシークレットは厳重に管理してください。
- 料金: メッセージ配信を利用するため通数がかかります。無料枠で通知する場合は月200通までとなりますので、利用状況に合わせてプランを選択してください。
さいごに
初めGmailのスレッドの概念が分からず、同じ日付に複数のメールが届いた場合、1通目だけが通知されるので困りました。
そこでCursorに手伝ってもらい、同じ日付のメールを一旦変数に格納してforEach
で探すという方法にしたところ上手くいきました。
メールスレッドについて参考ページ▼
https://jp.tdsynnex.com/blog/google/gmail-gas/