【问题标题】:How to send csv as email attachment in laravel 4.2?如何在 laravel 4.2 中将 csv 作为电子邮件附件发送?
【发布时间】:2015-04-30 21:26:15
【问题描述】:

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

【问题讨论】:

    标签: php csv laravel-4 email-attachments


    【解决方案1】:

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

    【讨论】:

    • 简单而实用!生成内容并将其写入文件。
    • 网上有很多可用的资源。请做搜索和工作。这是 php 手册中的一个,检查一下并搜索更多 php.net/manual/en/function.fputcsv.php
    【解决方案2】:

    我有一个简单的解决方案。 首先,我在目标文件夹中手动创建了一个空白 .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);
         });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-31
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-09
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多