アプリケーション開発ポータルサイト
ServerNote.NET
Amazon.co.jpでPC関連商品タイムセール開催中!
カテゴリー【LINEPythonPHPGooglePostfix
【LINE Developers】Gmailに届いた重要なメールを自分のLINEトークへ表示する
POSTED BY
2023-07-24

格安SIMにするとキャリアメールが使えなくなるので、大概はGmailで代用することになる。
ただ、Gmailはキャリアメールと違っていらんメールも大量に届くので、キャリアメール感覚でアプリの通知をオンにしてしまうと通知がすごいことになる。かといって都度いちいちフィルタ設定していたらきりがない。

そこで、Gmailのフィルタ転送機能を使って、重要な差出人からのメールのみ、自分のサーバーに転送して、サーバーからLINE DevelopersアカウントのMessaging APIを使って自分のLINEアカウントへトークとして投げれば、キャリアメールに匹敵する通知が受けられる。重大な取引先からのメールなどをすぐに把握できる。

1、LINE Developersにアカウント登録してボットチャネルを作成する

https://developers.line.biz/ja/

ここで、自分のLINEアカウントでディベロッパ登録をする。プランはフリーでOK
(ただし1000回以上メッセージを送る場合有料プラン)

Messaging APIを使用するチャネルを新規作成する。これでサーバからこのAPIをたたいて自分にトークを送れるようになる。必要な情報は以下の通り

・「自分のユーザーID」
重要なメールを自分自身のLINEにトーク投げするので、自分のユーザーIDを知らなければならない。これは、作成した「チャネル基本設定」の「一番下」に「あなたのユーザーID」があるはずで、これのこと。コピーしておく。

・「チャネルアクセストークン」
チャネル基本設定の横タブ「Messaging API設定」の「一番下」に「チャネルアクセストークン(ロングターム)」があるはずで、コピーしておく。

2、標準入力からデータを受け取って自分のLINEトークに貼り付けるプログラムを書く

Pythonで書く。インストールはこちら

LINE SDKをインストールする。

sudo -s
pip3.8 install line-bot-sdk

本題のプログラムソースは以下。

Pythonsendmessage.pyGitHub Source
import os
import sys
from linebot import LineBotApi
from linebot.models import TextSendMessage

str = ''
for line in sys.stdin:
   str += line

channel_access_token = "MY ACCESS TOKEN"
line_user_id = "MY USER ID"
 
line_bot_api = LineBotApi(channel_access_token)
 
def main():
    line_bot_api.push_message(line_user_id, TextSendMessage(text=str))
 
if __name__ == "__main__":
    main()

MY ACCESS TOKEN、MY USER IDは1、で得た2つに書き換える。

たとえばこんなテキストファイル test.txt があったとして、

てすと
です。

cat test.txt | /usr/local/bin/python3.8 sendmessage.py

としてみる。アクセストークンと自分のユーザーIDが合っていれば、自分のLINEトーク画面に「てすとです」とLINE通知が出るはずだ。

LineBotApiError: status_code=400,"The property, 'to', in the request body is invalid (line: -, column: -)"

などというようなエラーが出た場合、ユーザーIDが間違っているか、ボットからのメッセージを受け取れる設定になっていない。

LineBotApiError: status_code=401,"Authentication failed due to the following reason: invalid token. Confirm that the access token in the authorization header is valid."

などというようなエラーが出た場合、アクセストークンが間違っている。

3、標準入力からメールデータを受け取り解析して標準出力するプログラムを書く

それに関しては以前のこの記事の、maildecode.phpを基本そのまま使えば問題ない。ただし以下の修正をしたほうが便利。
・不要なヘッダをechoしている箇所はコメントアウトする
・ダンプはしない(var_dump($object);はコメントアウト)
/etc/aliasesから起動するので、上記sendmessage.pyの置いてあるディレクトリまでchdirする
例:chdir( "/home/hogeuser/mail-to-line-talk" );

追記

LineBotApiError: status_code=400,Length must be between 0 and 2000

というエラーが出たので、メッセージは2000文字以下でないとダメな模様。よってプログラムの最後で

if(mb_strlen($body_full) <= 1500){ //とりあえず1500文字以下のみ出力
  echo $body_full;
}
else{
  echo "body_full is over 1500 chars.\n";
}

と変更した。

4、上記を起動するコマンドメールアカウントを作成する

サーバーにPostfixが稼働しているという前提で、/etc/aliasesに1行登録するだけ。

/etc/aliases

mail-to-line-talk: "| /usr/local/bin/php /home/hogeuser/mail-to-line-talk/maildecode.php | /usr/local/bin/python3.8 /home/hogeuser/mail-to-line-talk/sendmessage.py"

とし、

sudo newaliases

として更新。これまで書いたものが正しければ、

mail-to-line-talk@example1155.jp

↑(あくまで仮)にメールを送れば、自分のLINEトーク画面にそのメール内容が通知されるはず。

5、Gmail側でフィルタを作成し、mail-to-line-talkに転送

最後に、PCでGmailの設定画面を開いて、「フィルタとブロック中のアドレス」を開き、「新しいフィルタを作成」する。

To」には自分のGmailアドレス(例:hogeuser111222@gmail.com)を指定し、自分を明示的に宛先としてきたメールに限定、とし、

含む」に、たとえば「from:*@docomo.ne.jp」などとすると、docomo.ne.jpのアドレスの人からのメールなら、という条件が作成できる。

「続行」とし、リアクション一覧が出るので、「特定のメールアドレスに転送」を選択して、4、で作成した(例)mail-to-line-talk@example1155.jpを新規指定すれば、この条件に合致したメールは自分のサーバのコマンドメールアカウントに転送され、LINE Messaging APIが発火しトークで受け取れるようになる。

※本記事は当サイト管理人の個人的な備忘録です。本記事の参照又は付随ソースコード利用後にいかなる損害が発生しても当サイト及び管理人は一切責任を負いません。
※本記事内容の無断転載を禁じます。
【WEBMASTER/管理人】
自営業プログラマーです。お仕事ください!
ご連絡は以下アドレスまでお願いします★

☆ServerNote.NETショッピング↓
ShoppingNote / Amazon.co.jp
☆お仲間ブログ↓
一人社長の不動産業務日誌
【キーワード検索】