LINE Messaging APIを使ってメールをLINEに自動転送する（もう一つのユーザーID取得方法）

# はじめに

[LINEヤフー株式会社のアナウンス](https://notify-bot.line.me/closing-announce)によると、同社は2025年3月末で LINE Notifyのサービスを終了し、その代替サービスとしてLINE公式アカウントの LINE Messaging API を紹介しています。

従来より、LINE Notify の利用例として、Google Apps Script を使ってメールを LINE Notify に転送する記事がたくさんありました。LINEヤフー社のアナウンスを受けて、Messaging APIの使った代替方法を紹介した記事が書かれるようになりましたが、どの記事でも「ユーザーIDの取得」に困っているようで、主に次の2パターンの記事が見つかります。

- ブロードキャストで乗り切る（一人で使うんだから別にいいんでしょうけど…）
- Google SpreadSheet を使ってユーザーIDを取得する（なんか大掛かりだな…）

私のこの記事では、ユーザーIDを取得するためのもう一つの方法（Webhook.site を使う方法）を紹介したいと思います。

とは言え、ユーザーIDの取得方法だけ紹介しても困るという人も多いと思いますので、開発経験のあまりない方でも転送設定ができるように、一通り説明してますので安心してください。

もっと簡単に転送したいという方には、記事の最後に別の方法も紹介しますので、最後まで読んでもらえるとうれしいです。

## LINE公式アカウントを作成する

まずは、LINE公式アカウントを作る必要がありますので、[LINE公式アカウントのサイト](https://manager.line.biz/)に（ご自分のLINEアカウントで）ログインして、新しいLINE公式アカウントを「作成」します。

![1-LINE公式アカウントの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/3859b2a9-5683-6e40-d582-2fb5de07c8a6.png)

LINE公式アカウント作成のために必要な項目をいくつか聞かれますので、必須項目を入力して、「確認」ボタンを押します。

| 項目                    | 入力例             |
|:-----------------------|:------------------|
| アカウント名             | メールの定期転送     |
| メールアドレス            | 自分のメールアドレス  |
| 会社・事業者の所在国・地域  | 日本               |
| 業種                    | 個人　個人（その他）  |
| 運用目的                 | その他             |
| 主な使い方               | メッセージ配信用     |

LINE公式アカウントが作成されたら、その画面上の「LINE Official Account Manager」ボタンを押して、**LINE公式アカウントの管理画面**を表示します。途中でいくつかの個別規約への同意を求められますので、内容をよく読んで「同意」します。

その後最初のログイン時には、「運用を始める前に」と「まずは友だちを集めましょう」のモーダルダイアログがでますが、ここでは無視して閉じておきます。

これで「メールの定期転送」という名前のLINE公式アカウントができました。

## LINE Messaging APIを設定する

**LINE公式アカウントの管理画面**の右上の「設定」をクリックして LINE Messaging APIを利用するための設定をしていきます。

![2-LINE公式アカウントの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/c172c407-6dd8-4b65-aea3-a54e890a0278.png)

表示された**LINE公式アカウント設定**の左側メニューで「Messaging API」を選ぶと、真ん中あたりに表示される「Messaging APIを利用する」というボタンを押すと LINE Messaging API が利用できるようになります。

## LINE Developersでチャンネルアクセストークンを取得する

LINE Messaging API を簡単に実行できるようにするため、下記の手順で、チャンネルアクセストークン（長期）というものを取得します。

**LINE公式アカウント設定**の「Messaging API」画面に表示されている「LINE Developers」リンクからLINE Developers の画面を開き、右上のコンソールボタンを押して **LINE Developer コンソール**を開きます。

![3-LINE Messaging APIの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/b7c6b3c3-d0f4-85ff-99f0-6fa3e3ebed77.png)

直接「[LINE Developers コンソール](https://developers.line.biz/console/)」 を開いても構いません。

**LINE Developers コンソール**の画面で、[プロバイダー](https://developers.line.biz/ja/docs/line-developers-console/overview/#provider)を新規作成（個人で使う分にはあまり難しいことは考えず自分の名前でプロバイダーを作れば良いと思います）して、上の手順で作成した公式アカウント「メールの定期転送」を選択します。

**LINE Developers コンソール**の Messaging API 設定タブを開きます。

![4-LINE Developersコンソール Messaging API設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/a517c617-82ee-4a59-9676-c34ef4404520.png)

一番下までスクロールすると、「チャンネルアクセストークン（長期）」という項目があるので、「発行」ボタンを押してトークンを発行します。長い文字列（トークン）が表示されるので、覚えておきます。

![5-チャンネルアクセストークン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/16c9b2e4-ad29-51bf-7f0a-c9b0da4b0e37.png)

## ユーザーIDを取得する

LINE Messaging API では、その公式アカウントを友だちに追加したり、公式アカウントのトーク画面で誰かがメッセージを送ったりすると、それをリアルタイムで知らせるために Webhook と呼ばれる技術で情報を送ってきます。以下の手順では、これを利用してユーザーIDを取得します。

Webhook で送られてくるデータを調べることのできるサービス（[https://webhook.site/](https://webhook.site/)）をブラウザーで開き、「Your unique URL」をコピーします。

![6-Webhook-site.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/d591730d-420e-ab68-e5d9-0ae60f95a058.png)

**LINE公式アカウント設定**の左側のメニューから応答設定を選び、「Webhook」を有効にします。

![7-Webhookの有効化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/aa662827-7368-1e92-11ce-fe2e31257152.png)

**LINE公式アカウント設定**の左メニューから Messaging API を選び、上の手順でコピーした URL を Webhook URL 欄に入力（ペースト）します。

![8-Webhook URLの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/623346d5-1a98-67a0-bdb6-2e3664dfd1ea.png)

これで Webhook を受け取る準備ができましので、この状態で作成したLINE公式アカウントと友だちになります。

友だちになるには、**LINE公式アカウント管理**の左メニューから「友だち追加ガイド」を選び「友だち追加QRコードを作成」して表示されたQRコードをスマホでスキャンすると簡単に友だちに追加することができます。

友だちになるとほぼ同時に、Webhook.site の画面にLINEからWebhookが届き、次のような画面が表示されます。

![9-Follow request received.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/c66a1fc6-d60d-460d-9558-4a9bb0fe2443.jpeg)

Headers の userAgent に LineBotWebhook/2.0 と書いてあることで、確かに LINE から送られてきたリクエスト（Webhook）であることが確認できます。

Raw Content に表示されている events[].type の follow は、誰かが友だちになったことを意味していますので、それを確認し、 events[].source.userId に書かれている 「U」で始まる文字列が、今回友だちになった LINE ユーザーのユーザーIDです。この文字列も覚えておきます。ちなみに、このユーザーIDは、作成した公式アカウントでのみ意味を持つIDです。

curl コマンドを使える人は、次の curl コマンドで displayName を確認することでそのユーザーIDが本当に自分であることを確認できます。

```shell:curlコマンドでユーザーIDが本当に自分かどうか確認する
$ LINE_CHANNEL_ACCESS_TOKEN=チャンネルアクセストークン
$ LINE_USER_ID=ユーザーID
$ curl -H "Authorization: Bearer $LINE_CHANNEL_ACCESS_TOKEN" \
       -X GET https://api.line.me/v2/bot/profile/$LINE_USER_ID | jq
{
  "userId": "UXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”,
  "displayName": "ユーザー名",
  "pictureUrl": "https://profile.line-scdn.net/XXXXXXXXXXXXXX”,
  "language": "ja"
}

※ 出力を整形するためにjqを使っていますが、jqは使わなくても構いません。
```

ユーザーIDを取得したら、 Webhook はもう使いませんので、LINE公式アカウント設定から、 Webhook を無効にしておきましょう。

## Google Apps Scriptを作成する

以下の手順で、Gmailに届いたメールを自動的に LINE に転送するためのスクリプトを作成していきます。

Googleドライブから「新規」「その他」「Google Apps Script」で新しいスクリプトを作成します。

![10-Google Apps Scriptの作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/7c3842e1-87f1-26b7-0d3c-15702610ab9a.png)

まずは、スクリプトプロパティを設定します。設定するプロパティ名と値は次の表のとおりです。

| プロパティ                   | 値                     |
|:---------------------------|:-----------------------|
| LINE_CHANNEL_ACCESS_TOKEN  | チャンネルアクセストークン  |
| LINE_USER_ID               | ユーザーID               |

設定するとこのような感じになります。

![11-スクリプトプロパティ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/ffb2bbca-8a67-2e4d-7883-647cb9d2db93.png)

コード（プログラム）には次の内容を入力します。

```js:Google Apps Scriptに登録するプログラム
const token = PropertiesService.getScriptProperties().getProperty('LINE_CHANNEL_ACCESS_TOKEN');
const uid = PropertiesService.getScriptProperties().getProperty('LINE_USER_ID');
const lineApiUrl = 'https://api.line.me';
const pushApiEndpoint = `${lineApiUrl}/v2/bot/message/push`;
const fetchInterval = 5; // [min]

function fetchEmail() {
 const now = new Date().getTime();
 const lastFetched = now - fetchInterval * 60 * 1000;

 const threads = GmailApp.search(`(is:unread after:${Math.floor(lastFetched/1000)})`);
 const messages = GmailApp.getMessagesForThreads(threads);

 return messages
   .flat()
   .filter((message) => message.getDate().getTime() > lastFetched)
   .sort((message1, message2) => message1.getDate() - message2.getDate())
   .map((message) => ({
     date: message.getDate(),
     from: message.getFrom(),
     subject: message.getSubject(),
     body: message.getPlainBody().slice(0, 200),
   }));
}

function pushMessage(message) {
 const payload = {
   to: uid,
   messages: [{
     type: 'text',
     text: `Date: ${message.date.toLocaleTimeString('ja-JP')}
From: ${message.from}
Subject: ${message.subject}
${message.body}`,
   }],
 };
 const options = {
   method: 'post',
   payload: JSON.stringify(payload),
   headers: {
     Authorization: `Bearer ${token}`,
     'Content-Type': 'application/json',
   }
 }

 UrlFetchApp.fetch(pushApiEndpoint, options);
}

function main() {
 const messages = fetchEmail();

 messages.forEach((message) => pushMessage(message));
}
```

このスクリプトは、5分に一度 main 関数が実行されることを期待し、実行時刻の5分前から実行時刻までの未読メールの内容を LINE Messaging API を使って転送します。

スクリプトを保存したら、トリガー（スクリプトを実行するきっかけ）を追加します。

![12-トリガーの追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/c7ba8a87-80d0-71ac-df16-b9fff730a8b2.png)

ここで設定する主な項目は次のとおりです。

| 項目                         | 値               |
|:----------------------------|:-----------------|
| 実行する関数を選択             | main             |
| イベントのソースを選択          | 時間主導型         |
| 時間ベースのトリガータイプを選択  | 分ベースのタイマー  |
| 時間の間隔を選択（分）          | 5分おき           |

これで、5分おきにスクリプトの main 関数が実行されるようになります。

## 動作確認

自分宛にメールを送って5分ほど待ちます。

![13-動作確認.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61150/2aff9bf3-2e41-e372-6f6f-2520c33cc825.jpeg)

うまくLINEに転送されました。

## まとめ

LINE のユーザーID は Webhook.site を使うと簡単に取得できます。

今回のスクリプトは簡易的に作成したものですので、次のような注意点があります。

- リアルタイムの転送ではなく、5分ごとに5分以内に届いたメールを LINE に転送します。
- スクリプト実行間隔のタイミングは厳密ではないので、ごくまれに転送の抜け漏れが起こる可能性があります。
- メールの送信時刻を使って 5分以内のメールかどうかを判定しているので、メールの送信から自分の Gmailが受信するまでに長時間かかったメールは取りこぼします。特に大きなメーリングリストを受信する場合は、送信から数十分以上経過してあなたの手元に届くことはまれなことではありません。

このままでも十分実用的ではありますが、改善にトライしてみるもの楽しいのでぜひトライしてください。

また、この記事には LINE Messaging API を curl で呼び出すヒントも書きましたので、メールを LINE に転送するだけでなく、IoT機器からの通知を LINE へ送る時にも活用できると思います。

## 最後に

プログラムを書くのは別に楽しく無いので簡単にLINEをメールに転送したい方は、「[メール転送](https://www.codyltech.com/mail-to-line/)」というLINE公式アカウントがありますので、ぜひ使ってください。