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

How to send csv as email attachment in laravel 4.2?

我想在 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 文件。 那么我怎样才能让它作为电子邮件附件发送呢?

您应该生成 CSV 并将其保存在 public/some-folder 中,然后从那里附加它。而不是生成 CSV 并下载它。

我找到了一个简单的解决方案。 首先,我在目标文件夹中手动创建了一个空白 .csv 文件。 假设在目录 public/uploads/report.csv.

中创建了一个名为 "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);
     });
}