PHPのmb_send_mailでメール送信時に、はしご高「髙」やたつさき「﨑」など旧漢字や丸数字の日本語文字化け対策をする

プロモーションが含まれています

PHPのmb_send_mailでメール送信時に、はしご高「髙」やたつさき「﨑」など旧漢字や丸数字の日本語文字化け対策をする

PHPのmb_send_mailでメール送信する際に、例えばはしご高「髙」やたつさき「﨑」など旧漢字や①②③のような丸数字などの日本語文字化けが起こったので対策をしてみました。

また、ヘッダの追記のついでにmb_send_mailでccやbccに宛先を追加する方法もまとめました。

php関連記事

関連記事をもっとみる

preg_splitが原因で部分的に文字化けする場合

メール本文を改行ごとに区切ってpタグでマークアップし、HTMLメールをつくったときにはまった、preg_splitの文字化けを回避する方法はこちらから

PHPでpreg_splitの文字化けを回避しながらテキストを改行ごとに区切ってHTMLメールをつくる
PHPでPOSTデータのテキストを改行ごとに区切ってpタグでマークアップし、HTMLメールをつくります。 途中ではまった、preg_splitの文字化けを回避する方法も。 php関連記事 ...

phpからメール送信するパターン

php

$mailto = '宛先';
$subject = '旧漢字文字化け対策テスト';
$body =  <<< EOM
高→髙
崎→﨑
神→神
福→福
羽→羽
黒→黑
塚→塚
増→增
横→橫
青→靑
清→淸
館→館
飯→飯
郷→鄕
濱→濵
都→都
瀬→瀨
郎→郞
朗→朗
逸→逸
寛→寬
徳→德
悦→悅
晴→晴
靖→靖
匡→匤
羨→羡
教→敎
妹→妺
①②③④⑤
EOM;

$send_name = "差出人名";
$send_mail = '差出人アドレス';
$returnMail = '返信先アドレス';

mb_language('ja');
mb_internal_encoding('UTF-8');

$header = "From: " . mb_encode_mimeheader($send_name). " <" . $send_mail. ">";

$send = mb_send_mail(
  $mailTo, 
  $subject, 
  $mail_contents, 
  $header,
   '-f'. $returnMail
);

いつものphpから文字コードをUTF-8でメール送信するやつです。
メール本文に文字化けする旧漢字と環境依存文字を入れて送信したところ、下記のように文字化けしました。

高→?
崎→?
神→?

文字化け対策①「mb_languageを変更してみる」

php

mb_language('uni');

mb_language('ja');となっている箇所をmb_language('uni');に変更します。

文字化け対策②「ヘッダにContent-Typeを設定してみる」

php

$header = "MIME-Version: 1.0\r\n".
          "Content-Transfer-Encoding: 8bit\r\n".
          "Content-Type: text/plain; charset=UTF-8\r\n".
          "From: " . mb_encode_mimeheader($send_name). " <" . $send_mail. ">";

環境にもよると思いますがヘッダの設定が違っていると文字化けすることがあるようです。
そんな場合に、ヘッダにContent-Typeなど必要な情報を付けます。

mb_send_mailでCCとBCCを追加できるfunction

php

$cc = array(
  'one@sample.jp',
  'two@sample.jp',
);

$bcc = array(
  'three@sample.jp',
);

$send = send_mail_cc(
  $mailto, //宛先
  $subject, //件名
  $mail_contents, //本文
  $cc, //CCに入れる宛先
  $bcc //BCCに入れる宛先
);

上のコメントアウトのとおりですが引数に上記を渡します。
もちろん、CC、BCCは無しでも、配列で複数指定してもOKです!

function

function send_mail_cc($mailTo, $subject, $mail_contents, $cc, $bcc){
  $cc_header = '';
  $bcc_header = '';
  $send_name = "差出人名";
  $send_mail = '差出人アドレス';
  $returnMail = '返信先アドレス';

  if(!empty($cc)){
    $cc_header = PHP_EOL.'Cc: ';
    foreach ($cc as $value) {
      $cc_header .= $value.',';
    }
    $cc_header = mb_substr($cc_header, 0, -1, "UTF-8") . PHP_EOL;
  }

  if(!empty($bcc)){
    $bcc_header = PHP_EOL.'Bcc: ';
    foreach ($bcc as $value) {
      $bcc_header .= $value.',';
    }
    $bcc_header = mb_substr($bcc_header, 0, -1, "UTF-8") . PHP_EOL;
  }

  mb_language('uni');
  mb_internal_encoding('UTF-8');

  $header = 'From: ' . mb_encode_mimeheader($send_name). ' <' . $send_mail. '>';

  return mb_send_mail(
    $mailTo, 
    $subject, 
    $mail_contents, 
    $header.$cc_header.$bcc_header, 
    '-f'. $returnMail
  );
}

cc・bccに宛先を追加したい場合は、このようヘッダに追記すればOKです。

mb_send_mailで差出人情報とCC、BCCを追加できるfunction

php

$cc = array(
  'one@sample.jp',
  'two@sample.jp',
);

$bcc = array(
  'three@sample.jp',
);

$send = send_mail_cc(
  $mailto, //宛先
  $subject, //件名
  $mail_contents, //本文
  $cc, //CCに入れる宛先
  $bcc, //BCCに入れる宛先
  $s_mail, //差出人アドレス
  $r_mail, //返信先アドレス
  $s_name //差出人名
);

上のfunctionとほぼ一緒ですが、引数に上記を渡します。

function

function send_mail_custom($mailTo, $subject, $mail_contents, $cc, $bcc, $s_mail, $r_mail, $s_name){
  $cc_header = '';
  $bcc_header = '';
  $send_name = $s_name;
  $send_mail = $s_mail;
  $returnMail = $r_mail;

  if(!empty($cc)){
    $cc_header = PHP_EOL.'Cc: ';
    foreach ($cc as $value) {
      $cc_header .= $value.',';
    }
    $cc_header = mb_substr($cc_header, 0, -1, "UTF-8") . PHP_EOL;
  }

  if(!empty($bcc)){
    $bcc_header = PHP_EOL.'Bcc: ';
    foreach ($bcc as $value) {
      $bcc_header .= $value.',';
    }
    $bcc_header = mb_substr($bcc_header, 0, -1, "UTF-8") . PHP_EOL;
  }

  mb_language('uni');
  mb_internal_encoding('UTF-8');

  $header = 'From: ' . mb_encode_mimeheader($send_name). ' <' . $send_mail. '>';

  return mb_send_mail(
    $mailTo, 
    $subject, 
    $mail_contents, 
    $header.$cc_header.$bcc_header, 
    '-f'. $returnMail
  );
}

こうしておけばphpからmb_send_mailを使ってメール送信するとき楽ですね。

コメント

タイトルとURLをコピーしました