🗂
共有フォルダ上に説明資料が格納されたらメール通知するスクリプト
このスクリプトは「共有フォルダ上の当日作成フォルダを自動検出 → コピー → 通知メール送信」を20秒ごとに繰り返す仕組みです。
win32com.client により、OutlookがインストールされたWindows環境でメールを自動送信します。
previous_todaylist による差分検出で、同じフォルダが何度もコピーされるのを防ぎます。
dirs_exist_ok=True により既存フォルダを上書き可能ですが、慎重な運用が望まれます。
(必要ならバックアップ処理を追加しても良いかもしれません)。
import os
import datetime
import glob
import shutil
import schedule
import time
import win32com.client
# === 設定 ===
# コピー先(保存先)のフォルダ
TO_DIR = r'C:\Users\xxx\Desktop'
# コピー元(共有フォルダ)
FROM_BASE = r'\\192.x.y.z\●●部\説明資料'
# 通知メールの送信先
MAIL_TO = 'my_account@xxx.yyy.co.jp'
# === 日付情報を作成 ===
now = datetime.datetime.now()
# 例: "1022"(月+日)
DATE_STR = now.strftime('%m%d')
# 年・月フォルダを指定 例: "\\192.x.y.z\●●部門\説明資料\2025年\10月"
FROM_DIR = os.path.join(FROM_BASE, str(now.year) + '年', str(now.month) + '月') # rf'{FROM_BASE}\{now.year}年\{now.month}月'
# 前回のチェック結果を記録するリスト
previous_today_list = []
def send_mail(folder_list):
"""Outlookで通知メールを送信する"""
outlook = win32com.client.Dispatch("Outlook.Application")
mail = outlook.CreateItem(0)
mail.To = MAIL_TO
mail.Subject = 'DOCUMENT STORED'
mail.BodyFormat = 1
# メール本文を作成
body_text = 'STORED DOCUMENT : ' + str(folder_list)
mail.Body = body_text
mail.Send()
print('メールを送信しました:', folder_list)
def copy_folders(today_list):
"""対象フォルダをコピーする"""
copied_list = []
for src in today_list:
# コピー元フォルダからFROM_DIRの部分を取り除く
relative_path = src.replace(FROM_DIR, '')
# コピー先フォルダを作成(例: "C:\...\Desktop\1022\資料A")
dest = os.path.join(TO_DIR, DATE_STR + relative_path) # os.path.join(TODIR, f'{DATE_STR}{rel}')
# フォルダをコピー
try:
shutil.copytree(src, dest, dirs_exist_ok=True)
print('コピーしました:', dest)
copied_list.append(relative_path)
except Exception as e:
print('コピー中にエラーが発生しました:', e)
return copied_list # [src.replace(FROM_DIR, '') for src in todaylist]
def run_job():
"""フォルダの変化を確認して、必要ならコピーと通知を行う"""
global previous_today_list
# 現在のフォルダ一覧を取得
all_dirs = glob.glob(os.path.join(FROM_DIR, '*'))
# 今日の日付(例: 1022)を名前に含むフォルダを探す
today_list = []
todaylist = [d for d in all_dirs if DATE_STR in d]
# 新しいフォルダや変更があれば処理を実行
if today_list != previous_today_list:
print('新しいフォルダまたは更新を検出しました。')
copied = copy_folders(today_list)
send_mail(copied)
previous_today_list = list(today_list)
else:
print('変化はありません。')
# === スケジューリング設定 ===
# 5分ごとに run_job() を実行する
schedule.every(5).minutes.do(run_job)
print('監視を開始しました(5分ごとにチェックします)')
# 永久ループで監視を続ける
while True:
schedule.run_pending()
time.sleep(1)
Discussion