Pythonで遊ぼう
Macを想定していますが,Windowsでも似たような感じでできます.
とりあえず必要そうなもの
tkinterはGUI作成のライブラリなので,あってもなくてもいいけど, あるとそれっぽいアプリが作れそうです. 標準ライブラリなので,たぶん入ってる.確認は以下.
python -m tkinter
次にバイナリにするためのpy2appをインストール
pip install py2app
で,ここでなんかpy2appletが見つからないとか言われたので,
echo 'export PATH="$HOME/Library/Python/2.7/bin:$PATH"' >> ~/.bash_profile
こんな感じでパスを通してあげた気がする.
あとは,作っておいたhoge.pyとかを
py2applet --make-setup hoge.py python setup.py py2app
とかすれば即興のアプリの完成です.
メールの抽出(エクセルファイルに)
import os import glob import email from email import policy from email.parser import BytesParser from openpyxl import Workbook, load_workbook from datetime import datetime # Jrecディレクトリのパス jrec_dir = r"C:\\Users\\username\\ドキュメント\\Jrec" # Excelファイルのパス excel_file = r'C:\\Users\\username\\ドキュメント\\jrecmail\\202408_jrec.xlsx' # Jrecディレクトリ内の.emlファイルを取得 eml_files = glob.glob(os.path.join(jrec_dir, '*.eml')) # Excelファイルを読み込むか新規作成 if os.path.exists(excel_file): wb = load_workbook(excel_file) else: wb = Workbook() # デフォルトのシートを削除(新規作成の場合のみ) if 'Sheet' in wb.sheetnames: del wb['Sheet'] # .emlファイルを処理 for eml_file in eml_files: with open(eml_file, 'rb') as f: msg = BytesParser(policy=policy.default).parse(f) # 日付を取得し、2024年の8月のメールのみ処理 date = msg['date'] date_obj = email.utils.parsedate_to_datetime(date) if date_obj.year == 2024 and date_obj.month == 8: sheet_name = date_obj.strftime('%m%d') # シートが存在しない場合は新規作成 if sheet_name not in wb.sheetnames: wb.create_sheet(sheet_name) ws = wb[sheet_name] # メールの本文を取得 body = msg.get_body(preferencelist=('plain')).get_content().strip() # 本文を改行で分割し、1行ずつ別々のセルに書き込む body_lines = body.split('\n') for line in body_lines: ws.append([line]) # Excelファイルに保存 wb.save(excel_file)
メール件数のカウント
from openpyxl import load_workbook from openpyxl.utils import get_column_letter from openpyxl.styles import Alignment # Excelファイルのパス excel_file = r'C:\\Users\\username\\ドキュメント\\jrecmail\\202408_jrec.xlsx' # Excelファイルを読み込む wb = load_workbook(excel_file) # Sheet1に結果を出力する sheet1 = wb['Sheet1'] # タイトルを設定 sheet1['A1'] = 'シート名' sheet1['B1'] = '[NEW]の数から1を引いた結果' # 各シートで[NEW]のカウントを行い、結果をSheet1に出力する row_index = 2 # 出力する行の開始位置 for sheet_name in wb.sheetnames: ws = wb[sheet_name] count = 0 # シート内のセルを走査して[NEW]のカウントを行う for row in ws.iter_rows(): for cell in row: if isinstance(cell.value, str) and 'NEW' in cell.value: count += cell.value.count('NEW') # [NEW]の数から1を引いた結果をSheet1に出力する sheet1[f'A{row_index}'] = sheet_name sheet1[f'B{row_index}'] = count - 1 row_index += 1 # セルのフォーマット設定 for col in range(1, 3): sheet1.column_dimensions[get_column_letter(col)].width = 20 for row in range(1, row_index): sheet1.cell(row=row, column=col).alignment = Alignment(horizontal='center') # Excelファイルを保存 wb.save(excel_file) # Excelファイルを閉じる wb.close()
