プログラミングやパソコン設定など備忘録

あきらちんの技術メモ

Python3

Python3でメールを受信してLINEグループへ通知

更新日:

問合せなどの共通メールを数人に転送処理しているのですが、時々しか転送されてこなくなりました。調べてみるとどうやら携帯キャリア側のなんらかのフィルタに引っかかって届かないようです。

携帯の迷惑メールフィルタの設定をいろいろ試すより何か良い方法は無いか考えていたのですが、メールを受信してLINEグループに通知できたら便利かもと思い検索。

LINE通知が簡単に出来る方法が見つかりました。

どうせならPythonでメールを受信してLINEに通知してしまえばPythonの勉強にもなったりしてスマートよね。と思いいろいろ調査してみました。

LINE通知の準備

1.パソコンから LINE にログインして、アクセストークンを取得する

LINEログイン

※アカウント情報はLINEアプリの「設定>アカウント」から確認できます。それからログイン許可もチェックします。

「トークンを発行する」をクリックし、トークン名とトークルームを選択して「発行する」をクリックします。

次に表示される画面で発行されたトークンをメモ帳などで大事に保存しておきます。

2.LINEグループに、LINE Notify を招待する

LINEアプリでトークン発行時に選択したグループに、LINE Notify を招待します。

これでLINE通知の準備はOKです。

3.試しにメッセージを送ってみる

コマンドプロンプトを開き下記のコマンドを入力します。

※[access_token] 部分に発行したトークンを入力してください。

※foobar がメッセージとしてLINEに表示されます。

<参考>「コマンドラインから LINE にメッセージを送れる LINE Notify」

 

Python で新着メールを受信してデータベース保存とLINE通知する

1.動作環境

  • Windows10(64ビット)
  • VScode 1.25.1 ※デバッグに便利です
  • Python 3.6.6
  • chardet ※python im pip install chardet でコマンドプロンプトからインストール

2.ソースコード

検索していたらほぼそのまま利用できる記事を見つけましたので動作確認しながら改良しました。

<参考>Python の標準ライブラリで新着メールだけを受信してDBに保存する

改良点

  1. LINE 通知処理の追加
  2. メール本文が取得できない(multipartの階層や文字コードの問題)対応
  3. 文字コードの取得処理
  4. データの削除処理の追加

 

LINE 通知処理の追加

「ここにトークンを入れる」に発行してコマンドラインで確認できたトークンを置き換えます。

 

メール本文が取得できない(multipartの階層や文字コードの問題)対応

mulutipartの階層になっている場合に文字コードや本文が取得できない事があったため参考にさせていただいたコードを改良しました。

さらに階層が増えることもあるようですが、私の環境では10数通上手く処理できておりますのでしばらくは様子見です。

文字コードが取得出来ない状況を考えて get_jp_encoding_name を呼び出す様にしてます。

また、本文に機種依存文字(株)とか○付き数字とかがあるとdecodeに失敗するので pl2.decode(charset, 'ignore')「'ignore'」を加えました。これで機種依存が無視されてdecodeされます。

 

文字コードの取得処理

メール本文から文字コードを返してくれるので chardet はテキストファイルの読み込み時に利用されることが多い様です。

 

データの削除処理の追加

30日過ぎたらデータを削除するものですが、別ファイルにして1日1回の実行でスケジュールを組んだ方が良いですね

 

スケジュール実行の設定

Windowsのタスクスケジューラに登録するのですが、コード中の print コマンドをログファイルに保存したいので、バッチファイルを作成します。

MailToLINE.py の保存してあるフォルダにカレントディレクトリを移動してから実行します。

ログは>>を2つ付ける事で追加書き込みしてくれます。>1つだと常に上書きされてしまうので注意です。※存在しない場合は自動で新規作成してくれます。

 

1.タスクスケジューラの起動

Windowsキー>Windows管理ツール>タスクスケジューラの順に起動します。

右側の操作から基本タスクの作成をクリックします。

名前を入力して「次へ」ボタンをクリックします。

1回限りにチェックし「次へ」ボタンをクリックします。

開始日と時間を設定し「次へ」ボタンをクリックします。

プログラムの開始にチェックして「次へ」ボタンをクリックします。

参照ボタンをクリックして、MailToLINE.bat を選択して「次へ」ボタンをクリックします。

完了をクリックしたときに・・・にチェックを付けて「完了」ボタンをクリックします。

ユーザがログオンしているかどうかにかかわらず実行するをチェックします。

トリガーで編集ボタンをクリックします。

繰り返し間隔にチェックを付けて1時間にします。また、継続時間を無制限にして「OK」ボタンをクリックします。

MailToLINEのプロパティ画面で「OK」ボタンをクリックします。

 

タスクスケジューラの左、タスクスケジューラライブラリをクリックして、中央に登録したタスクが登録されているか確認します。

 

これで1時間毎にメールを受信して新規メールがあった場合にLINEグループにメッセージが送られます。

15分間隔でも良いかもしれません。

 

最後に

文字コードの問題、削除処理の分割やLINEへのメッセージは1000文字までの制限がありますので超えた場合にどう処理するかなど、まだまだ改良の余地があります。

メールのタイトルに合わせて通知グループを振り分けるとか、別の処理を起動するとかいろいろ応用もできそうです。

まだ10数通のメールでしか確認がとれていないため何か問題が発生するかもしれません。

参考にして頂く場合は自己責任でよろしくお願いします。

基本的にメールソフトを利用して受信する様にしており、メールの転送も行った上でのあくまでも補助的な利用が目的で利用しておりますのであしからず。

 

先日、深夜2時1分に送られてきたメールが深夜3時にLINE通知されました。1時間間隔だとこういうことあるよねぇ。。。

スポンサードリンク

スポンサードリンク

-Python3
-, ,

Copyright© あきらちんの技術メモ , 2020 All Rights Reserved Powered by STINGER.