首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用php创建csv文件,并以电子邮件(laravel-9)发送它。

用php创建csv文件,并以电子邮件(laravel-9)发送它。
EN

Stack Overflow用户
提问于 2022-03-31 08:59:04
回答 1查看 529关注 0票数 0

我必须从表单中获取数据,用这些数据生成一个csv文件,然后像邮件上的附件一样发送这个文件。

我创建一个服务来生成我的csvfile:

代码语言:javascript
复制
<?php

namespace App\Services;

class GenerateCsvService {

    /**
     * Create a csv file with the given datas
     */
    public function generateCsvFile($id, $data) {

        $array = [];
        $array[] = ['NOM', 'PRENOM', 'EMAIL', 'NB_EX'];
        $array[] = 
            [$data->nom, 
            $data->prenom, 
            $data->email,
            $data->nb_exemp
        ];
        $file = fopen('/var/www/example-app/storage/app/csv/file' . $id . '.csv', 'w+');

        foreach ($array as $fields) {
            fputcsv($file, $fields);
        }
        fclose($file);
        
        return $file;
    }
}

然后我在我的控制器上使用这个服务:

代码语言:javascript
复制
        // Generate the csv file 
        $generateService = new GenerateCsvService();
        $csvFile = $generateService->generateCsvFile($commandeId, $request);

然后,我从laravel配置MailerService:

代码语言:javascript
复制
<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class CommandMail extends Mailable
{
    use Queueable, SerializesModels;

    public $datas = [];
    public $filename = '';

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($id, $nom, $prenom, $email, $nb_exemplaires)
    {
        $this->datas['Nom'] = $nom;
        $this->datas['Prénom'] = $prenom;
        $this->datas['Email'] = $email;
        $this->datas["Nombre d'exemplaires"] = $nb_exemplaires;
        $this->filename = 'file' . $id . '.csv';
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->from('devtest@g.com')
                    ->subject('Commande de catalogue')
                    ->view('emails.command')
                    ->attachFromStorage('csv', $this->filename);
    }
}

并在我的控制器上调用此服务(就在generateCsvFile服务之后):

代码语言:javascript
复制
        // Send it with the mailerservice
        $mailer = new MailerService();
        $mailer->sendEmail($commandeId, $nom, $prenom, $email, $nb_exemplaires);

此时,表单的每个提交都在/storage/app上生成一个csv文件,并发送一封带有数据和文件的电子邮件。附加的文件有正确的名称,但为空(0KO)。在服务器上,文件是ok (1KO),具有正确的名称和正确的内容。我想这是一个异步问题。我认为邮件发送得太早了,所以文件还没有完全创建。我该怎么做才能防止这种情况发生?

也许可以设置一个定时器,以便在发送电子邮件之前有必要的时间生成文件?是不是太武断了?

或者检查一下文件的大小?

如果有人帮我,我会非常感谢的!

EN

回答 1

Stack Overflow用户

发布于 2022-03-31 09:12:32

是的,你发现这是个异步问题。您可以定义两个作业类:一个基于表单数据生成csv文件,另一个发送电子邮件。在表单提交时,将两个类的作业链分配给Laravel Queue。这可以确保在生成csv文件之后发送电子邮件,或者换句话说,它们是按顺序执行的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71689675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档