メールサーバーからメールを読み込みDBに保存する方法 日本語メールの文字コードについて

PHPでメールとDBを使う PHP/MySQL

メールデータをPHPで読み込む方法

メールサーバーの該当ファイルにアクセスします。 該当のフォルダの中を確認できたら個別に、メールデータ・ファイルを開きます。 ここまでは難しくないですが、この先、文字化けを変換するのが面倒です。 日本語のメール、英語のメール混合しているので、文字コードもまちまちです。メールソフトでは自動的に文字コードを判別して変換してくれているので文字コードを気にしないものですが。テキストベースでみると文字化けしています。文字コードが一致しない場合は、何語かわかりませんし、なんと記載されているかも不明です。

メールの文字コードを確認する

Content-Type: text/plain; charset=”xxx”を探します。 charset= に記載されているのがメールに使用されている文字コードです。
日本語のメールに使用される文字コードについて
文字コード エンコード名 意味
ANSIコード us-ascii 英数字記号文字を含む、7bitの基本的な文字コード。ほかの文字コードでも、英数字部分の文字コードはこのANSI文字コードをベースにしているものがほとんどである。ASCIIコードとも呼ばれる
Latin 1コード iso-8859-1 英語以外の、ラテン系の欧州言語(仏語や独語、伊語ほか)で使用されるコード
JISコード iso-2022-jp ANSI文字コードと漢字文字コードを、「エスケープ・シーケンス」と呼ばれる特別な文字シーケンスで切り替えながら共存させている。ほとんどの場合、インターネット電子メールやニュースは、この文字コードで送受信される
シフトJIS shift_jis MS-DOSの時代から広く使われている文字コード。漢字文字コードの「JISコード」をベースにして、ANSI文字と共存させている。PC環境では一般的な日本語文字コード
EUC euc-jp UNIX環境で広く使われている日本語文字コード。シフトJISとは異なる方法でANSI文字と漢字文字を共存させている
Unicode UTF-7 utf-7 Unicodeは、世界中の文字を16bitもしくは32bitの固定長の文字コードで統一的に扱うために作られたコード。16bitの方をUCS-2、32bitの方をUCS-4という。Unicodeをファイルへの保存や、通信回線上で送受信するためのエンコーディング方法の1つがUTF-7である。Unicode(UCS-2)を7bitのコードでのみ送信できるように、一部のUnicode文字をBase64でエンコーディングしている
Unicode UTF-8 utf-8 Unicodeをファイルに保存したり、通信回線上で送受信したりするためのエンコーディング方法の1つがUTF-8である。2bytes以上の可変長データの組み合わせでUnicodeを表現する。非ASCII文字(U+0080以降の文字)では、各バイトの最上位bit(MSB)が1になるので、場合によっては(7bitデータしか通さないメール・システムだと)利用できないことがある
日本語メール環境で利用できる主な文字コードは、Latin 1以外にも多くの欧米系の言語がサポートされている

Shift-JISやEUCコードは昔のテキストメールだけ。

シフトJISコードやEUCコードは日本語と英語を表示可能なものの、日本語と英語以外は対応できないことから、現在のメールではほとんど利用されていない。 現在の多くのメールは文字をエンコードをして利用されている。

メールの文字コードはエンコード名を確認する

エンコード名は、文字コード種別を表すために、メール・ヘッダ中に記述される文字列のこと。大文字小文字の判別は関係ない。

メール送信プログラムをつくる場合、エンコーディングの指定情報をつけて送信する。

メール送信プログラムを作る場合は、日本語のメールを送信する側ならUTF-8を利用するのが無難。また、エンコーディング指定を必ずつけておくこと。文字エンコーディング指定情報がない場合、文字化けしたまま、閲覧できないことがあるので注意。 JISの代わりには、iso-2022-JISが利用されている。文字のエンコードはSHIif-JISコードとは異なる。

メールの形式

text/plain; or text/html; で判別できる。必須ではないので、メールによっては記載が無い。

テキスト形式メール [text/plain;]

Content-Type: text/plain; は、テキスト形式のメール

HTML形式メール [text/html;]

Content-Type: text/html; は、HTML形式のメール

HTML


<!--英語のメールでよく使われている文字のエンコード -->
Content-Type: text/plain; charset="US-ASCII"

Content-Type: text/plain; charset=ISO-2022-JP

HTML


<!-- HTMLメール -->
------
Content-Type: text/html; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-2022-jp">
<meta http-equiv="Content-Style-Type" content="text/css">

iso-2022-jpに文字コードに変換する ConvartTolSO-2022-JP

shift_jisでは文字化けします。Visual Statio Code でConvartTolSO-2022-JPを検索してインストールします。Visual Statioを再起動すると使えます。 対象ファイルを開いて、lSO-2022-JPに変換する場合は、[Ctrl] + [Shift] + [P] でパネルを開いて検索欄に「Convert ISO-2022-JP 」をクリックする。 これでメールに記載されている文字が判別できました。 メールサーバーからメールを読み込みDBに保存する方法 日本語メールの文字コードについて、説明画像1

メールの分析

自動送信メールなどは形式が決まっているので、メールのヘッダー内容と、メール本文を文字一致することで、これで、メールを分析するPHPプログラムがつくれますね。

メールのMIME構造 multipart/signed;

MIME(Multi-purpose Internet Mail Extensions)

Multipart/Signed で実現されている著名と暗号化について。 Multipart/Signedについては詳しい説明があったので以下参照ください。 PGP/MIME 詳しいページ

HTML


Content-Type: multipart/signed; protocol="application/x-pkcs7-signature"; micalg="sha-256"; boundary="--xxxx

メールサーバーから、DBに保存

ヘッダーをみれば送信元のメールアドレスがわかります。とメール本文を取出してDBもできます。
タイトルとURLをコピーしました