特定の件名のメールを受信したら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()

Python,BOOTH,Skeb,LINE通知