特定の件名のメールを受信したらLINE通知するpythonスクリプト
IMAPメールの受信ボックスの未読メールから特定の件名&送信元のメールを取得→LINE通知→既読にするPythonスクリプトです。
前回書いたものはGASを使ってGmailのみ対応でしたが、こちらはIMAPメールなら何でも大丈夫です。
サンプルではBoothの購入とskebリクエストが入ったら通知します。
自鯖があればLinuxならCronで定期実行してあげます。
24時間動いているPCがないといけないので、AWSのLambdaを使って無料枠で実行したりも良いかもです。(無料枠だと実行間隔に注意かも)
requests
ライブラリが入っていない場合はインストールしておきます。
pip install requests
mail.py(LINE Notefyバージョン)
import imaplib import email from email.header import decode_header import requests # IMAPサーバー設定 imap_host = 'メールサーバー' imap_user = 'メールアドレス' imap_pass = 'メールパスワード' # LINE Notify設定 line_access_token = 'アクセストークン' def send_line_notify(access_token, message): url = 'https://notify-api.line.me/api/notify' headers = { 'Authorization': 'Bearer ' + access_token } data = { 'message': message } response = requests.post(url, headers=headers, data=data) print(response.text) mail = imaplib.IMAP4_SSL(imap_host) mail.login(imap_user, imap_pass) mail.select('inbox') type, data = mail.search(None, 'UNSEEN') mail_ids = data[0] if mail_ids: id_list = mail_ids.split() for num in id_list: typ, data = mail.fetch(num, '(RFC822)') raw_email = data[0][1] raw_email_string = raw_email.decode('utf-8') email_message = email.message_from_string(raw_email_string) subject = decode_header(email_message['subject'])[0][0] if isinstance(subject, bytes): subject = subject.decode() from_email = email_message['from'] if '@skeb.jp' in from_email and 'リクエストが届きました' in subject: send_line_notify(line_access_token, '✨skebリクエストが届きました') elif '@booth.pm' in from_email and '商品が購入されました' in subject: send_line_notify(line_access_token, '✅BOOTHに注文が入りました') # メールを既読に mail.store(num, '+FLAGS', '\Seen') mail.logout()
mail.py(LINE Messaging APIバージョン)
import imaplib import email from email.header import decode_header import requests # IMAPサーバー設定 imap_host = 'メールサーバー' imap_user = 'メールアドレス' imap_pass = 'メールパスワード' # LINE Notify設定 line_user_id = 'Line Messaging APIのID' line_access_token = 'アクセストークン' def send_line_notify(user_id, access_token, message): url = 'https://api.line.me/v2/bot/message/push' headers = { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + access_token } data = { 'to': user_id, 'messages': [{'type': 'text', 'text': message}] } response = requests.post(url, headers=headers, json=data) print(response.text) mail = imaplib.IMAP4_SSL(imap_host) mail.login(imap_user, imap_pass) mail.select('inbox') type, data = mail.search(None, 'UNSEEN') mail_ids = data[0] if mail_ids: id_list = mail_ids.split() for num in id_list: typ, data = mail.fetch(num, '(RFC822)') raw_email = data[0][1] raw_email_string = raw_email.decode('utf-8') email_message = email.message_from_string(raw_email_string) subject = decode_header(email_message['subject'])[0][0] if isinstance(subject, bytes): subject = subject.decode() from_email = email_message['from'] if '@skeb.jp' in from_email and 'リクエストが届きました' in subject: send_line_notify(line_user_id, line_access_token, '✨skebリクエストが届きました') elif '@booth.pm' in from_email and '商品が購入されました' in subject: send_line_notify(line_user_id, line_access_token, '✅BOOTHに注文が入りました') # メールを既読に mail.store(num, '+FLAGS', '\Seen') mail.logout()