Outlookのメール(.msg / .eml)をフォルダに保存したはいいけど、本文を1通ずつ開いてコピーするのは地獄…😇
この記事では、フォルダ内の複数メール本文を一括でまとめて抽出→1つのテキストに結合→コピーできる方法を、コマンド中心でわかりやすく紹介します💡📌
「メールをまとめて抽出できたら、次は“探せる状態”にすると仕事が爆速です🚀」
以下を PowerShell に貼り付けて実行します🔧
($folder と $out だけ自分の環境に合わせてOKです✅)
# ===== 設定(ここだけ変更OK)=====
$folder = "C:\MailExport" # .msgが入ってるフォルダ
$out = "C:\MailExport\all_mail_bodies.txt"
# ===== 処理 =====
$ol = New-Object -ComObject Outlook.Application
$session = $ol.Session
# 出力ファイルを初期化(UTF-8)
"" | Out-File -FilePath $out -Encoding utf8
Get-ChildItem -Path $folder -Filter *.msg -File | Sort-Object Name | ForEach-Object {
$path = $_.FullName
# .msgを開く
$item = $session.OpenSharedItem($path)
# 仕切り+メタ情報+本文(プレーンテキスト)
@(
"============================================================"
"FILE: $($_.Name)"
"SUBJECT: $($item.Subject)"
"FROM: $($item.SenderName)"
"RECEIVED: $($item.ReceivedTime)"
"------------------------------------------------------------"
$item.Body
""
) | Out-File -FilePath $out -Append -Encoding utf8
# 後始末
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($item) | Out-Null
}
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($session) | Out-Null
[System.Runtime.InteropServices.Marshal]::ReleaseComObject($ol) | Out-Null
Write-Host "✅ DONE -> $out"
作成された all_mail_bodies.txt を 丸ごとクリップボードへ入れます🧠📎
Get-Content "C:\MailExport\all_mail_bodies.txt" -Raw | Set-Clipboard
一部メールは Body が空で、HTMLBody だけに入っている場合があります😵
その場合は本文部分を $item.HTMLBody に差し替えればOKです✅
$item.HTMLBodyimport os
from email import policy
from email.parser import BytesParser
folder = r"C:\MailExport"
out = r"C:\MailExport\all_mail_bodies.txt"
def get_body(msg):
# text/plain優先、なければtext/html
if msg.is_multipart():
for part in msg.walk():
if part.get_content_type() == "text/plain":
return part.get_content()
for part in msg.walk():
if part.get_content_type() == "text/html":
return part.get_content()
return ""
return msg.get_content()
with open(out, "w", encoding="utf-8") as wf:
for name in sorted(os.listdir(folder)):
if not name.lower().endswith(".eml"):
continue
path = os.path.join(folder, name)
with open(path, "rb") as f:
msg = BytesParser(policy=policy.default).parse(f)
wf.write("="*60 + "\n")
wf.write(f"FILE: {name}\n")
wf.write(f"SUBJECT: {msg.get('subject','')}\n")
wf.write(f"FROM: {msg.get('from','')}\n")
wf.write(f"DATE: {msg.get('date','')}\n")
wf.write("-"*60 + "\n")
wf.write(get_body(msg) or "")
wf.write("\n\n")
print("✅ DONE ->", out)
.eml にしてPythonで処理するのも手💡🐍Body が空(.msgで起きがち)📄❌.msg は HTMLBody を使う✅.eml 化してPythonで抽出する✅✅ .msgなら、本文を1ファイルに出力したあとに
🧷 Get-Content -Raw | Set-Clipboard で一発コピーできます💡
✅ 可能です🧩
ただし添付抽出は .msg と .eml で方法が変わり、処理も少し長くなるため、本文抽出ができた後に拡張するのが安全です🔧✨
✅ できます🙆♂️
結合ではなく「1通=1txt」に出すように変更可能です。運用ルール(監査・引き継ぎ・案件別など)に合わせると後で爆速になります🚀
✅ .eml はエンコードが混在しやすいので、Pythonで policy=policy.default を使うのが基本的に安定です🐍✨.msg は Outlook 側が扱うので比較的文字化けしにくい傾向です📮
✅ 出力先フォルダの権限・共有設定・バックアップ先を確認すれば安全性が上がります🔐
機密情報が含まれる場合は、暗号化やアクセス制限も検討すると安心です✅✨
イラスト1枚から、テクスチャ付…