今回は受信したメールを読み込むプログラムを作成します。
前回はメールを受信したタイミングで実行されるイベントドリブン型のプログラムを作成しました。
【Python】メール受信をトリガーとして【さくらVPS】サーバー上の Python プログラムをスタートしたい
受信したメールを読み込むプログラムの設計
受信したメールを読み込むプログラムは以下のような動作をします。
メールはAの1通だけでなく、今までのメールがすべてあることとします。
つまりメールを受信したらその最新のメールだけを読み込むプログラムです。
ということは
- メールボックスの形式を Maildir にする
- Maildir ディレクトリ配下にあるメールの中で最新のものを読み込む
これだけで目的は達成されそうです。
os.path ライブラリ(ファイルの作成日・更新日を取得するライブラリ)
Python は必要なライブラリがあっさりと見つかってしまうのが嬉しいですね。
os.path.getatime(‘ファイルのパス’)
最後にアクセスした時刻を UNIX タイム(UNIX 時間)で表示します。
ファイルが存在しない、あるいはアクセスできなかった場合はエラーになります。
ファイルの情報が欲しいので「ファイルのパス」を引数に取ります。
os.path.getmtime(‘ファイルのパス’)
ファイルを最後に更新した時刻を UNIX タイム(UNIX 時間)で表示します。
ファイルが存在しない、あるいはアクセスできなかった場合はエラーになります。
ファイルの情報が欲しいので「ファイルのパス」を引数に取ります。
os.path.getctime(‘ファイルのパス’)
システムの作成時刻を UNIX タイム(UNIX 時間)で表示します。
ファイルが存在しない、あるいはアクセスできなかった場合はエラーになります。
ファイルの情報が欲しいので「ファイルのパス」を引数に取ります。
UNIX タイム(UNIX 時間)とは?
UNIX タイムとは、UNIX エポック(協定世界時(UTC)の1970年1月1日(午前0時0分0秒))からの経過秒数のことを言います。
os.path 作成時刻でソートする
■古いものが一番最初の要素に来る
mails.sort(key=os.path.getctime, reverse=False)
■最新のものが一番最初の要素に来る
mails.sort(key=os.path.getctime, reverse=True)
プログラム例
- Maildirのパス ← /home/test/Maildir/new
/etc/aliases ファイル
[test@SAKURA_VPS scraping]$ cat /etc/aliases
~ 省略 ~
test: \test,:include: /home/test/pyenv/scraping/aliases
|
個別 aliases ファイル
[test@SAKURA_VPS scraping]$ pwd
/home/test/pyenv/scraping
[test@SAKURA_VPS scraping]$ cat aliases
“| /home/test/pyenv/scraping/mailget.sh”
[test@SAKURA_VPS scraping]$
|
mailget.sh スクリプト
#!/bin/sh
# 仮想環境に移行する
source /home/test/pyenv/bin/activate
# Pythonプログラムを実行する
python /home/test/pyenv/scraping/mailget_timestamp.py
|
mailget_timestamp.py プログラム
# -*- coding: utf-8 -*-
from datetime import datetime
import os,os.path
# メールの中身
mail_content = “”
# ソート後のメールのリスト
new_mails = []
# 受信したメールの内容を取得する
# ディレクトリを移動する
os.chdir(“/home/test/Maildir/new”)
# メール一覧を取得してmailsに格納する
mails = os.listdir(“.”)
# リストの中身
print(mails)
# 作成日付でソートする
mails.sort(key=os.path.getctime, reverse=True)
for mail in mails:
print(mail)
# ソート後のリストの中身を new_mails リストに格納する
new_mails.append(mail)
# ソート後のリストの中身
print(new_mails)
# 一番最初の要素を取得する
newest_yoso = new_mails[0]
print(‘newest_yoso content’)
print(newest_yoso)
# メールを読み込みモードでオープンする
mf = open(‘/home/test/Maildir/new/’ + newest_yoso, ‘r’)
# readですべて読み込みwordsに格納する
words = mf.read()
# ファイルの中身を表示する
print(words)
# ファイルを閉じる
mf.close()
# 動作確認用のため現在時刻を取得して時刻のファイルを作成する
# 現在時刻を取得する
current_time = datetime.now().strftime(“%Y-%m-%d_%H-%M-%S”)
print(current_time)
# ファイルを作成する
f = open(‘/tmp/’ + current_time, ‘w’)
f.write(words)
f.close()
|
プログラム実行結果
プログラムを実行すると /tmp ディレクトリに下図のようなファイルが作成され、メールの内容が確認できます。
(pyenv) [test@SAKURA_VPS scraping]$ cd /tmp/
(pyenv) [test@SAKURA_VPS tmp]$ cat 2017-12-16_14-33-58
Return-Path: <xxxx@gmail.com>
X-Original-To: test@prog.xxxx.com
Delivered-To: test@prog.xxxx.com
Received: from mail-qk0-f182.google.com (mail-qk0-f182.google.com [209.85.220.182])
by xxxxxx.vs.sakura.ne.jp (Postfix) with ESMTP id D91071E7295A
for <test@prog.xxxx.com>; Sat, 16 Dec 2017 14:33:57 +0900 (JST)
Received: by mail-qk0-f182.google.com with SMTP id a193so4155545qkc.9
for <test@prog.xxxx.com>; Fri, 15 Dec 2017 21:33:57 -0800 (PST)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=gmail.com; s=20161025;
h=mime-version:from:date:message-id:subject:to;
bh=AvNABamxVj3n9d6oTcjqabFiHGmfVHhYzaF7Y0G13X8=;
b=vdoEYmwn7HiyXmH9Nm7xR+ftYUm50M8AvfdwxcQ2gm7gsqNBMuVkur76hitAgUK20O
/D63LljZRSDcZYjKkbV8Se0F9wBOOQRpo9j3cnTZDXJcn+1hpz8EdHp8rsJFrOsXbl72
6AJQ1inZyYwYXSlWxHV+IAzBKmgQ669jb8xVwo6TtC98pGJ99K+Io/BebKrDtM73EZ60
q6MRNvvR+zqUXhaiP1VY2Xn7qmJumoAFA8cDVvg2eobUYhOqGqlNu4L+iFMNl7+g/xp/
RB0qqzt63xe5W0JfiiItpMs+sphdHZTR2grH6tBobHUgerb6/8DsUkFzdcypv2QEIb/w
/0rA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
d=1e100.net; s=20161025;
h=x-gm-message-state:mime-version:from:date:message-id:subject:to;
bh=AvNABamxVj3n9d6oTcjqabFiHGmfVHhYzaF7Y0G13X8=;
b=CtyVMJkcPxGowGMelUKIZzDWCU2EPkResN/RUSHnZpcPuC2LjuCty3EKkYtNwe3x0e
4jpXGx6RluVH987wK/qVER/2TT66sEy8lgBSuMG7PELmL83yVTbuQXOr1artjSbgez4G
P+Dc4XvLdvKDcipSXDMimo+ava/1Ffvq30oxqnORcNofCNaGCehGEuxI3uGjb6ukwY1H
dBoSdYQqX9Vy3oqa38TuHU1cz05G6HV9jwM9Klvbc+Pil/mLNb+5gDMTICB/M9qc5Kck
W5vhkkk7LYKF60ZSavYh5qTefMfulcwjhdnxObFl1XNeuZYEMW3VZdOx79UO+lwD+gAY
XGNw==
X-Gm-Message-State: AKGB3mIqUkxuPlUfl/wHhGOrQXY4bITf6Te8KAN+ySmTKhk7Oc7frNTW
etI2zo0oYOBX8Spec59sCZhPGm5Lw/S5G5GxQjQ=
X-Google-Smtp-Source: ACJfBotcOSUrKKYe3V6b21mLuq2nemGqqx0gWbnpce8bTXiLn+8DLBDpoUvK+eZ2K5VZBELmV45Z87AqjRBNuznsOz0=
X-Received: by 10.55.136.129 with SMTP id k123mr23194788qkd.341.1513402436340;
Fri, 15 Dec 2017 21:33:56 -0800 (PST)
MIME-Version: 1.0
Received: by 10.140.101.137 with HTTP; Fri, 15 Dec 2017 21:33:55 -0800 (PST)
Received: by 10.140.101.137 with HTTP; Fri, 15 Dec 2017 21:33:55 -0800 (PST)
From: <xxxx@gmail.com>
Date: Sat, 16 Dec 2017 14:33:55 +0900
Message-ID: <CAOw3vJSe1LqKykO92QCf0BWHZR2DycNpyxiec7C_SPHsuA8PpA@mail.gmail.com>
Subject: http://yahoo.co.jp
To: test@prog.xxxx.com
Content-Type: multipart/alternative; boundary=”94eb2c0727309edc2805606e7603″
–94eb2c0727309edc2805606e7603
Content-Type: text/plain; charset=”UTF-8″
–94eb2c0727309edc2805606e7603
Content-Type: text/html; charset=”UTF-8″
<div dir=”auto”>
–94eb2c0727309edc2805606e7603–
(pyenv) [test@SAKURA_VPS tmp]$
|
参考にしたサイト
Python 3.6.3 ライブラリドキュメント
os.pathライブラリ
https://docs.python.jp/3/library/os.path.html
Pythonでファイルを更新時刻でソート・リネーム
http://pc.atsuhiro-me.net/entry/2013/12/03/193721
コメント