我需要以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://,但在它无法读取文件后...
答案 0 :(得分:0)
$csv = fopen('php://temp', 'w+');
- 此行将创建资源(处理程序),它不是文件名。
fclose($csv);
- 此行资源已关闭,不能再使用了
所以return $csv;
不会返回任何可用的内容。
readfile($file)
- 此函数需要filename作为第一个参数,而不是封闭资源的处理程序。
我不明白为什么你需要文件或临时内存 - 只需使用变量(不是全局)。无论如何,整个数据都将存储在内存中。
答案 1 :(得分:0)
你应该在generateHeaders()调用之后关闭()你的文件并使用fread()而不是readfile()。在阅读之前不要忘记fseek($ file,0,SEEK_SET)。
顺便说一句,您将数据保存到临时文件,只是为了在generateHeaders()中再次读取它。为什么不直接将生成的统计数据传递给generateHeaders()而不是$ file resource?