eml-minifier

Hiroshi FUKUDA

(2023.3.20-2024.6.20)

eml-minifier DownLoad from [researchmap] 

メールボックスに保存されているe-mailのサイズを,記事「MIMEとメールのダイエット」で説明されている方法縮小します。手順:

eml-minifierは,perlのスクリプトなので,perlが動く環境であれば,Windows, Mac, Linuxに依らず使えます。

詳しい手順(Windows)

Windowsで,メーラーにthunderbiradを使う場合の詳しい手順です。

準備

wsl -u root

と打って,wslを起動する。

cd /mnt/c/Users/ユーザ名/Documents

emlファイルの保存

perl eml-minifier.pl < in.eml > out.eml

と打つと(eml-minifier.plの設置場所は設置場所のパスを追加すれば何処でもよい),out.emlにbase64やquoted-printableでエンコードされたメールソースがデコードされて保存される。

その際,htmlメールであれば,plain text,htmlの不要な空白,タブ,空行,コメント,title,高さor幅が1のimg,高さor幅が0object,署名を削除し,&nbsp;のようなスペースと特殊文字はUnicode文字に置換し,タグのstyle属性をcssにまとめ,cssの参照されていないtag, id, class, 属性のスタイルを削除する。メールの種類によってはこれだけでサイズが半分以下になる場合もある。

out.emlをテキストエディタで開けば,ソースを読むことができるので,MIMEの知識があれば,ソースを編集することでさらにメールのサイズ縮小ができる。

なお,out.emlのヘッダには,次のようなContent-Description: 

Content-Description: "modified by eml-minifier 2023/5/5 22:58:52"

が追加され,eml-minifierで修正された事と,その日付が記述される。

emlファイルの縮小

eml-minifierにオプションをつけることで,emlファイルをさらに縮小できる。オプションは次のようにリダイレクト記号の前にダブルコーテーションで囲んで指定する。

perl eml-minifier.pl "オプション" < in.eml > out.eml

/正規表現/

を指定することで,カットすることができる。正規表現の一番目の小カッコのみが本文として残される。例えば

perl eml-minifier.pl "/(.*?)On/" < in.eml > out.eml

で,初めに出現する文字列On以降がカットされる。

rm inline

をつける。例

perl eml-minifier.pl "/(.*?)On/ rm inline" < in.eml > out.eml

本文の初めに出現する文字列On以降をカットし,インライン画像ファイルを全て削除する。

rm at

をつける。

perl eml-minifier.pl "/(.*?)On/ rm at" < in.eml > out.eml

本文の初めに出現する文字列On以降をカットし,添付ファイルを全て削除する。

_sample.png, _sample_1.png, _sample_2.jpg

もう一度同じオプションでeml-minifierを実行する(↑キーを押してEnter)と,インラインファイルが最も番号が小さい候補画像に置換される。たいていの場合これで効果が得られるが,もし「候補画像」を見て良いものがあれば,それより番号の小さい候補画像は削除しておく(番号のつかないファイルは削除しない)。候補画像がどれも気に入らない場合は,番号0の候補画像を自分で作成すればよい。なお,このインラインファイルの縮小機能を使うには,ImgageMagickをインストール

apt install imagemagick

しておく必要がある。また,Windowsの場合irfan viewをインストールしておけば,候補画像が増える。irfan viewは高速に画像閲覧できるので,候補画像を確認する際にも役立つ。

rm <タグ名>

例:

rm <xml>

<xml>を削除すると表示が乱れる場合もあるが,MSのメールなどでは,表示が乱れることなくサイズが大きく減るものがある。

rm url

全角のURLは短くなる。URLが効かなくなる場合もあるので,確認が必要。このオプションで,emlが1%以上削減される場合は,オプションが指定されていなくても,suggestionとして削減率が表示される。

rm script

rm link

rm title

rm html

#com

#style

#style2s

perl eml-minifier.pl "/(.*?)On/ rm at inline" < in.eml > out.eml

自分でコマンドを書く:

次のようにシングルコーテーションで囲んだオプション

perl eml-minifier.pl 'オプション' < in.eml > out.eml

に,text/htmlの本体が代入された変数$bdyの値を変えるperlの文を書くことができる。例)>または}直後の改行,color="",="..."のダブルコーテーションを削除する:

'$bdy=~s/([>}])\n/$1/g;$bdy=~s/b\w+color=""//g;$bdy=~s/="([#\w]+)"/=$1 /g'

なお,シングルコーテーションで囲んだオプションとダブルコーテーションで囲んだオプションは,順不同で,両方あってもよい。

emlファイルの確認と保存

eml-minifierの設置

毎度perlコマンドを打つのは面倒と思う場合は,PATHの通ったディレクトリにeml-minifier.plへのシンボリックリンクeml-minifierを設置

ln -s ディレクトリ/emk-minifire.pl eml-minifier

すれば

eml-minifier オプション < in.eml > out.eml

でeml-minifierを起動できる。

削減率の例

Adobeからのライセンス関連のメール:

以下のように,オプションなしで,文字デコードで8%,スペース・タブの削除で78%,合計86%削減された。

 Content-Transfer-Encoding: quoted-printable charset=utf-8

 -7kB (-8%)

 spaces and tabs

 -63kB (-78%)

商品名のないAmazonの注文確認メール(2020年):

以下のように,オプションなしで,文字デコードで15%,styleのcss化で3%,区切り文字等の削減で8%,cssの削減で13%,プレーンテキスト削除で8%,合計49%削減された。

Content-Type: text/html; ascii

 (-15%) Content-Transfer-Encoding: quoted-printable utf-8

 ( -3%) 28 styles -> 8 s attribute

 ( -8%) clean 1 parts of body, separated by <pre>

 (-13%) clean tags, scripts, comments, styles(66 unused)

 ( -8%) Content-Type: text/plain

2021年のGoogle Formの控えメール:

以下のように,オプションなしで,文字デコードで25%,スペース・タブの削除で3%,合計28%削減された。

Content-Transfer-Encoding: quoted-printable charset=utf-8

 -12kB (-15%)

Content-Type: text/plain;

 -5kB (-8%)

 spaces and tabs

 -7kB (-8%)

2021年のDisney+の契約内容の確認メール:

以下のように,オプションなしで,文字デコードで19%,プレーンテキスト削除で15%,Unicodeスペースへの置換で1%,半角スペース・タブ・空行の削除で12%,合計51%削減された。

Content-Transfer-Encoding: base64 charset=utf-8

 -13kB (-19%)

Content-Type: text/plain;

 -9kB (-15%)

 spaces by Unicode

 -1kB (-1%)

 spaces, tabs and empty lines

 -8kB (-12%)

2022年のPayPalの領収書メール:

以下のように,オプションなしで,文字デコードで14%,styleのclass化で2%,半角スペース・タブ・空行の削除で25%,タグの最小化で3%,合計47%削減された。

Content-Transfer-Encoding: quoted-printable UTF-8

 -8kB (-14%)

 styles 48 / 103

 -1kB (-2%)

 spaces, tabs and empty lines

 -14kB (-25%)

 clean tag

 -2kB (-3%)

2022年の楽天注文内容の確認メール:

以下のように,オプションなしで,プレーンテキスト削除で8%,半角スペース・タブ・空行の削除で20%,合計29%削減された。

Content-Type: text/plain;

 -6kB (-8%)

Content-Type: text/html;

 spaces, tabs and empty lines

 -12kB (-20%)

2023年のMicrosoft Teamsからのメッセージ送信の連絡メール:

以下のように,オプションなしで,文字コード変換で11%,画像ファイル形式変換で5%,半角スペース・タブ・空行の削除で3%,使われていない画像ファイル削除で21%,合計45%削減された。

Content-Transfer-Encoding: base64 utf-8

 -9kB (-11%)

spaces, tabs and empty lines

 -2kB (-3%)

Content-Type: image ascii 805624B7ACF848CD841A00FE6A469CF4.jpeg

 replaced to _805624B7ACF848CD841A00FE6A469CF4_1.jpg

 1kB (1%)

Content-Type: image ascii 85125784ACCC49589261E44FEF938526.png

 replaced to _85125784ACCC49589261E44FEF938526_1.png

 1kB (1%)

Content-Type: image ascii DD8F9AE2C268479084909FBDECA8159D.png

 replaced to _DD8F9AE2C268479084909FBDECA8159D_1.png

 1kB (1%)

Content-Type: image ascii 18392A46B1774085BD3409F2FA2367A5.png

 replaced to _18392A46B1774085BD3409F2FA2367A5_1.png

 2kB (2%)

Content-ID: <actionable_logo>

 actionable_logo is not cited

 -2kB (-3%)

Content-ID: <actionable_apple>

 actionable_apple is not cited

 -6kB (-7%)

Content-ID: <actionable_android>

 actionable_android is not cited

 -7kB (-8%)

Content-ID: <actionable_microsoft_logo>

 actionable_microsoft_logo is not cited

 -2kB (-3%)

2023年のboxからの通知メール:

以下のように,オプションなしで,文字デコードで5%,プレーンテキスト削除で19%,半角スペース・タブ・空行の削除で5%,合計30%削減された。

Content-Transfer-Encoding: quoted-printable utf-8

 -2kB (-5%)

 spaces, tabs and empty lines

 -2kB (-5%)

Content-Type: text/plain;

 -8kB (-19%)