1

ログデータを生成して、形式でメールに送信する必要がありcsvます。これが私のコードです:

public function sendMail(){
    $csv = $this->createCSV();
    $subject = $this->getMessage('subject');
    $message = $this->getMessage('message');
    $headers = $this->generateHeaders($csv, $message);

    mail('my_mail@gmail.com', $subject, $message, $headers);
}

private function createCSV(){
    $data = $this->getAVG();

    $csv = fopen('php://temp', 'w+');

    // long statistics generation

    fclose($csv);

    return $csv;
}

private function generateHeaders($file, $message){
    $boundary = md5(uniqid(time()));

    $headers = 'MIME-Version: 1.0'."\r\n";
    $headers .= 'Content-Type: multipart/mixed; boundary="'.$boundary."\"\r\n";  
    $headers .= 'From: noreplay@'.$_SERVER['SERVER_NAME']."\r\n";

    $headers .= '--'.$boundary."\r\n";

    $headers .= "Content-Type: text/html; charset=utf-8\r\n";
    $headers .= "Content-Transfer-Encoding: base64\r\n";
    $headers .= "\r\n";
    $headers .= chunk_split(base64_encode($message));

    $headers .= '--'.$boundary."\r\n";

    $headers .= "Content-Type: text/csv; name=\"ServersLogs.csv\"\r\n";
    $headers .= "Content-Transfer-Encoding: base64\r\n";
    $headers .= "Content-Disposition: attachment; filename=\"ServersLogs.csv\"\r\n";
    $headers .= "\r\n";
    $headers .= chunk_split(base64_encode(readfile($file)));

    $headers .= "\r\n--".$boundary."--\r\n"; 

    return $headers;
}

問題は、サーバーにファイルを保存できないことです。そのため、php://を使用しますが、ファイルを読み取れない後...

4

2 に答える 2

0

generateHeaders() 呼び出しの後にファイルを close() し、readfile() の代わりに fread() を使用する必要があります。読む前に fseek($file, 0, SEEK_SET) することを忘れないでください。

ところで、データを一時ファイルに保存して、generateHeaders() で再度読み取るようにします。生成された統計データを $file リソースの代わりに generateHeaders() に渡してみませんか?

于 2013-02-20T10:09:58.943 に答える
0

$csv = fopen('php://temp', 'w+');- この行はリソース (ハンドラー) を作成します。これはファイル名ではありません。

fclose($csv);- この行のリソースは閉じられており、もう使用できません。
したがってreturn $csv;、使用可能なものは返されません。

readfile($file)- この関数は、閉じたリソースのハンドラではなく、最初の引数としてファイル名を必要とします。

ファイルまたは一時メモリストレージが必要な理由がまったくわかりません-変数を使用してください(グローバルではありません)。とにかく、データ全体がメモリ内にあります。

于 2013-02-20T10:00:15.447 に答える