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

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

ただいまの
回答率

88.13%

PHPメール送受信、一部メーラーでうまく表示しない

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,955

score 98

イメージ説明

From: =?ISO-2022-JP?B?GyRCJUYlOSVIGyhC?= <hoge@hoge.com> 

Content-Transfer-Encoding: 7bit

Content-type: multipart/mixed; boundary="e5db8e22e488e44fc4748bc3f91d0556"
Message-Id: <20160701083717.5543663AAB@localhost.localdomain>
Date: Fri,  1 Jul 2016 17:37:17 +0900 (JST)

--e5db8e22e488e44fc4748bc3f91d0556
Content-Type: text/plain; charset="ISO-2022-JP"
Content-Transfer-Encoding: 7bit

テスト様より、下記内容でお問い合わせが届いています。

■お名前
テスト


PHPメールフォームを作成しています。
yahooやgmailなどではなんの問題なく表示されますが。
会社のメーラー(Becky!)では上記のようにヘッダー情報などが本文に出てしまいます。
何が問題だと考えられますか?

ソースを追加すると

public function adminSend() {
    // 送信先の設定
    foreach ($this->adminArray as $value) {
      $this->sendMail[] = mb_encode_mimeheader($this->adminName, "ISO-2022-JP-MS","UTF-8") ." <" . trim($value) . ">";
    }

    // タイトルの設定
    $this->sendTitle = "{$this->requiredItem["name"]}様よりお問い合わせ";
    $this->sendTitle = mb_encode_mimeheader($this->sendTitle, "ISO-2022-JP-MS","UTF-8");

    // メッセージの設定
    $this->sendMessage = "{$this->requiredItem["name"]}様より、下記内容でお問い合わせが届いています。\n";
    $this->sendMessage .= "\n";
    foreach ($this->submitContent as $key => $value) {
      $this->sendMessage .= "■{$key}\n";
      $this->sendMessage .= "{$value}\n\n";
    }
    $this->sendMessage .= "\n\n";
    $this->sendMessage .= "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    $this->sendMessage .= "[送信日時]".date("Y年m月d日(D) H時i分s秒")."\n";
    $this->sendMessage .= "[IPアドレス]{$this->server["REMOTE_ADDR"]}\n";
    $this->sendMessage .= "[ホスト]{$this->server["REMOTE_HOST"]}\n";
    $this->sendMessage .= "[USER_AGENT]{$this->server["HTTP_USER_AGENT"]}\n";
    $this->sendMessage .= "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
    $this->sendMessage = mb_convert_encoding($this->sendMessage, "ISO-2022-JP-MS","UTF-8");

    //ヘッダーの設定
    $this->sendHeaders = "X-Mailer: PHP5\r\n";
    $this->sendHeaders = "MIME-Version: 1.0\r\n";
    $this->sendHeaders .= "From: ".mb_encode_mimeheader($this->requiredItem["name"], "ISO-2022-JP-MS","UTF-8") ." <{$this->requiredItem["mailaddress"]}> \r\n";
    $this->sendHeaders .= "Content-Transfer-Encoding: 7bit\r\n";

    // 添付ファイルの設定
    if (!empty($this->submitFile)) {
      $this->sendHeaders .= "Content-type: multipart/mixed; boundary=\"{$this->boundary}\" \r\n";

      $tmpMessage = $this->sendMessage;

      $this->sendMessage = "--{$this->boundary}\n";
      $this->sendMessage .= "Content-Type: text/plain; charset=\"ISO-2022-JP\"\n";
      $this->sendMessage .= "Content-Transfer-Encoding: 7bit\n\n";
      $this->sendMessage .= $tmpMessage."\n";

      foreach ($this->submitFile as $key => $value) {
        foreach ($value as $key2 => $value2) {
          $name = $key2;
          $f_encoded = $value2;

          $this->sendMessage .= "\n";
          $this->sendMessage .= "--{$this->boundary}\n";
          $this->sendMessage .= "Content-Type: application/octet-stream; ";
          $this->sendMessage .= "charset=\"ISO-2022-JP\" ";
          $this->sendMessage .= "name=\"".mb_encode_mimeheader($name, "ISO-2022-JP-MS","UTF-8")."\"\n";
          $this->sendMessage .= "Content-Transfer-Encoding: base64\n";
          $this->sendMessage .= "Content-Disposition: attachment; ";
          $this->sendMessage .= "filename=\"".mb_encode_mimeheader($name, "ISO-2022-JP-MS","UTF-8")."\"\n";
          $this->sendMessage .= "\n";
          $this->sendMessage .= "{$f_encoded}\n";
        }
      }

      $this->sendMessage .= "--{$this->boundary}--\n";

    } else {
      $this->sendHeaders .= "Content-type: text/plain; charset=\"ISO-2022-JP\" \r\n";
    }

    // メールの送信 (宛先, 件名, 本文, 送り主(From:が必須))
    foreach ($this->sendMail as $send) {
      @mail($send, $this->sendTitle, $this->sendMessage, $this->sendHeaders);
    }
  }
function sendmail_jpn($to, $subject, $message, $from_email,$from_name, $filepath01, $filepath02)
{
$mime_type = "application/octet-stream";

// 添付ファイルのエンコード
$filename01 = basename($filepath01);
$filename02 = basename($filepath02);


// マルチパートなので、パートの区切り文字列を指定
$boundary = '----=_Boundary_' . uniqid(rand(1000,9999) . '_') . '_';

// 件名のエンコード
$subject = mb_convert_encoding($subject, 'ISO-2022-JP', 'auto');
$subject = mb_encode_mimeheader_ex($subject);

// 本文のエンコード
$message = mb_convert_encoding($message, 'ISO-2022-JP', 'auto');

// toをエンコード
// $to = mb_convert_encoding($mail['to']['name'], "auto", "auto");
$to = "=?ISO-2022-JP?B?" . base64_encode($to) . '?= <' . $to . '>';

// fromをエンコード
$from_name = mb_convert_encoding($from_name, 'ISO-2022-JP', 'auto');
$from = "=?ISO-2022-JP?B?" . base64_encode($from_name) . '?= <' . $from_email . '>';

// 添付ファイルのエンコード01
$filename01 = mb_convert_encoding($filename01, 'ISO-2022-JP', 'auto');
$filename01 = "=?ISO-2022-JP?B?" . base64_encode($filename01) . "?=";

// 添付ファイルのエンコード02
$filename02 = mb_convert_encoding($filename02, 'ISO-2022-JP', 'auto');
$filename02 = "=?ISO-2022-JP?B?" . base64_encode($filename02) . "?=";

// ヘッダーの指定
$head = "";
$head .= "From: {$from}\n";
$head .= "MIME-Version: 1.0\n";
$head .= "Content-Type: multipart/mixed; boundary=\"{$boundary}\"\n";
$head .= "Content-Transfer-Encoding: 7bit";

$body = "";

// 本文
$body .= "--{$boundary}\n";
$body .= "Content-Type: text/plain; charset=ISO-2022-JP;" .
"Content-Transfer-Encoding: 7bit\n";
$body .= "\n";
$body .= "{$message}\n";
$body .= "\n";

// 添付ファイルの処理01
$body .= "--{$boundary}\n";
$body .= "Content-Type: {$mime_type}; name=\"{$filename01}\"\n" .
"Content-Transfer-Encoding: base64\n" .
"Content-Disposition: attachment; filename=\"{$filename01}\"\n";
$body .= "\n";

$fp = fopen( $filepath01, "r" ) or die("Error on mailing. (attachment file cannot open)");
$contents01 = fread( $fp, filesize($filepath01) );
fclose( $fp );
$f_encoded01 = chunk_split(base64_encode($contents01)); //添付ファイルをbase64エンコードする

// 添付ファイルの処理02
$body .= "--{$boundary}\n";
$body .= "Content-Type: {$mime_type}; name=\"{$filename02}\"\n" .
"Content-Transfer-Encoding: base64\n" .
"Content-Disposition: attachment; filename=\"{$filename02}\"\n";
$body .= "\n";

$fp = fopen( $filepath02, "r" ) or die("Error on mailing. (attachment file cannot open)");
$contents02 = fread( $fp, filesize($filepath02) );
fclose( $fp );
$f_encoded02 = chunk_split(base64_encode($contents02)); //添付ファイルをbase64エンコードする

$body .= "{$f_encoded01}\n\r";
//var_dump($body);
$body .= "{$f_encoded02}\n";
$body .= "\n";



if (mail($to, $subject, $body, $head)) {
echo 'sendmail_jpn : OK.';
} else {
echo 'sendmail_jpn : FAILURE.';
}
}


コードが長くて見難いですが一応追加しておきます。二つのコードのエンコードの仕方が違うみたいですが

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • shi_ue

    2016/07/04 10:51

    なんだ、自分で組んだんじゃないんですね。それにbecky!だけなら、becky!の問題でしょう。

    キャンセル

  • 退会済みユーザー

    2016/07/04 10:52

    こちらの質問が他のユーザから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

  • rainbowsix

    2016/07/04 11:49

    申し訳ありませんが一から作れないので流用して作っています。becky!だけの問題かもしれませんがそこを何とかしたいです。
    http://qiita.com/KanaeYou/items/b096f8be1f5bbc5448fa
    ↑のソースで試してみたところbecky!でも問題なくファイルの形で受け取ることができましたがその差がわからなくて困っています。

    キャンセル

回答 2

checkベストアンサー

+1

ヘッダーの部分で\r\nを付けていますが、\nだけにしたらどうですか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/04 13:13

    これだと私も思います。送信直前の状態を一旦ファイルに書き出して、改行コードがCRLFって箇所がないか点検してみると良いでしょうね。

    キャンセル

  • 2016/07/07 11:05

    まさにそれでした。ありがとうございます!

    キャンセル

0

これでしょうか?自分も、メールサーバは違いますが、業務の中で経験したことはあります。

[PHP]mail()でメールヘッダーが本文に・・

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/07/04 12:33

    たぶんqmailの問題ですね。 mail() のマニュアルにも注意がのっています。

    キャンセル

  • 2016/07/04 13:28

    これがまた正解だったんですね。ありがとうございます!

    キャンセル

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

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

関連した質問

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