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

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

新規登録して質問してみよう
ただいま回答率
85.50%
SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

912閲覧

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

sfl

総合スコア13

SMTP

SMTP(Simple Mail Transfer Protocol)はIPネットワークでemailを伝送する為のプロトコルです。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2019/11/11 01:23

背景

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

1<?php 2ini_set('display_errors', 1); 3mb_internal_encoding("UTF-8"); 4mb_language('ja'); 5 6require_once('qdmail.php'); 7require_once('qdsmtp.php'); 8 9$host = 'xxxx'; 10$port = 25; 11$protocol = 'SMTP'; 12 13$from = 'xxxx'; 14$to = 'xxxx'; 15$body = 'にほんご'; 16$subject = 'にほんご'; 17$name = 'にほんご'; 18 19$mail = new Qdmail(); 20$mail->charset('UTF-8' , 'base64'); 21$mail->errorDisplay( true ); 22$mail->smtp( true ); 23 24$param = array( 25 'host' => $host, 26 'port' => $port, 27 'from' => $from, 28 'protocol' => $protocol, 29 'user' => '', 30 'pass' => '' 31); 32$mail->smtpServer($param); 33 34$mail->to($to); 35$mail->from($from, $name); 36$mail->subject($subject); 37$mail->text($body); 38 39if( $mail->send() ){ 40 echo "OK"; 41}else{ 42 echo "NG"; 43} 44 45exit;

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CHERRY

2019/11/13 03:36

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

2019/11/13 04:33

ご質問ありがとうございます。 「にほんご」をサブジェクトなどに入力して送信すると、これを受信したメーラー(Becky! Internet Mail)はUTF-8として解釈して「縺ォ縺サ繧薙#」のように表示します。ソースレベルで見ると以下のようになっています。 入力した文字列:「にほんご」 (header) Subject: =?UTF-8?B?57i6772r57i6772757mn6JaZ77yD?= From: =?UTF-8?B?57i6772r57i6772757mn6JaZ77yD?= <xxxx> (body) 57i6772r57i6772757mn6JaZ77yD もう一つの例として挙げた「nihon語」は、再度確認したところ化けないことがわかりました。申し訳ありません。他に化ける例はいくつか見つけているのですがどれも秘匿すべき内容が含まれているため例として提示できません。 また、その後判明したことで他のサーバで動作を確認すると文字化けが全く発生しない場合もあることがわかりました。するとインストールされているPHPの問題なのではないかという気がしてきています。現在、それぞれのPHPのconfigureの違いなど点検しています。
guest

回答1

0

自己解決

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

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

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

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

投稿2019/11/14 02:47

sfl

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問