phplaravelemail-attachmentsmaatwebsite-excel

How do I attach the excel file to the email?


I think Im close, I just need to pass the $excelFile in Mail but it keeps saying its undefined, yet when I pass $truckstop_post it goes through but that data is not formatted correctly bc it didnt go through the Excel::create yet. How do I get the result of \Excel::create into the Mail::send??

public function truckstopPost()
{   
    $type = 'csv';



    $truckstop_post = Loadlist::select('pick_city', 'pick_state', 'delivery_city', 'delivery_state', 'trailer_type', 'pick_date', 'load_type', 'length', 'width', 'height', 'weight', 'offer_money', 'special_instructions', 'company_contact', 'contact_phone')->where('urgency', 'OPEN')->orderBy('id', 'desc')->get();

    $excelFile = \Excel::create('itransys', function($excel) use ($truckstop_post) {
        $excel->sheet('mySheet', function($sheet) use ($truckstop_post)
        {
            $sheet->fromArray($truckstop_post);

        });


       $info = Load::find(8500);

       $info = ['info'=>$info];


       Mail::send(['html'=>'email.invoice_email_body'], $info, function($message) use ($info, $excelFile){

        $message->to('mike@gmail.com')->subject('subject');

        $message->from('mike@gmail.com', \Auth::user()->name);

        $message->attachData($excelFile, 'Invoice.csv');

        });


        });

    return back()->with('status', 'You Posted Truckstop!');

}

This is what the results look like if I pass $truckstop_post into attachData() but of course thats not a nicely formatted csv file

enter image description here


Solution

  • You can do it like so

    use Maatwebsite\Excel\Excel as BaseExcel;
    use Maatwebsite\Excel\Facades\Excel;
    
    ...
    
    $filename = "my_file.csv";
    
    $attachment = Excel::raw(
        new PurchaseOrderLinesExport($this->data), 
        BaseExcel::CSV
    );
    $subject = "Purchase Order"
    
    return $this->from($this->employee->email)
                ->subject("Purchase Order)
                ->view('emails.view')
                ->attachData($attachment, $filename);
    

    Excel::raw() method creates/writes a temporary file and then gets its contents and delete after deleting that file.

    Second Solution would be like this if you're using laravel:

    public function build()
    {
        return $this->markdown('emails.report')
            ->attach(
                Excel::download(
                    new AuditReport($this->audit), 
                    'report.xlsx'
                )->getFile(), ['as' => 'report.xlsx']
            );
    }
    

    Excel::download() returns a BinaryFileResponse that's why it doesn't work directly, but you can grab the file.