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

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

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

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

Q&A

解決済

2回答

7294閲覧

PHPのclassを使ってメールを送ると、件名だけ文字化けしてしまいます。

sake

総合スコア52

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

PHP

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

0グッド

2クリップ

投稿2017/09/21 07:02

編集2017/09/21 09:04

PHPのclassを使ってメールを送るプログラムを書きましたが、件名だけ文字化けします。
いろいろ試してみましたが、原因が分かりません。
どなたか、お力添えをお願いします。
件名「メールテストです。」が「�᡼���ƥ��ȤǤ���」に文字化けします。

メール送信プログラム

php

1#!/usr/bin/php 2<?php 3 require("/usr/local/bin/PHPMailer/class.phpmailer.php"); 4 5 //言語設定、内部エンコーディングを指定する 6 mb_language("japanese"); 7 mb_internal_encoding("UTF-8"); 8 9 //日本語添付メールを送る 10 $to = "xxxxx@yahoo.co.jp"; //宛先 11 $subject = "メールテストです。"; //題名 12 $body="以下の内容でフォームより送信されました。\n\n"; 13 $body.="本文の内容を入れます\n"; 14 $from = "1234@56789.dip.jp"; //送り主 15 //$attachfile = "files/test.xls"; //添付ファイルパス 16 17 $mail = new PHPMailer(); 18 $mail->CharSet = "UTF-8"; 19 $mail->Encoding = "base64"; 20 21 $mail->AddAddress($to); 22 $mail->From = $from; 23 24 //$mail->FromName = mb_encode_mimeheader(mb_convert_encoding($from,"JIS","UTF-8")); 25 //$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8")); 26 //$mail->Body = mb_convert_encoding($body,"JIS","UTF-8"); 27 $mail->FromName = $from; 28 $mail->Subject = $subject; 29 $mail->Body = $body; 30 31 //添付ファイル追加 32 //$mail->AddAttachment($attachfile); 33 //$mail->AddAttachment($attachfile2); 34 $mail->Send(); //メール送信 35?>

コメントアウトの部分はインターネットから拝借したときのままで、この状態では文字化けしたので、書き直ししました。
しかし、件名の文字化け解消はできませんでした。

classは、下記URLからダウンロードしました。
http://www.inmotionhosting.com/support/files/downloads/PHPMailer_5.2.0.zip
classもインターネットから拝借したままですが、timezoneの設定でエラーが出ていたので改修しました。

php

1 public static function RFCDate() { 2// $tz = date('Z'); 3// $tzs = ($tz < 0) ? '-' : '+'; 4// $tz = abs($tz); 5// $tz = (int)($tz/3600)*100 + ($tz%3600)/60; 6// $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz); 7 date_default_timezone_set('Asia/Tokyo'); 8 $date = time(); 9 $result = date("Y/m/d H:i:s", $date); 10 return $result; 11 } 12

以下に、class.phpmailer.phpの内容を記述しようとしましたが、文字数の関係で、記載できませんでした。

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

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

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

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

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

m.ts10806

2017/09/21 08:15

文字化けにも様々な種類がありますので、具体的にどのように文字化けがおきたのか「○○のはずが××と表示される」といった形式でご提示願います。難しければスクリーンショットでも構いません。
sake

2017/09/21 09:05

件名「メールテストです。」が「�᡼���ƥ��ȤǤ���」に文字化けします。を追加しました。
scsi

2017/09/21 10:38

確認したメーラーも書くといいと思います!
guest

回答2

0

ベストアンサー

試験して確認したので、そのままのコードを記します。
ほぼ、そのままのコードにしています。ライブラリの場所やメールの配送先は伏せておりますが・・・

php

1<?php 2 require_once("class.phpmailer.php"); 3 4 //言語設定、内部エンコーディングを指定する 5 mb_language("japanese"); 6 mb_internal_encoding("UTF-8"); 7 8 //日本語添付メールを送る 9 $to = "○○○○○○○@○○○○.ne.jp"; // 宛先 10 $subject = "メールテストです。"; // 題名 11 $body="以下の内容でフォームより送信されました。\n\n"; 12 $body.="本文の内容を入れます\n"; 13 $from = "1234@56789.dip.jp"; // 送り主 14 15 $mail = new PHPMailer(); 16 $mail->CharSet = "UTF-8"; 17 $mail->Encoding = "base64"; 18 19 $mail->AddAddress($to); 20 $mail->From = $from; 21 22 $mail->FromName = $from; 23 $mail->Subject = $subject; 24 $mail->Body = $body; 25 26 $mail->Send(); //メール送信 27?>

ほぼ、原型のままで、件名「メールテストです。」になっていますし、本文も文字化けしていません。

ちなみにこちらの試験環境は
OS FreeBSD 10.3 RELEASE
php56-5.6.31
phpmailer-5.2.24

メーラーは Thunderbird です。
プレーンテキストで Subject を見ると
Subject: =?UTF-8?B?44Oh44O844Or44OG44K544OI44Gn44GZ44CC?=
となっています。

sake さんの受信メールをプレーンテキストで見ると Subject はどのようになっているでしょうか?
そのあたりがヒントになりそうに思います。

投稿2017/09/21 09:14

編集2017/09/21 23:10
showkit

総合スコア1638

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

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

sake

2017/09/21 15:11

アドバイスありがとうございました。 ご指導いただいた通りにしてみましたが、今度は、 件名が「????????????」になってしまいました。
showkit

2017/09/21 23:10

実際に試験してみたので、回答を修正して書き直しています。
sake

2017/09/22 02:31

お手数をお掛けしております。 私の環境は CentOS Linux 7.4.1708 PHP 5.4.16 PHPMailer 5.2 ヤフーメールを使用しています。 プレーンテキストで見るとSubjectは、以下のようになっています。 $mail->Subject = $subject; のとき Subject: =?UTF-8?B?peGhvKXrpcaluaXIpMekuaGj?= $mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8")); のとき Subject: =?ISO-2022-JP?B?Pz8/Pz8/Pz8/Pz8/?=
showkit

2017/09/22 02:43

メッセージをテキストファイル(.eml)に落として Subject: =?UTF-8?B?peGhvKXrpcaluaXIpMekuaGj?= を Subject: =?EUC-JP?B?peGhvKXrpcaluaXIpMekuaGj?= に変更して Thunderbird に食わせたら、件名が表示されました。 これはつまり sake さんのソースコードは EUC で記述していませんか? FTPか何かで バイナリでソースをダウンロードして、sakura エディタ等で開いてみたら ソースのコードがわかるかと思います。
sake

2017/09/22 03:02

ご指摘のとおり、 EUC-JP-MS で記述しています。
showkit

2017/09/22 03:11

ソースが EUC であれば そこで記述している 件名の文字は EUC ですから $mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"EUC-JP","UTF-8")); です。 ソースを EUC にして試験し、正常に受信できることを確認しました。
sake

2017/09/22 03:13

適切な指示、ありがとうございました。 ソースの文字コードを「Unicode(UTF-8)」にして、 $mail->Subject = $subject; で送ったところ、文字化けしないで送信できました。 意外なところに落とし穴がありました。大変勉強になりました。ありがとうございました。
guest

0

mb_encode_mimeheaderの引数がたりないのでは?

$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8"));
↓↓↓
$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8"),"JIS");

JIS変換しないならこうですかね?
※7bitJISは表現できる文字数が限られていますが、昔のメーラーでも文字化けしづらい

PHP

1$mail->Subject = mb_encode_mimeheader($subject,"UTF-8");//typo修正

投稿2017/09/22 01:17

編集2017/09/22 02:44
yambejp

総合スコア114769

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

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

sake

2017/09/22 02:42

ありがとうございます。 $mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8"),"JIS"); のときの件名は、「????????????」 プレーンテキストでは、Subject: =?ISO-2022-JP?B?Pz8/Pz8/Pz8/Pz8/?= となりました。 $mail->Subject = mb_encode_mimeheader($subject),"UTF-8"); のときは、 PHP Parse error: syntax error で、送信できませんでした。
yambejp

2017/09/22 02:47

すみません、カッコのつけかたに一箇所typoがあったので修正しておきました ちなみにサンプルでつかっているsubjectは具体的にどんな文字でしょう 見た感じエンコードがうまくできていないように見えますが・・・
sake

2017/09/22 02:59

ありがとうございます。 件名:「メールテストです。」 修正いただいたソースで送ったところ、 件名:「?᡼?????ȤǤ???」 詳細ヘッダーには、 Subject: =?UTF-8?B?P+GhvD8/Pz8/yKTHpD8/Pw==?= となりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問