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

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

ただいまの
回答率

91.03%

  • PHP

    17739questions

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

  • Linux

    3190questions

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

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

解決済

回答 2

投稿 編集

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

sake

score 7

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

メール送信プログラム

#!/usr/bin/php
<?php
    require("/usr/local/bin/PHPMailer/class.phpmailer.php");

    //言語設定、内部エンコーディングを指定する
    mb_language("japanese");
    mb_internal_encoding("UTF-8");

    //日本語添付メールを送る
    $to = "xxxxx@yahoo.co.jp"; //宛先
    $subject = "メールテストです。"; //題名
    $body="以下の内容でフォームより送信されました。\n\n";
    $body.="本文の内容を入れます\n";
    $from = "1234@56789.dip.jp"; //送り主
    //$attachfile = "files/test.xls"; //添付ファイルパス

    $mail = new PHPMailer();
    $mail->CharSet = "UTF-8";
    $mail->Encoding = "base64";

    $mail->AddAddress($to);
    $mail->From = $from;

    //$mail->FromName = mb_encode_mimeheader(mb_convert_encoding($from,"JIS","UTF-8"));
    //$mail->Subject = mb_encode_mimeheader(mb_convert_encoding($subject,"JIS","UTF-8"));
    //$mail->Body = mb_convert_encoding($body,"JIS","UTF-8");
    $mail->FromName = $from;
    $mail->Subject = $subject;
    $mail->Body = $body;

    //添付ファイル追加
    //$mail->AddAttachment($attachfile);
    //$mail->AddAttachment($attachfile2);
    $mail->Send(); //メール送信
?>


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

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

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


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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • mts10806

    2017/09/21 17:15

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

    キャンセル

  • sake

    2017/09/21 18:05

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

    キャンセル

  • scsi

    2017/09/21 19:38

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

    キャンセル

回答 2

checkベストアンサー

+1

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

<?php
    require_once("class.phpmailer.php");

    //言語設定、内部エンコーディングを指定する
    mb_language("japanese");
    mb_internal_encoding("UTF-8");

    //日本語添付メールを送る
    $to = "○○○○○○○@○○○○.ne.jp";     //    宛先
    $subject = "メールテストです。";         //    題名
    $body="以下の内容でフォームより送信されました。\n\n";
    $body.="本文の内容を入れます\n";
    $from = "1234@56789.dip.jp";         //    送り主

    $mail = new PHPMailer();
    $mail->CharSet = "UTF-8";
    $mail->Encoding = "base64";

    $mail->AddAddress($to);
    $mail->From = $from;

    $mail->FromName = $from;
    $mail->Subject = $subject;
    $mail->Body = $body;

    $mail->Send();                //メール送信
?>

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

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

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

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/22 00:11

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

    キャンセル

  • 2017/09/22 08:10

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

    キャンセル

  • 2017/09/22 11: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/?=

    キャンセル

  • 2017/09/22 11:43

    メッセージをテキストファイル(.eml)に落として
    Subject: =?UTF-8?B?peGhvKXrpcaluaXIpMekuaGj?=

    Subject: =?EUC-JP?B?peGhvKXrpcaluaXIpMekuaGj?=
    に変更して Thunderbird に食わせたら、件名が表示されました。

    これはつまり sake さんのソースコードは EUC で記述していませんか?
    FTPか何かで バイナリでソースをダウンロードして、sakura エディタ等で開いてみたら ソースのコードがわかるかと思います。

    キャンセル

  • 2017/09/22 12:02

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

    キャンセル

  • 2017/09/22 12:11

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

    キャンセル

  • 2017/09/22 12:13

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

    キャンセル

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は表現できる文字数が限られていますが、昔のメーラーでも文字化けしづらい

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

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/22 11: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 で、送信できませんでした。

    キャンセル

  • 2017/09/22 11:47

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

    キャンセル

  • 2017/09/22 11:59

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

    キャンセル

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

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

関連した質問

  • 受付中

    PHPのメール送信について

    こんにちは <form method="post" action="email.php">    <input type="text" name="email">    <inpu

  • 解決済

    添付機能付きメールフォームの作成

    前提・実現したいこと PHPでメールフォームの機能を 作っています。 添付機能を新たに追加したいのですがなかなか 上手くいきません。 解決策や実装方法などありましたら教え

  • 受付中

    添付ファイル名が文字化けします。

    メールに添付ファイルをつけて配信したいのですが 届いたメールの添付ファイル名が文字化けしています。 どうすれば文字化けが直るのでしょうか? よろしくお願いいたします。

  • 解決済

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

    PHP5.6から、メール本文に「はしご高」や「たつ崎」などを含む メールを送信したいと考えています。 Gmailなどからメールを送信し、ヘッダーを確認すると以下のようになっ

  • 解決済

    PHPMailer で G Suites のアカウントを使った SMTP 送信がうまくいかない

    現在、PHP から添付ファイル付きのメール送信を行うため、以下のことを試しています。 PHPMailer を使用する メール送信には G Suites のアカウントを

  • 解決済

    PDFファイルを添付したメールを送信したい

    タイトル通りです。 昔csvを添付したメール送信をやった経験があって、今回pdfの添付もしようと思っていますが、添付がうまく行かないです。 エラーも出て来てないため、どこが

  • 解決済

    php7での仕様変更?

    先日このサイトでお聞きしたことの派生なのですが、メールをトリガーとしてphpを起動させるという方法についてお教えください。 メールをトリガーとしてphpを起動させる方法については当

  • 解決済

    Fatal error: Uncaught exception 'PDOException'

    Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity co

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

  • PHP

    17739questions

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

  • Linux

    3190questions

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