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

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

ただいまの
回答率

90.53%

  • PHP

    20252questions

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

添付ファイルが本文に入ってしまう

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 967

sake

score 7

こちらのサイトを参考に、メールを解析していますが、添付ファイルにbatファイル・vbsファイル・iniファイル等、メモ帳で編集できるファイルを添付すると、添付ファイルの内容が本文に入ってしまい。肝心の本文がなくなってしまいます。

使用しているPHPスクリプト

#!/usr/bin/php
<?php
    $stdin = fopen("php://stdin", "r");
    $header = "";
    $_header_write = true;
    $raw_mail = "";
    $ketasuu = array();

    do {
        $line = fread($stdin, 4096);
        if (strlen($line) == 0) break;
        if ( $n = strpos($line, "\n\n")){ //空行を見つけた
            $header .= substr($line, 0, $n);
            $_header_write = false;
        }
        if ($_header_write) $header .= $line;
        $raw_mail .= $line ;//. PHP_EOL;
    } while(true);
    fclose($stdin);

    require_once('/usr/local/bin/ReceiptMailDecoder.class.php');

    $decoder =& new ReceiptMailDecoder($raw_mail);

    //X-Original-Toを取得する
    $deliveredto =  $decoder->getDeliveredTo( 'x-original-to' );

    //$deliveredtoからアカウントを取得
    $deliveredaccount = strstr($deliveredto, "@", true);

    //$deliveredtoからドメインを取得
    $mydomain = strstr($deliveredto,"@");
    $mydomain = str_replace('@', "", $mydomain);

    //fromを取り出す
    $subfrom = $decoder->getFromAddr('from');
    $fromtxt = $subfrom;

    //件名を取得する
    $subject = $decoder->getDecodedHeader( 'subject' );
    $subject = mb_convert_encoding($subject,"UTF-8",mb_detect_encoding($subject, "ASCII,JIS,UTF-8,CP51932,SJIS-win,iso-2022-jp", true));

    $body = "";
    //本文を取得する
    //text/planなメール本文を取得する
    $body = mb_convert_encoding($decoder->body['text'],'UTF-8','auto');
    if (empty($body)){
        //text/htmlなメール本文を取得する
        $body = mb_convert_encoding($decoder->body['html'],'UTF-8','auto');
        $body = mb_convert_encoding($body,'UTF-8',mb_detect_encoding($body, 'ASCII,JIS,UTF-8,CP51932,SJIS-win,iso-2022-jp','auto'));
    };

    //マルチパートのデータを取得する
    if ( $decoder->isMultipart() ) {
        $tempFiles = array();
        $num_of_attaches = $decoder->getNumOfAttach();
        for ( $i=0 ; $i < $num_of_attaches ; ++$i ) {
            /*
            * ファイルを一時ディレクトリ _TEMP_ATTACH_FILE_DIR_ に保存する
            * 一時ファイルには tempnam()を使用する
            */
            $fpath = tempnam( _TEMP_ATTACH_FILE_DIR_, "todoattach_" );
            print "fpath=$fpath <br>\n";
            if ( $decoder->saveAttachFile( $i, $fpath )) {
                $tempFiles["$fpath"] = $decoder->attachments[$i]['mime_type'];
                //取り込んだ添付ファイルの名前を取得
                foreach (glob($fpath."*") as $filename) {
                    if (filesize($filename) >0){
                        //指定した文字数以降の文字列を取得
                        $cpname = $deliveredaccount."_".substr($filename, strlen($fpath));
                        $cpname = mb_convert_encoding($cpname,'UTF-8',mb_detect_encoding($cpname, 'ASCII,JIS,UTF-8,CP51932,SJIS-win,iso-2022-jp','auto'));
                        //サイズが0(ゼロ)より大きいとき
                        if ($tmpchk == "") {
                            $tmpchk = $cpname;
                        } else {
                            $tmpchk .= ', '.$cpname;
                        };
                        $cpname = "/home/userdir/".$cpname;
                        //ファイルをコピーする
                        var_dump(copy( $filename, $cpname ));
                        //ファイルを削除する
                        var_dump( unlink($filename) );
                        var_dump( unlink($fpath) );
                    };
                };
            };
        };
    };

    //bodyからhtmlタグを取り除く(改行のみ残す)
    $honbun = strip_tags($body,'<br>');

    $osirase = "*******************************************************\n";
    $osirase .= "  お知らせ\n";
    $osirase .= "  ".$subfrom."\n";
    if (empty($tmpchk)) {
        $osirase .= "\n";
    } else {
        $osirase .= "  添付ファイル:".$tmpchk."\n";
    };
    $osirase .= "*******************************************************\n\n";

    $subto='<'.$deliveredaccount.'@xxxxxxx.com>';

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

    //日本語メール送信
    $atesaki = $subto;
    $kenmei = $subject;
    $naiyou = $osirase.$honbun;
    $from = $fromtxt;

    //送信
    echo mb_send_mail($atesaki,$kenmei,$naiyou,'From:'.$from);
?>


エクセルファイルを添付したとき

*******************************************************
 お知らせ 
 user-a@xxxx.com様からのメールです。
  添付ファイル:検索項目.xlsx
*******************************************************
テストメール


batファイルを添付したとき

*******************************************************
 お知らせ
 user-a@xxxx.com様からのメールです。
*******************************************************
 pause
 pause
 cd c:\aaa
 move /y c:\aaa\cartier4.htm c:\bbb
 move /y c:\aaa\omega4.htm c:\bbb
 move /y c:\aaa\corum4.htm c:\bbb
 move /y c:\aaa\tudor4.htm c:\bbb
 move /y c:\aaa\bleitling4.htm c:\bbb
 pause 


上記メールの本体です

Return-Path: <user_1@exempl_1.com>
X-Original-To: user_2@exempl_2.com
Delivered-To: user_2@exempl_2.com
Received: from exempl_3.com (mailsv03.exempl_3.com [10.130.201.17])
    by exempl_2.com (Postfix) with ESMTP id 9A17055C20
    for <user_2@exempl_2.com>; Wed, 12 Apr 2017 01:20:02 +0900 (JST)
Received: from exempl_3.com (localhost [127.0.0.1])
    by exempl_3.com (Proxmox) with ESMTP id D64BC10FC520
    for <user_2@exempl_2.com>; Wed, 12 Apr 2017 01:20:12 +0900 (JST)
Received: from outd2.commnd.jp (outd2.commnd.jp [219.117.35.72])
    by exempl_3.com (Proxmox) with ESMTP id 5921D10FCE54
    for <user_2@exempl_2.com>; Wed, 12 Apr 2017 01:20:05 +0900 (JST)
Received: from TEVAAV12.commnd.jp (TEVAAV12.sv.commnd.jp [192.168.41.152])
    by TEVAOUTD02.sv.commnd.jp (Postfix) with ESMTP id 633464003B
    for <user_2@exempl_2.com>; Wed, 12 Apr 2017 01:20:05 +0900 (JST)
Received: from pps.filterd (TEVAAV12.commnd.jp [127.0.0.1])
    by TEVAAV12.commnd.jp (8.16.0.17/8.16.0.17) with SMTP id v3BFQKOI026949
    for <user_2@exempl_2.com>; Wed, 12 Apr 2017 01:20:05 +0900
Received: from tevain03.sv.commnd.jp (TEVAIN03.sv.commnd.jp [192.168.40.23])
    by TEVAAV12.commnd.jp with ESMTP id 29pf4hsw8f-1
    for <user_2@exempl_2.com>; Wed, 12 Apr 2017 01:20:05 +0900
Received: from exempl_1.com (14-133-71-20.dz.commnd.jp [14.133.71.20])
    by TEVAIN03.sv.commnd.jp (Postfix) with ESMTPA id 3F6524003C
    for <user_2@exempl_2.com>; Wed, 12 Apr 2017 01:20:05 +0900 (JST)
Received: from [10.130.200.224] (p199075.mirai.ne.jp [210.172.199.75])
    by exempl_1.com (Postfix) with ESMTPSA id 9AE6B83A8802
    for <user_2@exempl_2.com>; Wed, 12 Apr 2017 01:20:04 +0900 (JST)
To: user_2@exempl_2.com
From: user_1 <user_1@exempl_1.com>
Subject: =?UTF-8?B?MeODhuOCueODiOODoeODvOODqw==?=
Message-ID: <83f0e40a-ad17-90ed-4301-683bf404578e@detox.dip.jp>
Date: Wed, 12 Apr 2017 01:19:54 +0900
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:52.0) Gecko/20100101
 Thunderbird/52.0
MIME-Version: 1.0
Content-Type: multipart/mixed;
 boundary="------------B1E5A46C90073A442978500A"
Content-Language: en-US
X-Proofpoint-Virus-Version: vendor=nai engine=5800 definitions=8495 signatures=668451
X-SPAM-LEVEL: Spam detection results:  0
    RCVD_IN_DNSWL_NONE     -0.0001 Sender listed at http://yahoo.co.jp/, no trust

This is a multi-part message in MIME format.
--------------B1E5A46C90073A442978500A
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 8bit

テストメール


--------------B1E5A46C90073A442978500A
Content-Type: text/plain; charset=UTF-8;
 name="copy.bat"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename="copy.bat"

IHBhdXNlDQogcGF1c2UNCiBjZCBjOlxhYWENCiBtb3ZlIC95IGM6XGFhYVxjYXJ0aWVyNC5o
dG0gYzpcYmJiDQogbW92ZSAveSBjOlxhYWFcb21lZ2E0Lmh0bSBjOlxiYmINCiBtb3ZlIC95
IGM6XGFhYVxjb3J1bTQuaHRtIGM6XGJiYg0KIG1vdmUgL3kgYzpcYWFhXHR1ZG9yNC5odG0g
YzpcYmJiDQogbW92ZSAveSBjOlxhYWFcYmxlaXRsaW5nNC5odG0gYzpcYmJiDQogcGF1c2Ug

--------------B1E5A46C90073A442978500A--


エクセルファイルとbatファイルの2つを添付してもbatファイルの内容が本文に入ってしまいます。
何か解決方法があったら教えてください。
よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Zuishin

    2017/04/12 13:59

    $honbun を追加したあと、動作チェックはしましたか?

    キャンセル

  • sake

    2017/04/12 14:14

    チェックしました

    キャンセル

  • Zuishin

    2017/04/12 14:31

    どうなりましたか?

    キャンセル

回答 1

checkベストアンサー

0

追記ここから:

時間がとれたので、検証しようとしましたが、小生の環境には
ReceiptMailDecoder.class.php
がなく、ご提示されたコードを実行出来ませんでした。
お力になれず、すみません。

追記ここまで:

今、検証する時間が取れないので、多分ですが、

ご使用のコードでは、テキストファイルは「添付ファイル」なふりをしながら
Content-Type: text/plain; charset=UTF-8;
なので、受信メールソフトがbase64デコードしてしまい、
本文に表示されている、、、と推測してます。

下記他を参照して、テキストファイルの添付が「Content-Type: text/plain;」にならないロジックを探ってみてください。(この見解自体、まったく根拠・自信なしです。)
前述の通り未検証なので、的外れかもしれないので、他の識者の回答を待つ方がよいかとは思います。

<添付ファイル付のメール送信>
添付ファイル付きメールをmb_send_mail()関数で送信する

試行願い:
ご提示されたコードにて
copy.batをcopy.xlsと拡張子だけを替えて添付してみてください。
多分、添付ファイルになると思います。
もしそうなって、copy.batも添付ファイルとしたいのならば、mb_send_mail()ではなくmail()を使用してください。
MIMEタイプ一覧

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/04/15 13:09

    アドバイスありがとうございました。
    拡張子を変えたら添付ファイルとして認識しました。しかし、だれから送られてくるか分からないので周知徹底することはできません。
    mail()は試しました。これはContent-Typeが付かないから、本文を取得できなかったのであきらめました。
    今後の運用としては、このような添付ファイルを送ってきた人には理由を説明して再送してもらうようにします。
    貴重な時間を割いていただいて、ありがとうございました。

    キャンセル

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

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

関連した質問

  • 解決済

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

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

  • 解決済

    IndentationError: expected an indented block  原因はな...

    Raspberry Pi を使って人感センサーに反応したらiPhoneにお知らせする物を作りたいと思い、調べたところ下記のサイトを発見しました。 https://www.sho-

  • 受付中

    pythonでmysqlconnectorを使う際

    pythonでmysqlを操作して、日本語を取り出しその後それをcsvに書き込みたいのですが、 res = cursor.fetchall() で取り出した後に、どこかで .

  • 受付中

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

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

  • 解決済

    PHPメール送信でPDFを添付しましたが、メール本文が表示しません。

    sendmailでPDFを添付しました。 それで送られたメールを確認すると、添付ファイル以外何も入ってません、メール本文も出てませんでした。 本文を出すにはどうしたらいいで

  • 解決済

    サイトを文字化けを解決したい

    プログラミング初心者です。 ほとんど書いたことがありません。 ですのでネットで調べながら質問しています。 前提・実現したいこと サイトを文字化けせずに表示したい

  • 解決済

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

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

  • 解決済

    PHPからのメールで文字化けする

    phpで一斉メールを送ろうと思っています。 お名前コムの共有サーバーを使っています、下記テストで30人ほどに一斉送信を繰り返したところ 一度負荷がかかり過ぎという事で制限をされた際

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

  • PHP

    20252questions

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