PHPのmail関数を用いて任意の文字コードで送受信を行う方法。
メール送信を行う際、特定の情報は7bitの文字列にエンコードする必要がある。
(1)メールタイトル
(2)差出人の名前
まずは、メールタイトルが全メールプラットフォームで文字化けしないようにエンコーディングする。
<?php
$to = "sample@sample.bz";
// メールのタイトルは7bitでの送信が必要になる。
$title = "これはめーるたいとるです。これはメールタイトルです。";
// 7bitとして扱えるようにbase64エンコードする
$title = base64_encode($title);
// メーラーに7bitで転送していること、しかし元の文字列は
// UTF-8で既にbase64エンコしていることを教えてやる必要があるので
// 以下のようなフォーマットにする
$title = "=?UTF-8?B?{$title}?=";
// "=?[文字エンコーディング]?[B(base64)あるいはQ(Quoted-Printable)]?
$senderName = "株式会社 メールを文字化けなしに送信する会社";
// 送信元の名前を7bitとして扱えるように修正
$senderName = base64_encode($senderName);
$senderName = "=?UTF-8?B?{$senderName}?=";
// "=?[文字エンコーディング]?[B(base64)あるいはQ(Quoted-Printable)]?
// メール本文は、メールヘッダーの項目によってエンコーディングを調整する必要がある
// Content-Type: text/plain; charset=(UTF-8|SHIFT-JIS|EUC-JP)など
// Content-Transfer-Encoding: (7bit|8bit|base64|quoted-printable)など
$body = "UTF-8で記述したメール本文を送信";
// 今回は、メール本文をbase64_encodeして送信してみる。
$body = base64_encode($body);
// 以上の設定から下記のメールヘッダーが想定される。
$mailHeaders = <<< EOF
From: {$senderName}<test@dummy.com>
Reply-To: test@dumy.com
Return-Path: test@dummy.com
X-Mailer: X-Mailer
MIME-Version: 1.0
Content-Type: text/plain;charset=UTF-8
Content-Transfer-Encoding: base64
EOF;
// Content-Type: メール本文はUTF-8でエンコードされる
// Content-Transfer-Encoding: ただし、送信時はbase64化する
$res = mail($to, $title, $body, $mailHeaders);
var_dump($res);
以上で送信処理を行ってみる。
すると無事に送信及び受信できているのがわかる。
メールヘッダーのFromおよびメールタイトルについて
https://secure.php.net/manual/ja/function.mail.php#Hcom108669
phpの上記ページのマニュアルに詳しい。
以前は、メール本文も7bitで送ることがあらゆる環境にたいして望ましい
エンコーディングだったかもしれないが、現在はUTF-8で送信しても全く問題ないため
メールヘッダおよびタイトルのみに注意すれば、メール本文に致命的な不具合は発生しないと思われる。