【PHP】mb_send_mailで日本語HTMLメール送信

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");を記入するようにしてください。