メール受信でPythonスクリプトの起動

特定のメールアドレスでメールを受信して、それをトリガーとしてPythonスクリプトを起動します。

1.ファイル「.mailfilter」を次のように設定します。

  • .mailfilterのパーミッションは「600」。
  • wakeup.pyのパーミッションは「744」。
  • コマンドやファイル名等はフルパスで記述します。
  • 「;」を用いて1行に複数シェルを記述できます。
to “| cd /home/test;/usr/local/bin/python /home/test/wakeup.py”

2.Pythonスクリプト「wakeup.py」を作成します。
Pythonスクリプト「wakeup.py」は、受け取ったメールアドレスに応答します。本文はそのまま返します。

  • 受信したメールの内容は標準入力から受け取ります。
  • メールのヘッダ部分と本文は「0xA」で区切られています。
  • 本文は、標準入力「read」関数で読み込みます。

【wakeup.py】

# /usr/local/bin/python
# coding=utf8

import sys 

from email.Header import decode_header
from email.Parser import Parser
from email.mime.text import MIMEText
import smtplib

# read Mail Header
f = open('header.txt', 'w')
while True:
    input_line1 = sys.stdin.readline()
    if len(input_line1)== 1:
        break
    f.write(input_line1)
f.close() 

# read Mail Body
body = sys.stdin.read()

msg=Parser().parse(open('header.txt'))
header_from =msg.get('From')
header_to =msg.get('To')
header_subject=msg.get('Subject').decode('iso-2022-jp')

result="From: %s, To: %s, Subject: %s"%(
 header_from,
 header_to,
 header_subject,
 )
f = open('text.txt', 'w')
f.write(msg.get('From') + '\n' + result.encode('utf-8') + '\n')
f.close() 

# 本文
mail_body = body.decode('cp932').encode('iso-2022-jp')
msg = MIMEText( mail_body , 'plain', 'iso-2022-jp')
# 件名、宛先
msg['Subject'] = 're:' + header_subject
msg['From']    = header_to
msg['To']      = header_from

# Send the message via our own SMTP server, but don't include the envelope header.
s = smtplib.SMTP()
s.connect()
s.sendmail( header_to, header_from, msg.as_string() )
s.close()

connect関数は、動作環境でメールサーバが動いていなければ、接続不可のエラーとなりmailコマンドは使えません。この場合、SMTPでサーバのアドレスとポートを指定しユーザIDとパスワードをパラメータにしてlogin関数を呼び出し、ログインします。参考:Amazon Dash ButtonでIoTボタンの作成

3.メールを送信します。
設定したメールアドレスに対して、次のようにメールを送信します。

メール送信

次のメールが受信されます。

メール受信