取引先から毎月がメールで送られてくる。担当者がそれを開いて、手で集計する。こうした運用は今でも珍しくありません。を用意してほしいと言っても、相手にその余裕が無いことがあります。
この場合、メールから添付を取り出すのが現実的な自動化になります。見た目は素朴ですが、手作業を減らすという意味では効果が大きい部類です。月に数時間かかっていた作業が、そのまま消えます。
ただし、人が使っている受信箱を機械が触ることになります。ここに固有の注意点があります。
受信箱を壊さない
でメールを読むとき、既定の動作では既読の印が付きます。人が使っている受信箱で勝手に既読にすると、担当者が「読んだつもりのないメールが読んだことになっている」状態になります。
読み取り専用で開く指定があるので、必ずそれを使ってください。削除や移動も同様で、取得処理が受信箱の状態を変えないのが原則です。
import imaplib
def open_readonly(host: str, user: str, password: str, folder: str = "INBOX"): """readonly=True を必ず指定する。既定では既読の印が付いてしまう。""" conn = imaplib.IMAP4_SSL(host) conn.login(user, password) status, _ = conn.select(folder, readonly=True) if status != "OK": raise RuntimeError(f"フォルダを開けない: {folder}") return conn可能なら、取得専用のメールアドレスを作って、そこへ転送してもらうのがいちばん安全です。人の受信箱を触らずに済み、転送の規則で対象を絞ることもできます。運用側の合意が要りますが、頼む価値はあります。
どのメールが対象かを厳密に決める
件名で絞るのが一般的ですが、件名は変わります。「【月次】売上データ」が、ある月から「月次売上データ」になる。担当者が変わればもっと変わります。件名だけを条件にすると、静かに何も取れなくなります。
差出人と添付の有無を組み合わせて絞り、該当が0件だったら知らせるのが現実的な形です。条件を緩めに書いておいて、複数該当したときにどれを使うかは別途決めます。
def find_target(conn, sender: str, since: str) -> list[bytes]: """差出人と日付で絞る。件名は変わりやすいので主条件にしない。""" status, data = conn.search(None, f'(FROM "{sender}" SINCE "{since}")') if status != "OK": raise RuntimeError("検索に失敗した")
ids = data[0].split() if not ids: raise RuntimeError(f"{sender} からのメールが {since} 以降に1件も無い") if len(ids) > 1: print(f"警告: {len(ids)} 件が該当。最新のものを使う") return ids届かない月がある
メール経由でいちばん多い障害は、そもそも届かないことです。相手の担当者が休んだ、送り先を間違えた、迷惑メールに振り分けられた。どれも技術的には正常なので、こちらのプログラムは何も検知しません。
対策は、来るはずの時期に来ていなければ知らせることです。毎月5営業日目までに届くはずなら、その時点で確認して、無ければ通知する。で定期的に確認するだけの単純な仕組みで足ります。
遅れて届いたぶんを後から処理できるよう、EP.07 のと同じ形にしておくと運用が楽になります。対象の月を指定して流し直せる口があれば、遅延の対応は数分で終わります。
添付が想定どおりとは限らない
添付ファイルの名前も形式も、送る側の都合で変わります。 だったものが表計算ソフトの形式になる、圧縮されてくる、複数ファイルに分かれる。取り出したあとに形式を確認する処理が必要です。
受け取ったファイルは、まずにそのまま保存してください。中身の解析は別の工程にします。こうしておけば、形式が変わったときに元のファイルを見て原因を確かめられます。
メール経由の取得は、相手の運用に完全に依存します。壊れることを前提に、壊れたら人に知らせるという作りにしておくのが唯一の現実的な対処です。次回は、取りに行かずに受け取る方式を扱います。
素朴な経路ほど、自動化したときの効果は大きくなります。毎月の手作業がまるごと消えるので、多少壊れやすくても割に合うことが多い。
受信箱を読む処理は、権限の面でも注意が要ります。メールには業務上の機密が含まれるので、取得用の認証情報が漏れたときの影響は、単なるデータ取得より大きくなります。範囲を絞れるなら必ず絞ってください。
相手の運用に依存する経路は、こちらが工夫できる範囲に限りがあります。壊れたときに人が気づける形にしておくのが、実際上いちばん効く対策になります。
メールを経路として選ぶ場面は、これからも無くならないと思います。相手を変えられないときに、こちらだけで完結できる数少ない手段だからです。
この記事の感想を教えてください
あなたの 1 クリックで、本当にこの記事は更新されます。「もっと詳しく」「続編希望」が一定数集まった記事は、 ふくふくが 実際に内容を拡充したり続編記事を公開 します。 送信したリアクションはお使いのブラウザに記録され、再カウントされません。