先日、「取り急ぎ受信したメールを確認したいのでサーバ上で内容を調べてもらえませんか」と、問合せをいただきました。
メールの内容はエンコードされており、確認するにはデコードが必要です。
通常なら外部のツールでデコードを行いますが、今回はメールということもあり外部への共有を控えたかったのでLinuxのコマンドを用いてデコードを行いました。
スパムかどうかの確認でも使う便利なコマンドですので紹介したいと思います。
はじめに
メールはMIMEと呼ばれる規格によってエンコードされたあとメールサーバへ送られ、受信者側のメーラーでデコードされます。
(引用元:SendGrid 日本語メールの仕組み)
詳しくはこちらをご確認ください。https://sendgrid.kke.co.jp/blog/?p=10958
MIMEで定められているエンコード方式には「Base64」「iso-2022-jp」「Quoted-Printable」といったものがあります。
以降ではそれぞれのパターンをデコードしていきたいと思います。
本文のデコード方法
例1)Base64
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: base64 44GT44Gu44Oh44O844Or44Gv44CBSVBB44Oh44O844Or44OL44Ol44O844K544CM44K744Kt44Ol 44Oq44OG44Kj5a++562W5oOF5aCx44CN44Gr44GU55m76Yyy44GE44Gf44Gg44GE44Gf55qG44GV 44G+44G46YCB5L+h44GX44Gm44GE44G+44GZ44CCDQoNCklQQSjni6znq4vooYzmlL/ms5Xkurrm g4XloLHlh6bnkIbmjqjpgLLmqZ/mp4sp44K744Kt44Ol44Oq44OG44Kj44K744Oz44K/44O844Gv 44CB5pys5pel44CB5qyh44Gu5rOo5oSP5Zaa6LW35oOF5aCx44KS55m66KGo44GX44G+44GX44Gf 44CCDQoNClZNd2FyZeijveWTgeOBruiEhuW8seaAp+WvvuetluOBq+OBpOOBhOOBpihDVkUtMjAy NC0zODgxMiDnrYkpDQoNCuOAh+amguimgQ0KQnJvYWRjb23jgYzmj5DkvpvjgZnjgotWTXdhcmUg dkNlbnRlciBTZXJ2ZXLjga/jgIHku67mg7PljJbnkrDlooPjga7nrqHnkIbpgYvnlKjjg4Tjg7zj g6vjgafjgZnjgIINCg0K44GT44GuVk13YXJlIHZDZW50ZXIgU2VydmVy44Gr44GK44GE44Gm44CB RENFL1JQQ+ODl+ODreODiOOCs+ODq+OBruWun+ijheOBq+i1t+WboOOBmeOCi+ODkuODvOODl+OD meODvOOCueOBruODkOODg+ODleOCoeOCquODvOODkOODvOODleODreODvOOBruiEhuW8seaApyAo Q1ZFLTIwMjQtMzg4MTIpIOOBqOOAgeaoqemZkOaYh+agvOOBruiEhuW8seaApyAoQ1ZFLTIwMjQt |
※長いので一部を掲載しています。
Content-Transfer-Encoding: base64 と記述されていますのでbase64コマンドを用いてデコードしていきます。
1 2 3 4 5 6 7 8 9 10 11 12 |
$ echo "44GT44Gu44Oh44O844Or44Gv44CBSVBB44Oh44O844Or44OL44Ol44O844K544CM44K744Kt44Ol 44Oq44OG44Kj5a++562W5oOF5aCx44CN44Gr44GU55m76Yyy44GE44Gf44Gg44GE44Gf55qG44GV 44G+44G46YCB5L+h44GX44Gm44GE44G+44GZ44CCDQoNCklQQSjni6znq4vooYzmlL/ms5Xkurrm g4XloLHlh6bnkIbmjqjpgLLmqZ/mp4sp44K744Kt44Ol44Oq44OG44Kj44K744Oz44K/44O844Gv 44CB5pys5pel44CB5qyh44Gu5rOo5oSP5Zaa6LW35oOF5aCx44KS55m66KGo44GX44G+44GX44Gf 44CCDQoNClZNd2FyZeijveWTgeOBruiEhuW8seaAp+WvvuetluOBq+OBpOOBhOOBpihDVkUtMjAy NC0zODgxMiDnrYkpDQoNCuOAh+amguimgQ0KQnJvYWRjb23jgYzmj5DkvpvjgZnjgotWTXdhcmUg dkNlbnRlciBTZXJ2ZXLjga/jgIHku67mg7PljJbnkrDlooPjga7nrqHnkIbpgYvnlKjjg4Tjg7zj g6vjgafjgZnjgIINCg0K44GT44GuVk13YXJlIHZDZW50ZXIgU2VydmVy44Gr44GK44GE44Gm44CB RENFL1JQQ+ODl+ODreODiOOCs+ODq+OBruWun+ijheOBq+i1t+WboOOBmeOCi+ODkuODvOODl+OD meODvOOCueOBruODkOODg+ODleOCoeOCquODvOODkOODvOODleODreODvOOBruiEhuW8seaApyAo Q1ZFLTIwMjQtMzg4MTIpIOOBqOOAgeaoqemZkOaYh+agvOOBruiEhuW8seaApyAoQ1ZFLTIwMjQt" | base64 --decode |
1 2 3 4 5 6 7 8 9 10 |
このメールは、IPAメールニュース「セキュリティ対策情報」にご登録いただいた皆さまへ送信しています。 IPA(独立行政法人情報処理推進機構)セキュリティセンターは、本日、次の注意喚起情報を発表しました。 VMware製品の脆弱性対策について(CVE-2024-38812 等) 〇概要 Broadcomが提供するVMware vCenter Serverは、仮想化環境の管理運用ツールです。 このVMware vCenter Serverにおいて、DCE/RPCプロトコルの実装に起因するヒープベースのバッファオーバーフローの脆弱性 (CVE-2024-38812) と、権限昇格の脆弱性 (CVE-2024- |
デコード後はUTF-8でデコードする必要がありますが、コンソール側が自動的に変換して日本語表示してくれています。
例2)iso-2022-jp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Content-Type: text/plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit ESC$B$3$s$K$A$O!"3t<02q<R%M%G%#%"ESC(B ESC$B1D6HIt$G$9!#ESC(B ESC$B;D=k$b$h$&$d$/1"$j$r8+$;$k;~4|$H$J$j$^$7$?$,!"$$$+$,$*2a$4$7$G$7$g$&$+!#ESC(B ESC$BD+HU$N5$29$NJQ2=$b7c$7$/$J$C$F$*$j$^$9!#ESC(B ESC$B3'MM$K$*$+$l$^$7$F$O$4<+0&$$$?$@$1$l$P$H;W$$$^$9!#ESC(B ESC$B:#2s$O!VESC(BWindows 10ESC$B%5%]!<%H=*N;$K$*$1$k%j%9%/!WESC(B ESC$B$3$A$i$K$D$$$F$*OC$7$F$$$-$^$9!#ESC(B ESC$B$I$&$>:G8e$^$G$*FI$_$$$?$@$1$l$P9,$$$G$9!#ESC(B ESC$B(,(,ESC(BWindows 10ESC$B$,%5%]!<%H=*N;!*(,(,ESC(B Windows 10ESC$B$,ESC(B2025ESC$BG/ESC(B10ESC$B7nESC(B14ESC$BF|$KESC(B ESC$B%5%]!<%H=*N;$K$J$k$3$H$O$4B8$8$G$7$g$&$+!#ESC(B Windows 10ESC$B$N%Q%=%3%s$r$=$N$^$^;HMQ$7B3$1$k$HESC(B ESC$B%5%]!<%H=*N;$KH<$$MM!9$J%j%9%/$,A[Dj$5$l$^$9!#ESC(B |
本文にあるESCはiso-2022-jpの記述であり、ESC$BはAsciiからiso-2022-jpへの切り替えを意味し、ESC(Bはiso-2022-jpからAsciiへの切り替えを意味しています。
Content-Transfer-Encoding: 7bitはAsciiを意味しており、この場合特にデコードする必要はありません。
ESCはエスケープシーケンスですので、こちらをAscii(\x1b)に変換していきます。
1 2 |
$ echo 'ESC$B$3$s$K$A$O!"3t<02q<R%M%G%#%"ESC(B ESC$B1D6HIt$G$9!#ESC(B' | sed s/ESC/\\x1b/g こんにちは、株式会社ネディア 営業部です。 |
sedコマンドの場合は置換した文字列がバイトシーケンスとして処理されるので、コンソール上で自動的に日本語変換してくれています。
iso-2022-jpの場合、ダブルクォーテーションとシングルクォーテーションが入り混じっているので本文をテキストファイルに保存してから置換することをおすすめします。
1 |
$ sed s/ESC/\\x1b/g mail.txt |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
こんにちは、株式会社ネディア 営業部です。 残暑もようやく陰りを見せる時期となりましたが、いかがお過ごしでしょうか。 朝晩の気温の変化も激しくなっております。 皆様におかれましてはご自愛いただければと思います。 今回は「Windows 10サポート終了におけるリスク」 こちらについてお話していきます。 どうぞ最後までお読みいただければ幸いです。 ━━Windows 10がサポート終了!━━ Windows 10が2025年10月14日に サポート終了になることはご存じでしょうか。 Windows 10のパソコンをそのまま使用し続けると サポート終了に伴い様々なリスクが想定されます。 |
例3)Quoted-Printable
1 2 3 4 5 6 7 8 9 10 11 |
Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable =0A=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=0A=E9=81=A9=E5=88=87=E3=81=AA=E6=83=85=E5=A0=B1=E7= =AE=A1=E7=90=86=E3=81=A7=E5=A4=96=E9=83=A8=E3=81=8B=E3=82=89=E3=81= =AE=E4=BE=B5=E5=85=A5=E3=82=84=E6=83=85=E5=A0=B1=E6=B5=81=E5=87=BA= |
quoted-printableの場合はnkfコマンドを用いてデコードを行います。
nkfのインストール
Almalinux9の場合
1 2 |
$ dnf install epel-release $ dnf install nkf |
Almalinux8の場合
1 |
$ dnf install nkf --enablerepo=powertools |
1 2 3 4 5 6 7 8 |
$ echo "=0A=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=0A=E9=81=A9=E5=88=87=E3=81=AA=E6=83=85=E5=A0=B1=E7= =AE=A1=E7=90=86=E3=81=A7=E5=A4=96=E9=83=A8=E3=81=8B=E3=82=89=E3=81= =AE=E4=BE=B5=E5=85=A5=E3=82=84=E6=83=85=E5=A0=B1=E6=B5=81=E5=87=BA=" | nkf -mQ |
1 |
??理で外部からの侵入や情報流出[ |
-mはMIME、QはQuoted-Printableでデコードするためのオプションです。
オプションを指定しなくてもnkfが自動的に判断してエンコードしてくれますが、うまくいかない場合は明示的に指定します。
nkfコマンドはうまくデコードしきれないこともありますがざっくり中身を確認したいときには十分かと思います。
完璧にデコードしたい場合は外部のサービスやプログラミング言語を使用するほうがいいかもしれません。
以下はPythonを使った例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import quopri string = """ =0A=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=0A=E9=81=A9=E5=88=87=E3=81=AA=E6=83=85=E5=A0=B1=E7= =AE=A1=E7=90=86=E3=81=A7=E5=A4=96=E9=83=A8=E3=81=8B=E3=82=89=E3=81= =AE=E4=BE=B5=E5=85=A5=E3=82=84=E6=83=85=E5=A0=B1=E6=B5=81=E5=87=BA= """ decoded = quopri.decodestring(string).decode('utf-8') print(decoded) |
1 2 |
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 適切な情報管理で外部からの侵入や情報流出 |
件名をデコード
1 |
Subject: =?iso-2022-jp?B?GyRCIVolTSVHJSMlIiVhJWslXiUsIVsbKEJXaW5kb3dzIDEwGyRCJTUlXSE8JUg9Kk47ISo0azZIJCxKeiQoJGtMZEJqJEskRCQkJEYhIRsoQg==?= |
前半の=?iso-2022-jp?B?部分は、文字セットとエンコード方式を示しておりBはBase64の意味となります。QはQuoted-Printableです。
nkfコマンドでデコードする場合は文字セットとエンコード方式のパラメーターを含んだ状態でもデコード可能です。
1 |
$ echo "=?iso-2022-jp?B?GyRCIVolTSVHJSMlIiVhJWslXiUsIVsbKEJXaW5kb3dzIDEwGyRCJTUlXSE8JUg9Kk47ISo0azZIJCxKeiQoJGtMZEJqJEskRCQkJEYhIRsoQg==?=" | nkf |
1 |
【ネディアメルマガ】Windows 10サポート終了!企業が抱える問題について |
Base64の場合はbase64コマンドでもデコード可能ですがパラメーターを除く必要があります。
=?iso-2022-jp?B?と末尾の?=で件名を挟んでいるため、真ん中の件名部分だけを取り出しデコードしていきます。
1 |
$ echo "GyRCIVolTSVHJSMlIiVhJWslXiUsIVsbKEJXaW5kb3dzIDEwGyRCJTUlXSE8JUg9Kk47ISo0azZIJCxKeiQoJGtMZEJqJEskRCQkJEYhIRsoQg==" | base64 --decode |
1 |
【ネディアメルマガ】Windows 10サポート終了!企業が抱える問題について |
まとめ
メールが受信されないと問合せがあったときに対象のメールがサーバ上に存在するか確認するときや、スパムかどうか確認したいとき、あるいは今回のように急を要する場合などメールソースから内容を確認したいことがあるかと思います。
そんなときにnkfやbase64などのコマンドを覚えておくと便利かもしれません。