我想在laravel 4.2中将CSV文件作为附件发送给电子邮件 我已经生成了一个csv文件,但没有任何线索可以通过电子邮件发送它。
这是调用csv方法的控制器 -
$this->report->generateCSV($schedule_type->name,$schedule_type->date_from,$schedule_type->date_to,$schedule_type->company_name,$csvHeader,$reportData,$filename.'.csv',';',$array);
这是生成输出的函数
public function generateCSV($reportname,$startdate,$enddate,$companyname,$csvHeader,$csvDataArray,$filename='report.csv',$delimiter=';',$elementsOfCSV = array()){
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename='.$filename);
$fp = fopen('php://output', 'w');
fputcsv($fp, array(' ', ' ' ), $delimiter);
fputcsv($fp, array(' ','Report Name : ',$reportname), $delimiter);
fputcsv($fp, array(' ','Run date : ',date('Y-m-d')), $delimiter);
fputcsv($fp, array(' ','Date period being reported : ',$startdate.' to '.$enddate), $delimiter);
if($companyname)
fputcsv($fp, array(' ','Client Company : ',$companyname), $delimiter);
fputcsv($fp, array(' ',' ',' '), $delimi ter);
fputcsv($fp, array(' ',' ',' '), $delimiter);
fputcsv($fp, $csvHeader, $delimiter);
$i= $avgTimeTaken = $avgPercentage = 0;
$totalRow = count($csvDataArray);
if($totalRow > 0){
foreach ($csvDataArray as $k=>$data) {
$csvData[$k][$i] = ' ';
foreach ($data as $key=>$line) {
if(in_array($key, $elementsOfCSV)){
if($key=='time_taken'){
$line = gmdate("H:i:s", $line);
}
$csvData[$k][$key] = $line;
}
}
fputcsv($fp, $csvData[$k], $delimiter);
$i++;
}
}
fclose($fp);
}
我知道如何发送附件。我用它作为附件发送PDF文件
Mail::send('site/user/mailcertificate', array('key' => 'value'), function($message) use ($pdfPath, $userDetails)
{
$message->from('abc@gmail.com', 'Message Subject');
$message->to($userDetails['userEmail'], $userDetails['userName'])->subject('Assessment Certificate');
$message->attach($pdfPath);
}
但是这里写的功能迫使我下载CSV文件。 那么如何才能将其作为电子邮件附件发送?
答案 0 :(得分:2)
您应该生成CSV并将其保存在public/some-folder
中,然后从那里附加。而不是生成CSV并下载它。
答案 1 :(得分:0)
我得到了一个简单的解决方案。
首先,我手动在目标文件夹中创建了一个空白的.csv
文件。
假设在目录"Report.csv"
内创建了名为public/uploads/report.csv
的文件。
然后这是一件容易的事。
我使用以下命令打开了用于编写内容的文件 -
$fp = fopen(public_path('uploads/report.csv'), 'w');
此处w
用于删除文件的最后一个内容并授予插入新数据的权限。
现在我使用以下行来附加邮件
define('CSV_Ddefine('CSV_DIR', public_path('uploads'));
if (!is_dir(CSV_DIR)){
mkdir(CSV_DIR, 0755, true);
}
$outputName = str_random(10);
$csvPath = CSV_DIR.'/report.csv';
foreach($emails as $email) {
Mail::send('admin/report/mailscheduledreport', array('filename' => $filename), function($message) use ($csvPath, $email)
{
$message->from('info@abc.com', 'Reports');
$message->to($email)->subject('Reports');
$message->attach($csvPath);
});
}