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

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

ただいまの
回答率

88.83%

mb_send_mailのbodyの文字化け対応

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,501

AkiraSonoda

score 24

mb_send_mailで1行に大量の文字を入力してメールを送信すると文字化けが発生しました。

1行に大量の文字が入力された際に、
文字化けしないように改行させれば問題解決できると考えています。
解決方法をご存知でしたら、ご教授ください。

ご指摘ありがとうございます。
ソースコードを記載させていただきます。
mb_send_mailのメールアドレスの箇所はhogeにさせていただいています。

<html>
<head>
</head>
<body>
  <form action="./mailtest.php" method="POST">
    <textarea name="test"></textarea>
    <input type="submit" value="送信">
  </form>
  </body>
</html>
<?php
  mb_internal_encoding('UTF-8');
  mb_language('ja');

  $subject = 'テスト';
  $body = $_POST['test'];
  $from = 'hoge@hoge.com';

  mb_send_mail('hoge@hoge.com' , $subject, $body, 'From: ' . $from);
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • 退会済みユーザー

    退会済みユーザー

    2016/08/05 01:05

    実際に問題が発生するソースコードを提示ください。

    キャンセル

  • AkiraSonoda

    2016/08/05 01:23

    ご指摘ありがとうございます。
    ソースコードを記載させていただきました。

    キャンセル

回答 3

+1

文字化けに関しては複数の原因が考えられるので、

  • html に文字コード指定
<html>
    <head>
        <meta charset="UTF-8"> // <- これを入れる
    </head>
    <body>
  • ファイル自体が、UTF-8 以外で保存されていないかを確認。
    → Windows のメモ帳とか使っちゃダメ。複数の文字コードに対応したテキストエディタを使用すべし。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/11 19:54

    返信ありがとうございます。
    文字コードはUTF-8で統一しています。

    キャンセル

0

// 改行を入れる文字数
$line_width = 30;
$str_num = mb_strlen($_POST['test'], "UTF-8");
$message_kaigyou = null;
for($i=0;$i<$str_num;$i++) {
    if ($i%$line_width == 0) {
        $message_kaigyou .= "\n";
    }
    if ($message_kaigyou == null) {
         $message_kaigyou  = "";
    }
    $message_kaigyou .= mb_substr($_POST['test'], $i, 1, "UTF-8");
}
mb_send_mail ( $to , $subject , $message_kaigyou);


書き方はよくないのですがこれで30文字ごとに改行が入ります。
改行によって文字化けの問題が解決した場合は入力されてる文字列がなんだったのかちょっと気になります

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/05 02:01

    返信ありがとうございます。

    確かに30文字ごとに改行は入りますが、
    テキストエリアからPOSTされますので、
    このソースコードだと箇条書きで文章を入力した場合でも、途中で改行されてしまいます。
    例えば1行の入力制限が10文字だった場合に

    あああああいいいいいううううう
    えええええおおおおおかかかかか

    と入力された場合に

    あああああいいいいい
    ううううう
    えええええおおおおお
    かかかかか

    のように実装できるかを考えていました。
    説明不足で大変申し訳ございませんでした。

    キャンセル

  • 2016/08/05 02:34

    すいません、1行に大量の文字があり改行したら文字化けがなくなるのではないかという事だったので箇条書きされる想定ができませんでした。

    キャンセル

0

$body = $_POST['test'];


の行を

$body = mb_convert_encoding($_POST['test'], 'UTF-8', 'auto');


と変更してテストしていただけますか。

もしこれで文字化けしなくなるようでしたら、POSTされた文字列の文字コードがUTF-8ではないということだと思われます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/08/09 21:41

    返信ありがとうございます。
    文字化けしましたので、文字コードの問題ではないということがわかりました。
    ※bodyに改行せず1,500文字入れてみたら文字化けしました。

    キャンセル

  • 2016/08/10 08:18

    うーん。そうですか。

    HTMLファイルとPHPファイルの漢字コードはUTF-8でしょうか?
    あと、php.iniファイルの[mbstring]セクションで
    mbstring.internal_encoding
    はどう設定されていますか?

    $subject = 'テストテストテストテストテストテストテストテストテストテストテスト';
    のようにsubject文字列を長くすると文字化けしますか?

    キャンセル

  • 2016/08/11 19:53

    返信ありがとうございます。
    文字コードはUTF-8で設定しています。

    件名は固定のため試していなかったのですが、こちらは文字化けしていないみたいです。

    キャンセル

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

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

関連した質問

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