前回、ソフトウェアmotionを使って、何か動きがあると自動的に写真を撮影するシステムを作りました。変化があった映像を静止画として記録する目的だったので、1秒間に2枚しか撮影しない設定にしていますが、それでも数日でフォルダが大量の画像で埋め尽くされてしまいます。
そこでフォルダにある画像をメールで送信し、送った画像は削除するPythonプログラムを作成したので、今日はそれを紹介します。このプログラムを定期的に実行することで、動きがあるとメールでの通知が来ますし、フォルダが写真でいっぱいになってしまうということもなくなります。
プログラムの紹介
作成したプログラムはこちらです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
import smtplib, ssl from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.image import MIMEImage import io import os import re import sys import base64 import datetime from PIL import Image from glob import glob def sendmail_multifiles(filenames): # send from account = "XXXXX@ABC.com" password = "########" # send to to_email = "YYYYY@XYZ.com" from_email = " XXXXX@ABC.com " # e-mail header subject = "webcam:" + str(datetime.datetime.now()) message = "" msg = MIMEMultipart("related") msg['Subject'] = subject msg["To"] = to_email msg["From"] = from_email msg.add_header('Content-Type','text/html') # open image files and attach them to the e-mail for filename in filenames: with open(filename, 'rb') as fp: f = os.path.basename(filename) img = MIMEImage(fp.read()) img.add_header('Content-ID', '<{}>'.format(filename)) img.add_header('Content-Disposition', 'inline', filename=f) msg.attach(img) server = smtplib.SMTP_SSL("smtp.gmail.com", 465, context=ssl.create_default_context()) server.login(account, password) server.send_message(msg) server.quit() def main(): dir = r"/var/motion/" # check image files in the directory filenames = [] for filename in glob(dir + '*.*'): f = os.path.basename(filename) if re.search(r'jpg|jpeg|png', f): filenames.append(filename) # send a mail with image files if filenames: sendmail_multifiles(filenames) # remove image files for f in filenames: os.remove(f) if __name__ == "__main__": main() |
ソースコードのダウンロードはこちらからどうぞ。
プログラムの説明
簡単にプログラムの中身を説明します。
全体の構造としては、sendmail_multifiles関数とmain関数の2つからなっています。main関数で画像を保存しているフォルダ(/va/motion)に画像があるかどうかをチェックし、画像があった場合はsendmail_multifuiles関数を呼び出して、メールで送信しています。そしてメール送信後、ファイルを削除するという流れです。
まずsendmail_multifiles関数ですが、最初に送信元のアカウント情報(アカウント名とパスワード)と送り先のメールアドレスなどを設定します。参考にされる方はご自身のアカウントに合わせて書き換えてください。
|
15 16 17 18 19 20 21 22 23 |
def sendmail_multifiles(filenames): # send from account = "XXXXX@ABC.com" password = "########" # send to to_email = "YYYYY@XYZ.com" from_email = " XXXXX@ABC.com " |
その後、メールのヘッダーを作成しています。
|
25 26 27 28 29 30 31 32 |
# e-mail header subject = "webcam:" + str(datetime.datetime.now()) message = "" msg = MIMEMultipart("related") msg['Subject'] = subject msg["To"] = to_email msg["From"] = from_email msg.add_header('Content-Type','text/html') |
さらに以下のルーチンで画像をメールに添付しています。
|
34 35 36 37 38 39 40 41 |
# open image files and attach them to the e-mail for filename in filenames: with open(filename, 'rb') as fp: f = os.path.basename(filename) img = MIMEImage(fp.read()) img.add_header('Content-ID', '<{}>'.format(filename)) img.add_header('Content-Disposition', 'inline', filename=f) msg.attach(img) |
最後にメールを送信する処理を行っています。
|
43 44 45 46 |
server = smtplib.SMTP_SSL("smtp.gmail.com", 465, context=ssl.create_default_context()) server.login(account, password) server.send_message(msg) server.quit() |
つぎにmain関数ですが、globモジュールのglob関数を使用してフォルダにあるファイルを全てリストアップし、その中から拡張子がjpg、jpeg、pngのファイルを正規表現を使って見つけ出しています。
そして画像ファイルがあった場合は、ファイルのリストをsendmail_multifiles関数に渡しています。
最後にリストにあるファイルをosモジュールのremove関数で削除しています。
|
49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
def main(): dir = r"/var/motion/" # check image files in the directory filenames = [] for filename in glob(dir + '*.*'): f = os.path.basename(filename) if re.search(r'jpg|jpeg|png', f): filenames.append(filename) # send a mail with image files if filenames: sendmail_multifiles(filenames) # remove image files for f in filenames: os.remove(f) |
さいごに
以上、簡単なプログラムの説明でした。私はcron(Linux系OSでスクリプトを定期実行する機能)を使ってこのPythonプログラムを10分おきに定期実行しています。cronについては今回説明を割愛させてもらいますが簡単に導入できます。cronについては以下のサイトが参考になると思います。
https://algorithm.joho.info/raspberry-pi/cron-python/
今日紹介したプログラムを定期的に実行することで、フォルダ内に画像が溜まり過ぎるという問題が解決できました。