PHPMailerで送信したメールがYahooメールで文字化けする原因と修正方法

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 同じロリポップ!を使用

コメント

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