【问题标题】:Generate CSV file and directly sent it with email laravel生成 CSV 文件并直接用邮件 laravel 发送
【发布时间】:2020-12-04 21:45:26
【问题描述】:

Halo 伙计们,我是 laravel 的新手。我现在使用 laravel 6。现在我正在生成 CSV 文件并通过电子邮件发送。

问题是:

  1. 我仍然对如何生成 CSV 文件并将其放入服务器文件夹感到困惑。假设我想将 CSV 文件保存到我的服务器文件夹 public/export/
  2. 如何通过电子邮件发送生成的 CSV 文件?

这就是我所做的

        $reports = User::all()->get();
        $rows = [];
        foreach ($reports as $key => $value) {
            $rows[$key]['id'] = $value->social_media_id;
            $rows[$key]['name'] = $value->name;
            $rows[$key]['address'] = $value->address;
            $rows[$key]['phone'] = $value->phone; 
        } 

        $fileName = 'file.csv';
        $headers = [
            "Content-type" => "text/csv",
            "Content-Disposition" => "attachment; filename=" . $fileName,
            "Pragma" => "no-cache",
            "Cache-Control" => "must-revalidate, post-check=0, pre-check=0",
            "Expires" => "0"
        ];

        $columnNames = [
            'ID',
            'name',
            'address',
            'phone'
        ];
        $callback = function() use ($columnNames, $rows ) {
            $file = fopen('php://output', 'w');
            fputcsv($file, $columnNames);
            foreach ($rows as $row) {
                fputcsv($file, $row);
            }
            fclose($file);
        };
        return response()->stream($callback, 200, $headers));

如何修改此代码以将 Generate CSV 文件存储在我的服务器文件夹中 public/export/ 的位置?

然后我如何通过电子邮件发送?

请指教。

【问题讨论】:

  • 有运气吗?
  • 还没有解决

标签: laravel csv email


【解决方案1】:
  1. fputcsv() 将行格式化为 CSV,因此这里不需要 $headers。此外,您不需要 php://output,因为它用于在您不需要将其保存在本地时发送到浏览器。所以代码看起来像这样:


    $reports = User::all()->get();
    $fileName = 'file.csv';
    $columnNames = [
        'ID',
        'name',
        'address',
        'phone'
    ];
    
    $file = fopen('public/export/' . $fileName, 'w');
    fputcsv($file, $columnNames);
    
    foreach ($reports as $report) {
        fputcsv($file, [
             $report->id,
             $report->name,
             $report->address,
             $report->phone,
        ]);
    }
    
    fclose($file);

  1. 使用此 csv 发送电子邮件的最快方法:


    Mail::send('your.email.blade.layout', [], function($message) use ($fileName)
    {
        $message->to('example@gmail.com')->subject('CSV email');
        $message->attach('public/export/' . $fileName);
    });

但如果您通过 mailable 类发送会更好(文档:https://laravel.com/docs/6.x/mail)。

另外别忘了你没有唯一的文件名,所以每次都会被覆盖。

【讨论】:

    猜你喜欢
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    • 2015-02-26
    相关资源
    最近更新 更多