maildir_create_from_csv.py(Maildir 一括作成)

maildir_create_from_csv.py は、Postfix + Dovecot のメール環境で使用する Maildir を CSV から一括作成するスクリプトです。

create_students.py と同じ CSV を使用できるため、 訓練枠アカウント方式 に完全対応しています。

本スクリプトは、本サイト管理者と AI(Microsoft Copilot)との共同制作教材として作成されました。

maildir_create_from_csv.zip をダウンロード

最終更新:

【更新情報】: Maildir が既に存在する場合でも 所有者・パーミッションを自動修正する改善版 に更新しました。

【更新情報】: Linux(Mint / Ubuntu)環境で必要となる python3-tk のインストール手順を追記。

目次

1. このスクリプトが必要になる場面

  • メール環境(Postfix + Dovecot)を再構築したいとき
  • Maildir が壊れた・消えたユーザーを復旧したいとき
  • create_students.py を実行したが Maildir が作成されなかったとき
  • 訓練枠アカウント方式で、毎期のメール環境を整えたいとき

2. CSV の形式(create_students.py と共通)

以下の CSV をそのまま使用できます。

folder,username,password
pc01,pc01,pc01
pc02,pc02,pc02
pc03,pc03,pc03
                

Maildir 作成に使用するのは username のみですが、 CSV を統一することで運用がシンプルになります。

Linux(Mint / Ubuntu)をご利用の方へ

Linux では Python の GUI ライブラリ tkinter が標準で含まれていません。
そのため、maildir_create_from_csv.py を実行する前に以下をインストールしてください。

sudo apt install python3-tk

未インストールの場合、実行時に次のエラーが表示されます:

ModuleNotFoundError: No module named 'tkinter'

3. 実行方法(GUI で CSV を選択)

create_students.py と同様、 sudo で実行すると CSV 選択ダイアログが開く 仕組みです。

1. 実行権限を付ける

sudo chmod +x /usr/local/bin/maildir_create_from_csv.py

2. スクリプトを実行する

sudo maildir_create_from_csv.py

実行すると、CSV を選択する画面が表示されます。

ステップ 1:最初の画面(ホーム)

CSV選択画面(ホーム)

ステップ 2:右上の上向き矢印でフォルダを上がる

CSV選択画面(ルート)

ステップ 3:media → ユーザー名 → USB メモリ名

CSV選択画面(USBメモリ)

CSV を選択すると、Maildir が存在しないユーザーだけ自動作成されます。

4. コード全文(著作権表記入り)

→ maildir_create_from_csv.zip をダウンロード

コード全文を表示
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Created by Inajin (InaPC Linux Lab)
# AI(Microsoft Copilot)との共同制作教材
#
# Copyright (c) 2026
# 本スクリプトは教育目的での利用・改変を自由に行えます。
# ただし、著作権表記は削除せず残してください。
#

import csv
import os
import subprocess
import sys
from tkinter import Tk, filedialog
from datetime import datetime

DOCUMENT_ROOT = "/var/www/html"
LOG_FILE = "/var/log/maildir_create.log"


def log(message):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    with open(LOG_FILE, "a") as f:
        f.write(f"[{timestamp}] {message}\n")
    print(message)


def select_csv_file():
    root = Tk()
    root.withdraw()
    file_path = filedialog.askopenfilename(
        title="Maildir を作成する CSV を選択してください",
        filetypes=[("CSV Files", "*.csv")]
    )
    return file_path


def fix_permissions(user, maildir):
    subprocess.run(["chown", "-R", f"{user}:ftpuser", maildir])
    subprocess.run(["chmod", "-R", "775", maildir])
    log(f"[FIX] {user}: 既存 Maildir の所有者と権限を修正しました")


def create_maildir(user, folder):
    home = f"{DOCUMENT_ROOT}/{folder}"
    maildir = f"{home}/Maildir"

    # Maildir が既に存在する場合 → 所有者・権限を修正して終了
    if os.path.exists(maildir):
        fix_permissions(user, maildir)
        return

    # Maildir とサブフォルダを作成
    commands = [
        f"sudo -u {user} maildirmake.dovecot {maildir}",
        f"sudo -u {user} maildirmake.dovecot {maildir}/.Drafts",
        f"sudo -u {user} maildirmake.dovecot {maildir}/.Sent",
        f"sudo -u {user} maildirmake.dovecot {maildir}/.Trash",
    ]

    for cmd in commands:
        subprocess.run(cmd, shell=True)

    # 所有者と権限を設定
    fix_permissions(user, maildir)

    log(f"[OK] {user}: Maildir を新規作成しました")


def main():
    if os.geteuid() != 0:
        print("エラー:このスクリプトは sudo で実行する必要があります。")
        sys.exit(1)

    csv_path = select_csv_file()
    if not csv_path:
        print("キャンセルされました。処理を終了します。")
        sys.exit(0)

    log("=== Maildir 自動作成開始 ===")
    log(f"選択された CSV: {csv_path}")

    with open(csv_path, newline="", encoding="utf-8") as csvfile:
        reader = csv.reader(csvfile)
        next(reader)

        for row in reader:
            if len(row) < 3:
                continue

            folder, user, password = row
            folder = folder.strip()
            user = user.strip()

            log(f"--- {user} の Maildir 処理開始 ---")
            create_maildir(user, folder)

    log("=== 全 Maildir 作成処理完了 ===")


if __name__ == "__main__":
    main()

← 自動化スクリプト一覧に戻る

更新履歴

  • 2026年06月20日:Maildir が既存の場合でも所有者・権限を自動修正する改善版スクリプトに更新。
  • 2026年06月12日:Linux(Mint / Ubuntu)向けに python3-tk のインストール手順を追記。
  • 2026年02月18日:初版公開。