特定の件名のメールを受信したらLINE通知するpythonスクリプト
IMAPメールの受信ボックスの未読メールから特定の件名&送信元のメールを取得→LINE通知→既読にするPythonスクリプトです。
前回書いたものはGASを使ってGmailのみ対応でしたが、こちらはIMAPメールなら何でも大丈夫です。
サンプルではBoothの購入とskebリクエストが入ったら通知します。
自鯖があればLinuxならCronで定期実行してあげます。
24時間動いているPCがないといけないので、AWSのLambdaを使って無料枠で実行したりも良いかもです。(無料枠だと実行間隔に注意かも)
requests
ライブラリが入っていない場合はインストールしておきます。
pip install requests
mail.py(LINE Notefyバージョン)
mail.py
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バージョン)
mail.py
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()