PHPでメール送信を実装することはよくありますが、文字化けなどで実装につまづくことがよくあるので、備忘録としてテンプレートを残しておきます。
結論から書きます。
以下のコードで、Gmail、Yahooメール、iCloudメール、独自ドメインメールで文字化けせず送信できることを確認しました。
ただし、PHPコードが書かれているファイルがUTF-8で保存されていることが必須です。
// メール送信を行う関数
function send_mail($to, $subject, $body) {
// 送信元メールアドレス
$from = 'no-reply@xxxxxx.jp';
// 送信元名(エンコード済み)
$from_name = mb_encode_mimeheader('xxxxxx自動送信メール');
// メールヘッダー
$header = "MIME-Version: 1.0\r\n";
$header .= "Content-Type: text/html; charset=UTF-8\r\n";
$header .= "From: " . $from_name . " <" . $from . ">\r\n";
$header .= "Sender: " . $from . "\r\n";
$header .= "Reply-To: " . $from . "\r\n";
$header .= "Return-Path: " . $from . "\r\n";
// メール送信
return mb_send_mail($to, $subject, $body, $header);
}
// 送信先メールアドレス
$email = 'example@gmail.com';
// 件名
$subject = 'テストメールです。';
// メール本文
$body = `
xxxxxxをご利用いただき、誠にありがとうございます。<br/><br/>
これは文字化けを確認するテストメールです。<br/><br/>
※このメールは自動送信です。メールを送信されても確認できませんのでご了承ください。<br/>
`;
// メールを送信
send_mail($email, $subject, $body);
注意点
mb_send_mail()を使用する際に、mb_language("Japanese");とmb_internal_encoding("UTF-8");を指定することがありますが、送信するメールがHTMLメールの場合は不要となります。テキストメールを送信する場合は
mb_language("Japanese");とmb_internal_encoding("UTF-8");を記入するようにしてください。