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:最初の画面(ホーム)
ステップ 2:右上の上向き矢印でフォルダを上がる
ステップ 3:media → ユーザー名 → 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日:初版公開。