OutlookクラシックのメールをPDF/JPGでワンクリック保存するようにした
OutlookのメールをPDFで残すことがある。
やること自体は難しくない。
メールを開いて、印刷を選んで、Microsoft Print to PDFを選んで、保存先を決める。
それだけ。
でも、何度もやっていると地味に面倒
「ボタン一つで保存できたら楽なのに😫」
とは思っていた。
ただ、自分でVBAを書いて仕組みにできるわけではない。
なので、しばらくは「まあ、面倒だけど仕方ないか」で済ませていた。
そんな話を人としていると、どうやら同じところを面倒に感じている人がいる。
そこで少し考えました。
私には、これを一から実装する力はないがチャッピーにはある。
正確には、私がやりたいことを伝えて、途中で確認しながらなら、形にしていけることをこれまでの経験で知っている。
一方で、周りを見てもチャッピー、チャッピー言っているが、ChatGPTをここまで使って、小さな作業改善まで持っていく人はまだいない。
だったら、私が一回やってみればいいか。
そんな感じで作り始めました。
欲しかったのは「PDF化」ではなく、いつもの作業を短くすること
最初に決めたのは、こんな感じ
- メールをPDFまたはJPGで保存したい
- 一覧で選択していても、別ウィンドウで開いていても使いたい
- 添付ファイルも同じ場所へ自動保存したい
- 保存先は毎回確認したい
- ただし、前回使ったフォルダを最初に表示したい
- 同名ファイルがあっても上書きしたくない
- 署名のロゴなど、本文に埋め込まれた画像は添付ファイルとして保存したくない
ファイル名はシンプルに、
YYYYMMDD_件名.pdf
JPGなら、
YYYYMMDD_件名_01.jpg
YYYYMMDD_件名_02.jpg
添付ファイルは、
YYYYMMDD_件名_元ファイル名
差出人名まで入れる案もあったんですが、件名や添付ファイル名が長いこともあるのでやめました。
これで完成したと思った
OutlookクラシックならVBAが使えます。
そこで最初に作ったのは、
Outlookメール
→ MHTMLで一時保存
→ Wordで開く
→ PDFへ出力
という方法でした。
PDFはできる。
JPGにもできる。
添付ファイルも一緒に保存できる。
ここまで動いたので、正直「もうできたな」と思っていました。
ところが、普段Outlookから印刷したものと並べてみると、妙に違う。
「あれ?」
上のヘッダーが違う。
差出人や宛先の配置も違う。
本文の幅も違う。
ページ番号まで違う。
中身そのものは同じなんだけど、見慣れたOutlookを印刷したそれじゃない。
ここでようやく、そもそもの作り方が違っていたことに気付きました。
聞くと、MHTMLとして保存したメールをWordが読み直しているので、Word側で別の文書として組み直されているとのこと。
「メールをPDFにできればいい」なら、これでも十分かもしれない。
でも、私がやりたかったのはそうじゃない。
欲しかったのは、いつもOutlookでやっている印刷と保存を、そのまま楽にすることでした。
じゃあ、Outlookに印刷させればいい
考えてみれば、欲しいのは「メールを別形式へ変換したPDF」ではありません。
欲しいのは、いつもOutlookから印刷している、あの見た目のままのPDFです。
だったら途中でWordに渡さず、Outlook自身に印刷させればいい。
Outlook VBAには MailItem.PrintOut があります。
これならOutlook本来の印刷経路を通せます。
実際に試してみると、見た目は普段の印刷と同じになった。
よし、これで解決する…
……とはいかなかった。
PrintOut には、「このプリンターへ出して、このファイル名で保存して」と細かく指定する機能がなかったのだ。
普通にMicrosoft Print to PDFへ送れば、当然「どこへ保存しますか?」という画面が出ます。
それでは、結局いままでとあまり変わらない。
「Outlook PDF Auto」という専用プリンターを作った
そこで、Microsoft Print to PDFを使った専用プリンターを一つ作ることにしました。
名前は、
Outlook PDF Auto
出力先は固定で、
%LOCALAPPDATA%\OutlookMailExport\outlook-print.pdf
にした。
このプリンターへ印刷すると、保存画面を出さずにPDFが作られます。
まずは手動で試しました。
同じメールを、普段のMicrosoft Print to PDFと Outlook PDF Auto の両方で印刷して比較。
見た目は同じ。
ここでようやく、「これならいけそう」となった瞬間だった。
印刷している間だけプリンターを切り替える
あとはVBA側で、
普段使っている既定プリンターを覚える
→ Outlook PDF Auto に切り替える
→ Outlookから印刷する
→ PDFが完成するまで待つ
→ 元のプリンターへ戻す
という流れにした。
この「元に戻す」はかなり大事です。
メール保存のために一時的にプリンターを変えたせいで、その後の普通の印刷までPDFへ飛んでいったら困る。
なので、正常に終わったときだけでなく、途中でエラーになった場合も元へ戻すようにした。
PDFの完成待ちも、単純に「3秒待つ」みたいな処理にはしない。
ファイルができたか。
サイズが0ではないか。
まだ書き込み中ではないか。
そこまで確認してから次へ進むようにした。
JPGも別ルートでは作らない
JPGだけ別の方法でメールを画像化することもできます。
でも、それをやるとまたPDFと見た目が変わる可能性がある。
さっき一度それでやり直しているので、ここはもう同じ失敗をしたくない。
JPG保存でも、まずOutlookの通常印刷からPDFを作ります。
そのPDFを1ページずつJPGへ変換します。
つまり、
PDF保存もJPG保存も、元になっているのはまったく同じOutlookの印刷結果です。
たとえば、
20261001_サンプル件名.pdf
と、
20261001_サンプル件名_01.jpg
20261001_サンプル件名_02.jpg
は、同じものを別形式で保存しただけ。
これなら見た目も揃う。
添付ファイルも、一緒に終わらせたい
メール本体を保存したあと、添付ファイルだけ別に保存するのも面倒。
なので、添付ファイルがあれば同じタイミングで保存するようにしすることは外せない。
たとえば、
20261001_サンプル件名.pdf
と一緒に、
20261001_サンプル件名_添付資料.pdf
20261001_サンプル件名_資料.xlsx
のように並びます。
最初はメール1通ごとにフォルダを作る案もあったが、そこまで分ける必要はなかったので今回は不採用。
その代わり、同じ名前のファイルが既にあれば _2、_3 と付けて、勝手に上書きしないようにしています。
もう一つ少し厄介だったのが、Outlookでは署名のロゴや本文中の画像も、内部的には添付ファイルとして扱われることがあること。
何も考えず全部保存すると、欲しくもない画像まで大量に出てくる。
そこで、本文から参照されている画像などは除外するようにした。
こういうところは、実際に使うことを考えると地味に大事なところ。
保存先は固定しない
保存先まで完全に自動化することもできます。
でも、ここは固定しませんでした。
ボタンを押すと保存先を選ぶ画面が出ます。
ただし、最初から前回使ったフォルダを表示します。
普段はそのまま決定。
別の場所へ保存したいときだけ変更する。
自分のPCだけで使うなら、決め打ちでもよかったかもしれませんが、保存先を固定しなかったのは、PCや使う人によって保存したい場所が違うからです。
でも、他のPCでも使えるようにするなら、この部分を特定のパスへ固定してしまうと扱いにくい。
なので、
保存先はその都度選べる。前回使った場所だけ覚えておく。
という形にした。
ここから、「せっかくなら他のPCでも使えるようにしたい」という話にもつながっていきました。
自分だけ使えればいい、では終わらなくなった
もともとのきっかけは、自分が楽をしたかっただけ。
ただ、同じところを面倒に感じている人がいることも分かった。
そうなると、自分のPCでしか動かないものを作って終わるのも少しもったいない。
そこで、他のPCへ持っていける形にしました。
OutlookのVBAプロジェクトを丸ごとコピーするのは避けるほうがよいといわれた。
既に別のマクロを使っているPCだと、それを壊す可能性があるからだそう。
なので、今回の機能だけを、
modMailExport.bas
として分け、これをOutlook VBAへ追加すれば使える。
専用プリンターを作る部分はPowerShellへ分離。
ここまでで一応、他のPCにも持っていける形にはなった。
ただ、チャッピーがだした最初の導入方法は、
「PowerShellを開いて、このフォルダへ移動して、このコマンドを実行してください」
いや、これを普段PowerShellを触らない人に渡すのは無理がある。
そして再出力したものでは
INSTALL.cmd
をダブルクリックするだけでプリンターの追加ができるようにしました。
今の配布セットは、
INSTALL.cmdsetup-outlook-mail-export.ps1modMailExport.basREADME.md
という構成です。
インストール用のファイルをダブルクリックして、そのあとOutlookへVBAを読み込む。
まだ普通のアプリのインストーラーほど簡単ではないけれど、「PowerShellでこのコマンドを打ってください」よりはだいぶ分かりやすくなりました。
「動いた」と「置き換えられる」は別だった
今回、一番印象に残ったのはここです。
最初に作ったMHTML → Word方式は、失敗していたわけではありません。
ちゃんと動いていました。
PDFも作れた。
JPGにもできた。
添付ファイルも保存できた。
機能だけ見れば、要求はほぼ満たしていました。
でも、普段の印刷と並べてみると違った。
そこで初めて、
「動く」ことと、「今までの作業をそのまま置き換えられる」ことは別なんだな
と気付きました。
今回はそこが気になったから、せっかく動いていたものを一度捨てて作り直しました。
結果として、最初に考えていたより少し大掛かりにはなりました。
でも今は、メールを選んで「PDF保存」か「JPG保存」を押す。
保存先を確認する。
それだけ。
添付ファイルも一緒に保存されます。
一回あたりで短縮できる時間だけ見れば、大したことはないかもしれません。
でも、
印刷を開く
→ プリンターを選ぶ
→ 保存場所を選ぶ
→ 添付ファイルも別に保存する
という小さな面倒がなくなった。
こういうものは、なくしてみると意外と大きいです。
そしてもう一つ。
私は、この仕組みを自分一人では実装できません。
VBAもWindowsの印刷APIも、最初から書けるわけではない。
それでも、「こうしたい」「これは違う」「普段の印刷と同じにしたい」とチャッピーに伝えながら、実際に動かして、比べて、直していくことはできました。
自分に実装する力がないから諦める、ではなくて、
何を楽にしたいのかを自分で分かっていれば、そこから先をAIと一緒に作れる。
今回のワンクリック保存は小さな仕組みですが、そのことを実感できたのが一番大きかったのかもしれません。
関連記事
- SL20261001_001