
PHPのmb_send_mailでメール送信する際に、例えばはしご高「髙」やたつさき「﨑」など旧漢字や①②③のような丸数字などの日本語文字化けが起こったので対策をしてみました。
また、ヘッダの追記のついでにmb_send_mailでccやbccに宛先を追加する方法もまとめました。
もくじ
php関連記事

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

MySQL/MariaDBのデータをPHP側で暗号化・復号する

phpで10進数と16進数、2進数、8進数の変換と0埋め表記

WordPressの条件分岐タグでページを判別する

PHPでpreg_splitの文字化けを回避しながらテキストを改行ごとに区切ってHTMLメールをつくる

WordPressテーマアップロード時に「辿ったリンクは期限が切れています。 もう一度お試しください。」と表示される

PHPで画像アップロード時に比率を保ったまま縮小する

phpで郵便番号を正規表現で3桁・ハイフン・4桁で出力するfunction

phpで電話番号のハイフンを正規表現で出力するfunction
preg_splitが原因で部分的に文字化けする場合
メール本文を改行ごとに区切ってpタグでマークアップし、HTMLメールをつくったときにはまった、preg_splitの文字化けを回避する方法はこちらから

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を使ってメール送信するとき楽ですね。

コメント