🗂

共有フォルダ上に説明資料が格納されたらメール通知するスクリプト

に公開

このスクリプトは「共有フォルダ上の当日作成フォルダを自動検出 → コピー → 通知メール送信」を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