如何在laravel 4.2中将csv作为电子邮件附件发送?

时间:2015-04-27 06:52:31

标签: php csv laravel-4 email-attachments

我想在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文件。 那么如何才能将其作为电子邮件附件发送?

2 个答案:

答案 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);
     });
}