1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【LINE Notify終了】それでも特定のGmailをLINEに自動で通知したい

Last updated at Posted at 2025-03-12

はじめに

LINE Notifyのサービス終了に伴い、LINE公式アカウントのMessaging APIとGASスクリプトを利用して、Gmailに送られてくる特定のメールを自動でLINEに通知する仕組みを作りました。

参考にしたのはコチラ▼

準備すること

1. 通知用LINE公式アカウントの作成

まずは通知に使うためのLINE公式アカウントを作成します。

2. LINE Developersでの設定

  • LINE Developersコンソールで、新しいプロバイダーとチャネルを作成します。チャネルを作成.png
  • 作成したMessaging APIをクリックして、チャネル基本設定 > チャネルアクセストークン と Messaging API設定 > チャネルシークレット を発行します。(GASで使用)
  • Webhookの設定を行い、GASで作成するスクリプトのURLを登録します。(GASを作成してから設定)

GASプロジェクトの作成:

GASを開く.png

  • Google Apps Scriptで新しいプロジェクトを作成してコードをコピペ.png下のコードを張り付けます。
  // 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分おきに実行するように設定すれば、ほぼリアルタイムで通知されます。

トリガーを選択.png

  • 時間ベースのトリガーのタイプを選択: 分ベースのタイマー
  • 時間の間隔を選択(分): 1分おき

ウェブアプリとしてデプロイ

GASをデプロイしてスクリプトのURLをLINE DevelopersのWebhook URLに設定します。

1.png
2.png

Webhook設定

LINE Developers の設定に移ります。
管理画面を開いてMessaging API設定 > Webhook設定
の箇所にGASでデプロイしたURLを張り付けて更新します。

Webhook設定.png

これで任意のメールがLINEに通知されるようになります。

その他注意点など

  • セキュリティ: アクセストークンとチャネルシークレットは厳重に管理してください。
  • 料金: メッセージ配信を利用するため通数がかかります。無料枠で通知する場合は月200通までとなりますので、利用状況に合わせてプランを選択してください。

さいごに

初めGmailのスレッドの概念が分からず、同じ日付に複数のメールが届いた場合、1通目だけが通知されるので困りました。

そこでCursorに手伝ってもらい、同じ日付のメールを一旦変数に格納してforEachで探すという方法にしたところ上手くいきました。

メールスレッドについて参考ページ▼
https://jp.tdsynnex.com/blog/google/gmail-gas/

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?