質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.23%

qdmail.php/qdsmtp.phpで送信したUTF-8メールで発生する文字化けを解消したい

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 359

sfl

score 8

背景

PHPで作成したサービスを運用していますが、現在利用しているレンタルサーバのメール送信数制限が厳しいため、外部のメールリレーサービスの利用を検討しています。
従来作成のPHPスクリプトではmb_send_mail関数を使い、レンタルサーバのSMTPを利用していました。このレンタルサーバ環境ではphp.iniの編集などでSMTPを外部に振ることができないので、PHPのmb_send_mail関数を使うのはやめ、メール処理ライブラリを導入することにしました。

発生している問題

現在qdmail.php/qdsmtp.phpを試していて、このライブラリへ対応させるよう従来のスクリプトを書き換えるのは容易にできたのですが、UTF-8エンコードのメールで肝心の日本語の扱いが正しくできません。
具体的には、サブジェクト、メールボディ、およびメールアドレスに付随する署名で
「日本語」などのように漢字で始まる文字列およびANK文字だけで構成される文字列は受信側で正しく表示されるのですが
「にほんご」のような平仮名かANK文字で始まり、かな漢字を含む文字列は化けてしまいます。

正しく表示される例
「nihongo」
「日本語」

文字化けする例
「にほんご」
「nihon語」

これはサブジェクト、メールボディ、メールアドレス署名部のそれぞれで独立して起きる現象です。

この日本語文字化けを解消したいと思います。
根本的な設定の見落としがあるのかと思います。問題点をご指摘いただければ幸いです。

補足情報

テスト環境(レンタルサーバ)のPHPバージョンは5.6
(近々7.Xへバージョンアップ予定)

qdmail.php/qdsmtp.phpは、
https://gist.github.com/YukiYamashina/2c53e0c43bf035ffc8d2bf0dcfbf7b29
にある PHP7.0対応版を利用 (PHP7.1でのcount関数仕様変更へは手元で対応済み)

mb_languageの設定は'ja'および'uni'の両方を試しましたが結果は変わりませんでした。
qdmail.phpのもともとの推奨設定は'ja'のようです。

テストを行ったソースは以下の通りです。

問題を検証するため作成したコード

サーバ名・メールアドレスは伏せました。

<?php
ini_set('display_errors', 1);
mb_internal_encoding("UTF-8");
mb_language('ja');

require_once('qdmail.php');
require_once('qdsmtp.php');

$host = 'xxxx';
$port = 25;
$protocol = 'SMTP';

$from = 'xxxx';
$to   = 'xxxx';
$body = 'にほんご';
$subject = 'にほんご';
$name = 'にほんご';

$mail = new Qdmail();
$mail->charset('UTF-8' , 'base64');
$mail->errorDisplay( true );
$mail->smtp( true );

$param = array(
  'host' => $host,
  'port' => $port,
  'from' => $from,
  'protocol' => $protocol,
  'user' => '',
  'pass' => ''
);
$mail->smtpServer($param);

$mail->to($to);
$mail->from($from, $name);
$mail->subject($subject);
$mail->text($body);

if( $mail->send() ){
  echo "OK";
}else{
  echo "NG";
}

exit;
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2019/11/13 12:36

    どの様に化けているのか 質問に記載されている「文字化けする例」の文字列の右側に文字化けした結果の文字列も記載していただけないでしょうか?

    キャンセル

  • sfl

    2019/11/13 13:33

    ご質問ありがとうございます。
    「にほんご」をサブジェクトなどに入力して送信すると、これを受信したメーラー(Becky! Internet Mail)はUTF-8として解釈して「縺ォ縺サ繧薙#」のように表示します。ソースレベルで見ると以下のようになっています。

    入力した文字列:「にほんご」

    (header)
    Subject: =?UTF-8?B?57i6772r57i6772757mn6JaZ77yD?=
    From: =?UTF-8?B?57i6772r57i6772757mn6JaZ77yD?= <xxxx>

    (body)
    57i6772r57i6772757mn6JaZ77yD

    もう一つの例として挙げた「nihon語」は、再度確認したところ化けないことがわかりました。申し訳ありません。他に化ける例はいくつか見つけているのですがどれも秘匿すべき内容が含まれているため例として提示できません。

    また、その後判明したことで他のサーバで動作を確認すると文字化けが全く発生しない場合もあることがわかりました。するとインストールされているPHPの問題なのではないかという気がしてきています。現在、それぞれのPHPのconfigureの違いなど点検しています。

    キャンセル

回答 1

check解決した方法

0

ご覧いただきありがとうございます。
この質問は取り下げたいと思います。

まず、環境により文字化けが発生する・しないの違いがあるので、その環境要因を探しましたが原因の特定が難しく、また文字化けはそもそも古いPHP(5.6)を使っているサーバで起きていることで、近々PHP自体のバージョンアップを予定しているため環境固有の問題を追及する意味が薄いこと。

また、qdmail.php/qdsmtp.phpは元作者の開発が終了しており、他の方が引き継いだバージョンもありますがそれもPHP7.0対応までで、今後のメンテナンスはあまり期待できそうにないこと。

上二つの理由から、qdmail.php/qdsmtp.phpを使うという方針を撤回したいと思います。
他メールライブラリを検討し、別の方法を探るつもりです。
ご覧の皆様ありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る