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

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

新規登録して質問してみよう
ただいま回答率
85.48%
UTF-8

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

PHP

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

Q&A

解決済

6回答

17762閲覧

「はしご高」を含むメールを送信したい

chibi_kuma

総合スコア85

UTF-8

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

PHP

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

メール

メールは、コンピュータネットワークを利用し、 情報等を交換する手段のことです。

5グッド

5クリップ

投稿2016/10/18 03:14

編集2016/10/18 10:43

PHP5.6から、メール本文に「はしご高」や「たつ崎」などを含む
メールを送信したいと考えています。

Gmailなどからメールを送信し、ヘッダーを確認すると以下のようになっており、
UTF-8の「はしご高」や「たつ崎」を含むメールを、マルチパートメールで
送信できそうと考えました。

Content-Type: multipart/alternative; boundary=XXXX --XXXX Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: base64 メール本文

以下のサイトを参考にしながら、テストプログラムを作成してみましたが、
メール本文のみ、文字化けしてしまいます。
サーバーと、プログラム本体の文字コードは、UTF-8です。

(参考)phpメール送信例/メモ
http://qiita.com/KanaeYou/items/b096f8be1f5bbc5448fa

(参考)PHPで添付ファイル付きメールを送信
http://refirio.org/view/202

(参考)ソフトバンク メール開発ガイド(PDF)
http://creation.mb.softbank.jp/mc/tech/doc/A-089-011-Mail_ContentDevelopmentGuide_1.2.1.pdf

MIMEヘッダーや、エンコードの方式、Content-Typeや、Content-Transfer-Encodingを、
あちこちいじって、ぐちゃぐちゃ変えながら試しています。
PCメールソフト宛のみうまくいく組み合わせもあったのですが、
ソフトバンク宛に送信すると、常に文字化けです。

どこをどのように修正すべきでしょうか?
ご指導いただけたら、幸いです。

※ 参考にしたサイトが添付を送るためのコードだったので、
添付パートの部分がついていますが、実際には使用しないので、
コメントアウトになっています。

PHP

1<?php 2//mb_language() を使ってエンコー ディング方式を ISO-2022-JP/Base64 に設定。 3//この設定は、mb_encode_mimeheader() 関数で使用されます。 4mb_language("Japanese"); 5 6//内部文字コード指定 7mb_internal_encoding("UTF-8"); 8 9// SETUP 10$to[] = 'XXX@XXX.XX.XX'; 11$from_email= 'XXX@XXX.XX.XX'; 12$from_name = 'XXXXXXXX'; 13$subject = 'テストプログラムから送信'; 14 15$body = "これはテストです コレハテストデス 神と神 ①②③ 髙﨑黑神福 ㈱ ⅠⅡⅢ"; 16 17$attach_file = ""; 18 19// send the email 20foreach( $to as $to_email ) { 21 sendmail_jpn($to_email, $subject, $body, $from_email,$from_name, $attach_file); 22 sleep(1); 23} 24 25echo "送信完了"; 26 27 28 29//関数----------------------------------- 30 31function sendmail_jpn ($to, $subject, $message, $from_email,$from_name, $filepath) 32{ 33 $mime_type = "application/octet-stream"; 34 35 // 添付ファイルのエンコード 36 //$filename = basename( $filepath ); 37 38 // マルチパートのパートの区切り文字列を指定 39 $boundary = '----=_Boundary_' . uniqid(rand(1000,9999) . '_') . '_'; 40 41 // 件名のエンコード 42 $subject = mb_convert_encoding($subject, "ISO-2022-JP", "UTF-8"); //UTF-8 → ISO-2022-JP 43 $subject = mb_encode_mimeheader_ex($subject); 44 45 // 差出人のエンコード 46 $from_name = mb_convert_encoding($from_name, "ISO-2022-JP", "UTF-8"); //UTF-8 → ISO-2022-JP 47 $from_name = mb_encode_mimeheader_ex($from_name); 48 49 // toをエンコード 50 $to = "=?ISO-2022-JP?B?" . base64_encode($to) . '?= <' . $to . '>'; 51 52 // fromをエンコード 53 $from = "=?ISO-2022-JP?B?" . base64_encode($from_name) . '?= <' . $from_email . '>'; 54 55 // 本文(planeパート)のエンコード 56 $message = mb_convert_encoding($message, 'JIS', 'UTF-8'); 57 $message = "=?ISO-2022-JP?B?" . base64_encode($message) . "?="; 58 59 //本文(htmlパート) 60 $message_html = ""; 61 62 // 添付ファイルのエンコード 63 //$filename = "=?ISO-2022-JP?B?" . base64_encode($filename) . "?="; 64 65 66 // ヘッダーの指定 67 $head = ""; 68 $head .= "From: {$from}\n"; 69 $head .= "MIME-Version: 1.0\n"; 70 //$head .= "Content-Type: text/plain;" . "\n"; 71 //$head .= "Content-Type: multipart/mixed; boundary=\"{$boundary}\"\n"; 72 $head .= "Content-Type: multipart/alternative; boundary=\"{$boundary}\" Content-Transfer-Encoding: base64"; 73 74 $body = ""; 75 76// text/plainパート 77$body .= "--{$boundary}\n"; 78 79 // 本文 80 $body .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"; Content-Transfer-Encoding: \"base64\"\n"; 81 82 $body .= "\n"; 83 $body .= "{$message}\n"; 84 $body .= "\n"; 85 86// text/htmlパート 87/* 88$body .= "--{$boundary}\n"; 89 90 // 本文 91 $body .= "Content-Type: text/html; charset=\"UTF-8\"" . "\n"; 92 $body .= "Content-Transfer-Encoding: \"base64\"" . "\n"; 93 $body .= "\n"; 94 $body .= "{$message_html}\n"; 95 $body .= "\n"; 96*/ 97 98// 添付ファイルパート 99/* 100 //$body .= "--{$boundary}\n"; 101 //$body .= "Content-Type: {$mime_type}; name=\"{$filename}\"\n" . 102 //"Content-Transfer-Encoding: base64\n" . 103 //"Content-Disposition: attachment; filename=\"{$filename}\"\n"; 104 //$body .= "\n"; 105 // 106 //$fp = fopen( $filepath, "r" ) or die("Error on mailing. (attachment file cannot open)"); 107 //$contents = fread( $fp, filesize($filepath) ); 108 //fclose( $fp ); 109 //$f_encoded = chunk_split(base64_encode($contents)); //添付ファイルをbase64エンコードする 110 //$body .= "{$f_encoded}\n"; 111 //$body .= "\n"; 112*/ 113 114//マルチパート終了 115$body .= "--{$boundary}--\n"; 116 117 // メール送信 118 if (mail($to, $subject, $body, $head)) { 119 echo 'sendmail_jpn : OK.'; 120 } else { 121 echo 'sendmail_jpn : FAILURE.'; 122 } 123 124} 125 126// mb_encode_mimeheader のバグ対策用 127function mb_encode_mimeheader_ex ($text, $split_count = 34) { 128 $position = 0; 129 $encorded = ''; 130 131 while ($position < mb_strlen($text, 'ISO-2022-JP')) { 132 if ($encorded != '') { 133 $encorded .= "\n "; 134 } 135 136 $output_temp = mb_strimwidth($text, $position, $split_count, '', 'ISO-2022-JP'); 137 $position = $position + mb_strlen($output_temp, 'ISO-2022-JP'); 138 $encorded .= "=?ISO-2022-JP?B?" . base64_encode($output_temp) . "?="; 139 } 140 return $encorded; 141} 142

文字化け時のスマホのスクショを追加します。

イメージ説明

追記

皆さん、たくさんご回答いただき、ありがとうございます。
こちらでまとめてお返事させていただく失礼をお許しください。

参考にしたサイトが「添付を付ける例」だったので、
ちょっと小難しく考えすぎたのかと思いまして、
プログラムをシンプルなものにして、再検証してみました。

PHP

1 2<?php 3mb_language("Japanese"); 4mb_internal_encoding("UTF-8"); 5$to = 'XXX@XXXX.XXX'; 6$subject = 'これはテストプログラムから送信したメール!'; 7$message = 'これはテストです コレハテストデス 神と神 ①②③ 髙﨑黑神福 ㈱ Ⅰ Ⅱ Ⅲ'; 8$message = mb_convert_encoding($message, 'ISO-2022-JP-MS'); 9$headers = 'From: XXXX@XXXX.XXX' . "\r\n"; 10 11mb_send_mail ($to, $subject, $message, $headers);

mailではなく、mb_send_mail にしました。

ちなみに、mb_get_info()の結果は以下の通りです。

------------------------------------------------------------------------ mb_get_info()の出力結果(カゴヤ・ジャパン レンタルサーバー) ------------------------------------------------------------------------ Array ( [internal_encoding] => UTF-8 [http_input] => UTF-8 [http_output] => UTF-8 [http_output_conv_mimetypes] => ^(text/|application/xhtml\+xml) [func_overload] => 0 [func_overload_list] => no overload [mail_charset] => ISO-2022-JP [mail_header_encoding] => BASE64 [mail_body_encoding] => 7bit [illegal_chars] => 0 [encoding_translation] => On [language] => Japanese [detect_order] => Array ( [0] => ASCII [1] => JIS [2] => UTF-8 [3] => EUC-JP [4] => SJIS ) [substitute_character] => 63 [strict_detection] => Off )

エンコードせずにmb_send_mailした場合

全環境で、外字が?に化けました。

ISO-2022-JP-MS にエンコードしてmb_send_mailした場合

iPhone OK
Windows LiveMail OK
AL-Mail OK
Gmail OK
Android(HUAWEI P8lite) NG
となりました。惜しい。

以下のページで紹介されていますが、
PHPで外字を含む文字列のエンコードコンバート

PHP V5.2.1以降では『iso-2022-jp-ms』というエンコーディングが追加され、

このエンコーディングでサポートされている文字も変換する事が可能になりました。
$str = mb_convert_encoding( $str, 'ISO-2022-JP-MS');
これにより、$strに(サポートされている)外字が含まれていても、正常にコンバートすることが出来ます。
但し、文字エンコードを正しくコンバート出来る事と、端末で外字を表示出来る事はイコールではありません。いくら正常にコンバートしても、表示先の端末にその外字がサポートされていなければ表示されません。

HUAWEI P8lite は、iso-2022-jp-ms を表示できないのかも知れません。
以下の添付を参照していただきたいのですが、ISO-2022-JP-MS でコンバートして送っているけど、
ヘッダーのcharsetには、ISO-2022-JP と書かれています。

イメージ説明

試しに、GmailからHUAWEI P8liteに送ってみると…

問題なく表示されました。(さすが…)

追記2

HUAWEI P8lite のみ、ヘッダー情報がメール本文内になだれ込んでいる件、
原因は、この行でした。

HUAWEI P8liteに届いたメールだけ、何故かメールの送信時間が
「1970年1月1日」になっていたので、ヘッダーが壊れてるなと…。

PHP

1$headers = 'From: XXXX@XXXX.XXX' . "\r\n"; //修正前 2$headers = 'From: XXXX@XXXX.XXX' . "\n"; //修正後

これでとりあえず、手持ちの端末では全てOKになりました!(ありがとうございます!)
自宅に戻らないと確認できませんが、Mac、古いガラケーなども確認したいと思います。

PHPからISO-2022-JP-MS でメールを送信されている方へ追加でお尋ね

ガラケーなど「ISO-2022-JP-MS」がサポートされていない端末も当然あるのではと
気になっています。

サーバ証明書が切り替わりますので、
「SHA-2」方式および「TLS1.0以上」に対応していない携帯端末
(2008年位より前に発売されたガラケー)は、サポート外にしようと思っていますが、
対応している機種で「ISO-2022-JP-MS」がサポートされていない機種って、
あるものなのでしょうか?(どうやって調べるんですか…こういうの…)
情報をお持ちでしたら、御知らせいただければ幸いです。

UTF-8の文字で、ISO-2022-JP-MSに含まれていない文字への対策

UTF-8の文字で、ISO-2022-JP-MSに含まれていない文字が入っていた場合にやはり化けるので、
以下の一行を追加しました。

PHP

1mb_substitute_character('entity');

追記3

imutakaoruさんからいただいたコードを、実行させてみました。
無事、UTF-8のままで送れました!!
(imutakaoruさん、ありがとうございます!)

受信したメールのヘッダーを確認したところ、
となっており、Gmailに近づいた気がします。(自分の理想に近い)

MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: BASE64

UTF-8をフルカバーできるか?

ISO-2022-JP-MS に変換しないので、ISO-2022-JP-MS に含まれていない文字が本文に入っていたら
どうなるかと思い、以下のサイトで紹介されていた二字を足してみました。

マルチバイト文字を扱う際に気をつけること
(U+29E3Dの「=ホッケ」と U+50AA「=さん」)

この2字がUTF-8かどうか、よく分かりませんが、
一応、UTF-8のファイルではちゃんと書けています。

$message = 'これはテストです コレハテストデス 神と神 ①②③ 髙﨑黑神福 ㈱ Ⅰ Ⅱ Ⅲ ???? 傪';

これを、imutakaoruさんからいただいたコードで送信した結果は、以下の通りでした。

iPhone OK
HUAWEI P8lite 「????」が文字化け
AL-Mail ???? 傪 とも文字化け

イメージ説明

(画像添付)

HUAWEI P8liteは フォントが省略されているのではないかと思います。

「Al-Mail」で受信したメールを外部エディタで確認してみると、
本文はちゃんとBASE64でエンコードされていました。
別のサイトで同じ文字列をBASE64エンコードして比較したところ、
合致しましたので、エンコードの問題ではなさそうです。

Gmailからも同じ文字列を、Al-Mail宛に送ってみましたが、
やっはり同じように、最後の2字が化けました。
Al-Mailの問題か、フォントの問題かなと思います。

Al-Mailは古すぎるので、もうサポート外で良いのですが、
HUAWEI P8liteは、表示して欲しかったなぁ…。

先ほど引用させていただいた、この一言に尽きるわけですね…。

文字エンコードを正しくコンバート出来る事と、
端末で外字を表示出来る事はイコールではありません。

UTF-8の全ての文字をサポートしようと思うと、
難しそうなので、(端末側のフォント事情になると、もうどうしようもない。)
サポート文字範囲は、「ISO-2022-JP-MS」に含まれている文字まで、
それ以外はエンティティするか、ゲタ文字に置き換える、という仕様の方が安心できそうです。

7968, nobinobi, ikuwow👍を押しています

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

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

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

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

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

ikedas

2016/10/18 03:47

文字化けについてのご質問では、どういうふうに見えるのかも知らせていただけるとよいです。スクリーンショットを貼り付けるのが一番です。
zico_teratail

2016/10/18 03:59

具体的にどういう文字化けになったのかが記載されないと判断できない。
chibi_kuma

2016/10/18 04:29

ikedasさん、zico_teratailさん、追記依頼ありがとうございました。 スクリーンショットを追加しましたので、 よろしくお願い申し上げます。
guest

回答6

0

ベストアンサー

スクリーンショット追加ありがとうございます。リアルタイムで見れてないので、ほかの方と重複することも書くかもしれませんが、ともかく回答します。


「はしご高」などを送りたいのであれば、文字コードをUTF-8にしてしまうのが、プログラムを作る側にとっては簡単かと思います。しかしここでは、あえてキャラクタセットを「ISO-2022-JP」と指定しながらベンダ拡張の文字を符号化して送ることを考えます。

まず前提として、以下のコードには次の点が必須です。

  • ソースのエンコーディングはUTF-8であること。
  • ソースのエンコーディングと内部エンコーディングが一致していること。つまり、最初にmb_internal_encoding('UTF-8')が実行されていること。
  • メール送信にmb_send_mail()ではなくmail()を使うこと。今回作成するメッセージは (後述の改行コードの違いを除き) MIME準拠の完全に符号化されたメッセージになるはずなので、送信時に更なる処理は必要ないと考えられます。

以下、工夫の説明と、ご質問のコードの修正点です。

lang

1/* ご質問のコード */ 2 // 件名のエンコード 3 $subject = mb_convert_encoding($subject, "ISO-2022-JP", "UTF-8"); //UTF-8 → ISO-2022-JP 4 $subject = mb_encode_mimeheader_ex($subject); 5

他の方からも指摘がありますが、mb_convert_encoding()は不要です。またやはり指摘がある通り、標準のISO-2022-JPで変換すると非標準の文字は置換されてしまいます。拡張コデックを使うことにします。

lang

1/* 修正後 */ 2 $subject = mb_encode_mimeheader($subject, 'ISO-2022-JP-MS', 'B', "\n"); 3

ISO-2022-JP-MSで符号化しています。私の環境では結果は「=?ISO-2022-JP?B?……?=」のようになり、望みどおりのキャラクタセット名が入りました。

また、mb_encode_mimeheader()の第4引数は、ヘッダの折り返しに使う改行コードです。既定値の"\r\n"だと、mail()などを使って送るときに正常なメッセージが送れない場合があります。ご質問のコードでは別関数を作ってほかの対策も含めて行っているようですが、改行の調整だけでよいように思います。

次にアドレスフィールド。

lang

1/* ご質問のコード */ 2 // 差出人のエンコード 3 $from_name = mb_convert_encoding($from_name, "ISO-2022-JP", "UTF-8"); //UTF-8 → ISO-2022-JP 4 $from_name = mb_encode_mimeheader_ex($from_name); 5

件名と同じです。ただし構造化ヘッダフィールドなので、phraseだけ符号化します。

lang

1/* 修正後 */ 2 // 差出人のエンコード 3 $from_name = mb_encode_mimeheader($from_name, 'ISO-2022-JP-MS', 'B', "\n"); 4

そして、ヘッダフィールドを組み立てます。

lang

1/* ご質問のコード */ 2 // toをエンコード 3 $to = "=?ISO-2022-JP?B?" . base64_encode($to) . '?= <' . $to . '>'; 4 5 // fromをエンコード 6 $from = "=?ISO-2022-JP?B?" . base64_encode($from_name) . '?= <' . $from_email . '>'; 7

ここで$toはASCIIしか含まないので、「符号化には最小の文字集合を使う」という原則により、ISO-2022-JPなどのより大きな文字集合による符号化はしません (たとえばteratailではユーザに送られるメッセージのヘッダに「=?UTF-8?Q?ikedas?=」などというものが入っていることがありますが、これは厳密には誤りです)。

一方$from_nameは、さっき符号化したのでもう符号化してはいけません

lang

1/* 修正後 */ 2 $to_name = str_replace("\"", "\\\"", str_replace("\\", "\\\\", $to)); 3 $to = '"' . $to_name . '" <' . $to . '>'; 4 5 $from = $from_name . ' <' . $from_email . '>';

投稿2016/10/18 08:06

編集2016/10/18 08:46
ikedas

総合スコア4333

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

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

chibi_kuma

2016/10/18 09:54

ikedasさん、丁寧な解説ありがとうございました。 まだ内容を100%理解は出来てないのですが、(スイマセン…勉強します!) 取り急ぎご指摘いただいたところを修正したところ、 マルチパートメールでも、無事送信することが出来ました。 ありがとうございます。
guest

0

Content-Typeのcharsetは'ISO-2022-JP'のままで
本文(mail body)のエンコード形式指定で'ISO-2022-JP-MS'と指定してください。

うちでは平文メールで「たち埼」「はしご高」送信できています。
メール送信はPear::Mailを使用しSMTP送信しています。
$bodyISO2022JPMS = mb_convert_encoding($body, "ISO-2022-JP-MS", "UTF-8");

追記:
Mail headerの charsetが「ISO-2022-JP」なのはこれで正解です。
P8liteのメールアプリでは本文にメールヘッダーがなだれ込んでますね。アプリのバグのような気がしますが。。。
P8liteでGmailアプリをインストールし受信してみると正常に表示されないでしょうか?

投稿2016/10/18 04:49

編集2016/10/18 06:55
Y.H.

総合スコア7914

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

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

chibi_kuma

2016/10/20 02:05

Y.H. さん、ご指導いただき、ありがとうございました。 お陰様で、ISO-2022-JP-MSで、はしご高やたち崎を送信することが出来ました。 P8liteで本文にメールヘッダーがなだれ込んでいた件もご指摘いただいたお陰で、 メールのタイムスタンプが1970年1月1日になっている原因と気がつく事ができました。 ISO-2022-JP-MSで送信していても メールヘッダーの charsetは「ISO-2022-JP」になるという情報は大変参考になりました。 これを知らないと「あれ、おかしい!」と、また右往左往するところでした。 ありがとうございました。またご指導よろしくお願い申し上げます。
guest

0

うーん、個人的には過去「mb_send_mail」でメール送信したら、わざわざ本文などをmb_convert_encodingを使って変換せずとも自動的にISO-2022に変換されてましたよ(PHPのコード自体はUTF-8)。

メール送信をmailではなくmb_send_mailにして、なおかつmb_convert_encodingを使わないようにしたらどうなるかやってみてください。(※ただしContent-Type等の必要なヘッダーは指定してください)

投稿2016/10/18 04:45

zico_teratail

総合スコア907

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

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

zico_teratail

2016/10/18 04:49

試しにローカルPCのThunderbirdからGmail宛に該当の本文をメール送信したところ、文字化けせずに送れました。すなわち、ISO-2022でも送れる文字たちであるはず。 ヘッダー(抜粋)は MIME-Version: 1.0 Content-Type: text/plain; charset=iso-2022-jp; format=flowed; delsp=yes Content-Transfer-Encoding: 7bit となってました。
zico_teratail

2016/10/18 06:52

>ヘッダーのcharsetには、ISO-2022-JP と書かれています。 それならヘッダーにMS付きを明示してみたら? $headers = ""; $headers .= "Content-Type: text/plain; charset=ISO-2022-JP-MS\n"; $headers .= "Content-Transfer-Encoding: 7bit\n"; $headers .= "From: test <XXXX@XXXX.XXX>\n";
chibi_kuma

2016/10/20 02:00

zico_teratailさん、ご指導ありがとうございました。 mb_send_mailが、ただメールを送るのではなく、エンコードも担当していたとは知らず、えらく遠回りをしてしまいましたが、お陰様で、目的には達することが出来ました。 ちゃんと関数マニュアルを読みこまないとダメですね…。 ありがとうございました。またご指導よろしくお願い申し上げます。
guest

0

JIS(ISO-2022-JP)にない文字の送信をしようとしているので、
そりゃ文字化けしますよね。
いっそシフトJISのまま送信してはいかがでしょうか。
「Shift_JIS」で解釈してくれるでしょうし。

(試してないので外していたらすみません)

余談ですが、
PHP: サポートされる文字エンコーディング - Manual
http://php.net/manual/ja/mbstring.supported-encodings.php
を見ていると、ケータイ3社向けのエンコーディングが用意されていたんですね、
知りませんでした。
「ISO-2022-JP-MS」「JIS-MS」なんてのもあるし。

投稿2016/10/18 04:18

編集2016/10/18 04:55
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

chibi_kuma

2016/10/18 04:32

m6uさん、ご回答ありがとうございます。 んー、そりゃそうですよね。 あちこち参考にしてて、ソースがごちゃごちゃになっているのですが、 当初は、 $message = mb_convert_encoding($message, 'JIS', 'UTF-8'); の部分がなく状態でやっていたのですが、 やはりダメなんですよね。 スクリーンショットを追加しました。 Bの方では、JISにせずにやってみたのですが…
退会済みユーザー

退会済みユーザー

2016/10/18 04:37

UTF-8にもせず、Shift_JISでいかがでしょうか。 また、メッセージ本文はすでにContent-Typeにてエンコードを指定しているため、 Base64エンコードしたそのママを使えば良さそうな気がします。
chibi_kuma

2016/10/20 01:53

m6uさん、ご指導いただき、ありがとうございました。 今回はShift-JISからUTF-8に文字コードを変更するのが改修目的だったもので、 UTF-8で送ることにこだわっておりました。 結果的に、UTF-8をBASE64エンコードしたものを送信できることが確認できました。 どうもありがとうございました。 またご指導お願い申し上げます。
guest

0

こちらの記事、参考になりそうなので、貼っておきます。
もう見ていたら、ごめんなさい。
ISO-2022-JPで『髙』を送信
【php】はしご高が文字化けしない文字コード変換

ちなみに、UTF-8 から Shift-JIS にすると、全角「-」や全角「~」、丸付きの数字(①など)、ローマ数字(Ⅲなど)などが文字化けを起こす可能性があるかと。
(別件でですが、この間引っかかった問題なもので^^;)

投稿2016/10/18 05:37

編集2016/10/18 05:46
kaputaros

総合スコア1844

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

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

chibi_kuma

2016/10/20 02:08

kaputarosさん、参考情報ありがとうございました。 別件ですが、UTF-8からShift-JISに変換するプログラムも作成する予定なので、 お知らせいただいた情報は大変参考になりました。 ありがとうございました。またご指導よろしくお願い申し上げます。
kaputaros

2016/10/21 01:36

お役に立ててよかったです^^ 文字コードの問題はきっと、ずっとぶち当たる壁ですよね。 最近Mac/Windows間のファイル受け渡し等が普通になってきてるので、更に拍車が・・・ 自分もまだまだ勉強不足です。がんばりましょ~♪
guest

0

m6uさんのおっしゃる通りSHIFT_JISかいっそUTF-8で送ればいいと思います。

どこで化けているのか一応検証してみました。

php

1<?php 2 mb_language("Japanese"); 3 mb_internal_encoding("Shift_JIS"); 4 5 $body = 'これはテストです コレハテストデス 神と神 ①②③ 髙﨑黑神福 ㈱ ⅠⅡⅢ'; 6 $body_ISO2022 = mb_convert_encoding($body, 'ISO-2022-JP', 'AUTO'); 7 8 var_dump($body_ISO2022); 9?>

とすると、思った通りmb_convert_encoding()から戻ってきた時点で
string(60) "これはテストです ????????? 神と? ??? ????? ? ???"
と、ISO-2022-JPに無い字は全部?に変換されちゃうので、そっから先には行きませんね。
追記

以下のソースにてお試しいただけますでしょうか。

php

1<?php 2mb_language("uni"); // mb_send_mailにて送る際のコードをUTF-8にする("Japanese"だとISO-2022-JPになるので) 3mb_internal_encoding("UTF-8"); 4$to = 'XXX@XXXX.XXX'; 5$subject = 'これはテストプログラムから送信したメール!'; 6$message = 'これはテストです コレハテストデス 神と神 ①②③ 髙﨑黑神福 ㈱ Ⅰ Ⅱ Ⅲ'; 7// $message = mb_convert_encoding($message, 'ISO-2022-JP-MS'); // encodingの変更をせずutf-8で送る 8$headers = 'From: XXXX@XXXX.XXX' . "\r\n"; 9 10mb_send_mail ($to, $subject, $message, $headers); 11 12?>

投稿2016/10/18 04:45

編集2016/10/18 07:51
imutakaoru

総合スコア356

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

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

chibi_kuma

2016/10/18 10:45

imutakaoruさん、情報ありがとうございます。 結果は、追記3に記載させていただきましたので、そちらをご覧いただけますでしょうか?
imutakaoru

2016/10/19 00:44

おおむね解決に近づいたようでなによりです。 あとはどのへんを妥協点にするか、くらいですね。
chibi_kuma

2016/10/20 01:57

imutakaoruさん、ご指導いただき、ありがとうございました。 お陰様で、UTF-8でBASE64エンコードしたものを送ることが出来ました。 今回のエンコードしたものが正しく送信できていても、 それが正しく表示されるとは限らないという点も、今回の大きな収穫でした。 おっしゃる通り、妥協点・落とし所をお客様と決めて、 先に進めたいと思います。 ありがとうございました。またご指導よろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問