ともかつの日記

仕事や日常で扱った事柄について書き残していきます。「…日記」とタイトルにあるものの、日々更新ししていませんがご容赦ください。

MENU

メールの一覧を出力する

どうしてそんなことがしたいのか、詳細については触れないけれど、届いたメールの一覧を Excel(もしくは CSV)で出力できないものか、と試行錯誤してみた。

しかしながら、少し調べてみると、いろいろな課題が見つかってきた。

  • 課題1 : Thunderbird が保存しているメールの生データは、文字コードが JIS コードとなっている。
  • 課題2 : メールヘッダ内の件名(Subject:)や差出人(From:)などに全角文字が含まれている場合には、『=?ISO-2022-JP?B?…』という感じで Base64 で符号化されている。
  • 課題3 : 生データでは、件名や差出人の途中で改行している場合がある。

 これらの課題を解決しないといけないのか... ここからが、スタート。

 

[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE)

[改訂版] VBScriptポケットリファレンス (POCKET REFERENCE)

 

 

いろいろと悩んで、試行錯誤してみると...

  1. とりあえず、ターゲットとなるメールソフトは Thunderbird を中心に考えるものの、Outlook にも応用できるとありがたい。AL-mail は無視しても構わないだろう。(笑)
  2. Thunderbird のメール一覧で Ctrl+A で全選択して、右クリック「メッセージを保存(S)...」を選択して、それぞれのメールを .eml で保存する。でもって、保存した .eml を何かしらのスクリプトで処理してはどうか?
    → 保存された .eml は、上記の「課題1」「課題2」「課題3」をどれも解決していない。
    → .eml 形式を処理できるようにすれば、Thunderbird に限らず、Outlook でも利用できるかも?
  3.  スクリプトを作成するとしたら、Windows に標準インストールされているソフトウェアや、Microsoft Office ぐらいで利用できるものが望ましい。そう考えたら、PythonPerl などは候補から外れてしまう。そんな条件を満たすのは、単なるバッチファイルや VBscript ぐらいなのでは?
  4.  「課題2」を VBscript で処理できないものか調べたところ、32bit 環境であれば、http://www.hi-ho.ne.jp/babaq/basp21.html で公開されているライブラリを使えば簡単に復号できそうなんだけど、64bit 環境が当たり前になった今では使えない。
  5.  「課題3」をスクリプトで処理するには、メールヘッダの仕様を把握しなきゃならない。
  6.  Thunderbird のアドオン「Import Export Tools」を使うと、メールの一覧を CSV でエクスポートできる。
    → 「課題1」 出力された CSV文字コードUTF-8 となり、CSVExcel で開くと文字化けする。
    → 「課題2」Base64 は復号されている。
    → 「課題3」複数行に分かれていたヘッダ部は結合して、1行になっている。
  7.  前項で出力した CSV は、Windows の「メモ帳」で開き、「名前を付けて保存(A)...」で文字コードを「ANSI」に指定して保存すると、Shift-JIS になってくれる。
  8. Shift-JIS になった CSVExcel で開くと、各列には次のように保存されている。
    列 A : 件名(Subject:)
    列 B : 差出人(From:)
    列 C : 宛先(To:)
    列 D : 日付(Date:)
    列 E : ????
    列 F : メール全文
    → ざっと確認したところでは、列 E に何が保存されているのかわからなかったが、列 A ~ D が出力できれば、目的は達成できそう。
    → 列 F が残っていると、行の高さも間延びしてしまうので、列 E ~ F を削除してしまうといいのだろう。その方がスクリプトでも処理しやすい。
  9. わたしの Thunderbird のメールボックスの中にあったメールで、前項までの内容を処理した結果を確認していると、「件名」や「差出人」のデータが 70文字を超えると、途中で切れてしまう。
  10. 前項のデータが途切れる要因を調べてみたものの、Thunderbird の設定エディタで変更できる「mailnews.wraplength」の値に依存するものではなさそう。「差出人」に名前が設定されていて、長いメールアドレスだったりすると、メールアドレスの途中で途切れてしまうかもしれない。
    CSV に出力した時点で途切れてしまっているので、スクリプトでは判断しづらい。
  11. 長い「件名」「差出人」が途切れてしまう件については、問題ではあるものの、今回の用途では問題視しなくてもよいのかもしれない。 だとすれば、不要な列を削除した CSV を保存して、VBscript で処理してやれば目的は達成できるのかも?

といった感じ。実際のデータを入手して、上記の VBscript が作成できるのかを試してみるかな。