PHPMailerを使ってSMTP経由で送信したメールのうちYahooメール宛のみ文字化けしてしまいました。その他検証したGmail宛とローカルのThunderbirdに設定した独自ドメインのアドレス宛のメールは問題ありませんでしたので、再度対象コードを見直してみることにしました。
文字化けするコード
/**
* SMTP経由でメール送信(文字化けするコード)
*/
function send_mail_smtp($params)
{
//パラメーター取得
$smtp = $params['smtp'];
$admin = $params['admin_mail'];
$user = $params['user_mail'];
$post = $params['post'];
$type = $params['type'];
//SMTP設定
$mail = new PHPMailer(true);
$mail->SMTPDebug = $smtp['debug'];
$mail->isSMTP();
$mail->Host = $smtp['host'];
$mail->SMTPAuth = $smtp['auth'];
$mail->Username = $smtp['user'];
$mail->Password = $smtp['pass'];
$mail->SMTPSecure = $smtp['secure'];
$mail->Port = $smtp['port'];
//自動返信メール設定
require INC_DIR.'/mail/'.$type.'_user.php';
$user_name = mb_encode_mimeheader($post['name']['data'], "ISO-2022-JP","UTF-8");
$user_mail = $post['email']['data'];
$mail->setFrom($admin['from_mail'], $admin['from_name']);
$mail->addAddress($user_mail, $user_name);
$mail->Subject = $user['subject'];
$mail->Body = mb_convert_encoding($mail_body, 'ISO-2022-JP', 'UTF-8');
$mail->send();
//管理者宛メール設定
require INC_DIR.'/mail/'.$type.'_admin.php';
$mail->ClearAddresses();
$mail->addAddress($admin['from_mail'], $admin['from_name']);
$mail->Subject = $admin['subject'];
$mail->Body = $mail_body;
$mail->send();
}
文字化けせず正常に届くコード
/**
* SMTP経由でメール送信(文字化けしないコード)
*/
function send_mail_smtp($params)
{
//パラメーター取得
$smtp = $params['smtp'];
$admin = $params['admin_mail'];
$user = $params['user_mail'];
$post = $params['post'];
$type = $params['type'];
//SMTP設定
$mail = new PHPMailer(true);
$mail->SMTPDebug = $smtp['debug'];
$mail->isSMTP();
$mail->Host = $smtp['host'];
$mail->SMTPAuth = $smtp['auth'];
$mail->Username = $smtp['user'];
$mail->Password = $smtp['pass'];
$mail->SMTPSecure = $smtp['secure'];
$mail->Port = $smtp['port'];
//文字セットとエンコーディングの設定
$mail->CharSet = 'iso-2022-jp';
$mail->Encoding = '7bit';
//自動返信メール設定
require INC_DIR.'/mail/'.$type.'_user.php';
$user_name = mb_encode_mimeheader($post['name']['data'], "ISO-2022-JP","UTF-8");
$user_mail = $post['email']['data'];
$mail->setFrom($admin['from_mail'], $admin['from_name']);
$mail->addAddress($user_mail, $user_name);
$mail->Subject = $user['subject'];
$mail->Body = mb_convert_encoding($mail_body, 'ISO-2022-JP', 'UTF-8');
$mail->send();
//管理者宛メール設定
require INC_DIR.'/mail/'.$type.'_admin.php';
$mail->ClearAddresses();
$mail->addAddress($admin['from_mail'], $admin['from_name']);
$mail->Subject = $admin['subject'];
$mail->Body = $mail_body;
$mail->send();
}
2つのコードの違い
2つのコードの違いは単純で文字セットとエンコーディングの設定が漏れていました。この差分を問題のコードに追加したところYahooメールでも文字化けせず正常に読めるメールが届くようになりました。
//文字セットとエンコーディングの設定
$mail->CharSet = 'iso-2022-jp';
$mail->Encoding = '7bit';
動作環境情報
ロリポップ!ライトプラン PHP 7.3(CGI版) PHPMailer 6.1.4 SMTP 同じロリポップ!を使用
コメント