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

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

ただいまの
回答率

88.09%

メール送信で添付ファイルを送ることが出来ません

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,350

score 17

PHP初心者の者です。入力画面からファイルを選択して、確認画面を遷移する際に一度ローカル環境のサーバーに選択したファイルをアップロードして、確認画面で「送信する」ボタンをクリックすると、ファイル付きのメールを送信するという処理を作成しています。

現在添付ファイル付きのメールを送信すると、添付ファイルがなぜかファイル名が文字化けしてテキストファイルになってしまい、更に本文が何も記載されていない状態になってしまいます。私が自分でデバックをしたところ、
1.入力画面からファイルを選択する
2.ローカル環境のサーバーに選択したファイルをアップロードする

以上2点は出来ていました。なので、確認画面から「送信する」ボタンをクリックした後の処理で何か問題があると思うのですが、
どうしても原因が分かりません。添付ファイル付きのメールを送信したときの結果が、以下の写真の通りになります。
(今回はPDFファイルを添付しました。)
イメージ説明

また、以下のサイトを参考にしました。
リンク内容

ちなみに各画面および内部処理のソースコードは以下の通りになります。
(メール送信に関係のある部分のみ抜粋してあります)

入力画面

<form action="/lifeone/php/makeSure.php" method="post" enctype = "multipart/form-data">
 <input type ="hidden" name = "MAX_FILE_SIZE" value = "102400">
 <input type = "file" width = "120" name = "sendfile" />
<input name="submit" type="submit" id="submit" value="確認画面へ">

確認画面 makesure.php

<form action="/lifeone/php/mailsend.php" method="post">

<?php
if(isset($_FILES['sendfile']['name'])){
    $fname = $_FILES['sendfile']['name'];
    $temp = $_FILES['sendfile']['tmp_name'];
    $target = '../file/' . $fname;

    if(move_uploaded_file($temp, $target)){
        //ファイルパスを設定
        echo "<input type = hidden name = filepath value = '" . $target . "' />";
        }

    }//if
?>
<input name="submit" type="submit" id="submit" value="送信する" />


メール送信処理 mailsend.php

mb_language("ja");

//各項目をShift-JISに変換
//件名
if(isset($_POST['submit'])){

$title = mb_encode_mimeheader(mb_convert_encoding("メールタイトル", "JIS", "utf-8"),"JIS");

//送信先アドレス
$to = mb_convert_encoding("○○○○○○@△△△△.or.jp", "JIS", "utf-8");

if(isset($_POST['fname'])){
    //添付ファイルがある場合
    $filepath = $_POST['filepath'];
    $boundary = "__BOUNDARY__";
    $message1 = "\n" . "--" . $boundary . "\n";

    $message2= $message1 . "Content-Type: " . mime_content_type($filepath) . "; name=\"" . basename($filepath) . "\n";
    $message3= $message2 . "Content-Disposition: attachment; filename=" .basename($filepath) . "\n";
    $message4= $message3 . "Content-Transfer-Encoding: base64\n";

    $message5= $message4 . chunk_split(base64_encode(file_get_contents($filepath))). "\n";
    $message6= $message5 . "--" . $boundary . "--";

}//if

//内容
$message = "--" . $boundary . "\nContent-Type: text/plain; charset=\ISO-2022-JP\\n\n" .mb_convert_encoding($honbun , "JIS" , "utf-8") . $message6;

//送信元メールアドレス
$from = "Content-Type: multipart/mixed; boundary=\"" . $boundary . "\"\n" ."From: " . $mailaddress1;

$xmail = "X-Mailer: PHP/". phpversion();

$i = 0;
if(mail($to, $title, $message, $from . "\r\n" . $xmail)){

    $_SESSION['error' . $i] = "お問い合わせ内容を送信しました。";

}else{

    $_SESSION['error' . $i] = "お問い合わせ内容を送信できませんでした。";

}//if

}//if

恐れ入りますがどなたか原因に心辺りがある方はご回答頂けると幸いです。よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • ockeghem

    2017/03/08 12:41

    送信されたメールのソースを添付いただけると、分析がしやすいと思います。

    キャンセル

  • KentaroOnoda

    2017/03/09 19:22

    ご連絡ありがとうございます。メールのソースというのは、送信処理のソースコードのことでしょうか?それとも添付ファイルのことでしょうか?

    キャンセル

回答 2

+2

マルチパートであると、
Content-Type: multipart/mixed;boundary="BOUNDARY"
をヘッダに追加してやる必要があります。

なんですが…… mail に渡している引数、なんかおかしいような……

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/08 11:39

    ご回答ありがとうございます。ご指摘頂いた内容を基に自分なりにメール送信処理部分のコードを修正したところ、今度は添付ファイルがテキストファイルになってしまい(今回PDFファイルを添付しました)、更に本文が何も表示されないという状態になってしまいました。(詳しくは質問内容を更新しましたので、ご確認頂けると幸いです。)何か原因に心当たりがございましたら、ご回答の程宜しくお願いします。

    キャンセル

  • 2017/03/08 12:16

    添付したファイル名、日本語を含んでいますよね?
    なのでファイル名についても MIME エンコードしてやらねば駄目ですよ。

    参考にされた Web サイトでは、mail() ではなく、日本語対応の mb_send_mail() を使っているから、その辺あいまいですけど。

    キャンセル

  • 2017/03/09 19:23

    ご回答ありがとうございます。ファイル名についてもエンコードしてみましたが、それでも上手くいきませんでした。なので、Mailパッケージを使ってみます。

    キャンセル

0

ちょっと冗長な気がしますが、こちらの記事は参考になりませんか?
http://qiita.com/ShibuyaKosuke/items/78c8673782ebbf51584b

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/03/10 09:36

    ご回答ありがとうございます。参考にしてみます。

    キャンセル

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

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

関連した質問

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