Send an email attaching multiple files

0

You see, I have an exercise in which, I have to select the users of a table, create for each one a PDF with its curriculum and to end up sending someone an email in which I attach all the created PDFs.

First, the form:

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header"><h5>Enviando un PDF con el curriculo de los usuarios con experiencia laboral.</h5></div>

                <div class="card-body">
                    <form method="POST" action="pdf_empresa" novalidate enctype="multipart/form-data">
                        @csrf

                        <div class="form-group row">
                            <label for="email" class="col-md-4 col-form-label text-md-right">Correo Electronico de la empresa</label>

                            <div class="col-md-8">
                                <input id="email" type="email" class="form-control{{ $errors->has('email') ? ' is-invalid' : '' }}" name="email" value="{{ old('email') }}" required>

                                @if ($errors->has('email'))
                                    <span class="invalid-feedback">
                                        <strong>{{ $errors->first('email') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group row">
                            <label for="sector" class="col-md-4 col-form-label text-md-right">Sector en que los empleados deben tener experiencia</label>

                            <div class="col-md-8">
                                <select id="sector" class="form-control{{ $errors->has('sector') ? ' is-invalid' : '' }}" name="sector" value="{{ old('sector') }}" required autofocus>
                                    @foreach($sectores as $sector)
                                        <option value="{{$sector->nombre}}">{{$sector->nombre}}</option>
                                    @endforeach
                                </select>

                                @if ($errors->has('sector'))
                                    <span class="invalid-feedback">
                                        <strong>{{ $errors->first('sector') }}</strong>
                                    </span>
                                @endif
                            </div>
                        </div>

                        <div class="form-group row mb-0">
                            <div class="col-md-6 offset-md-4">
                                <button type="submit" class="btn btn-primary">
                                    Enviar Curriculo
                                </button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Afterwards, the function that handles my request:

public function envio(EnvioRequest $request){
        $usuarios=User::whereHas('experiencias',function($query) use ($request){
            $query->where('sector_empresa',$request->sector);
        })->get();

        if(count($usuarios)==0)
            return back()->with('message',['danger','No hay ningun usuario con experiencia en el sector '.$request->sector.'.']);
        else{
            foreach($usuarios as $usuario){
                $pdf = PDF::loadView('pdf.curriculo', compact('usuario'));
                $salida=$pdf->output();
                $ruta='C:/xampp/htdocs/bolsa/public/descargas/'.'Curriculo de '.$usuario->name." ".$usuario->second_name.'.pdf';
                file_put_contents($ruta, $salida);
            }
            Mail::to($request->email)->send(new Adjuntar($request->sector)); // Se ha conseguido que los PDF se creen y se ha conseguido enviar el email. Solo queda que los emails se adjunte.
            return back()->with('message',['success','Se ha enviado a la empresa un email con el PDF adjunto.']);
        }
    }

The Mail file:

<?php

namespace App\Mail;

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

class Adjuntar extends Mailable{
    use Queueable, SerializesModels;
    public $sector;

    public function __construct($sector){
        $this->sector=$sector;
    }

    public function build(){
        return $this->view('correo.adjunto');
    }
}

I can have multiple PDFs created with the curriculum of each user and then I can send an email, but I still do not know how to attach them to that email.

    
asked by Miguel Alparez 19.05.2018 в 15:52
source

1 answer

1

You must store your generated email in a variable and simply add several attachments, like this:

public function build()
{
    $email = $this->view('correo.adjunto')->subject('Curriculum');

    // $archivosadjuntos es una matriz con rutas de archivos de archivos adjuntos
    foreach($archivosadjuntos as $rutaArchivo){
        $email->attach($rutaArchivo);
    }
    return $email;
}

In this case, your variable $ attachmentfiles must be an array with paths to files:

$archivosadjuntos= [
    // primer archivo adjunto
    '/path/to/file1',

    // Segundo archivo adjunto
    '/path/to/file2',
    ...
];

You can also attach files not only by file paths, but with the MIME type and the desired file name, see the documentation on the second one

  

Use case for attachment method:

     

For example, your array $ attachmentfiles can be something like this:

$archivosadjuntos= [
    // primer archivo adjunto
    'path/to/file1' => [
        'as' => 'file1.pdf',
        'mime' => 'application/pdf',
    ],

    // Segundo archivo adjunto
    'path/to/file12' => [
        'as' => 'file2.pdf',
        'mime' => 'application/pdf',
    ],

    ...
];

After I can attach files from this matrix:

// $archivosadjuntos es una matriz con rutas de archivos de archivos adjuntos
foreach($archivosadjuntos as $rutaArchivo=> $fileParameters){
    $email->attach($rutaArchivo, $fileParameters);
}
  

OS Source: Attach Multiple Files To Mailables   

You can also use a loop for all attachments.

Something like this:

$data_mail = Mail::send($tmp, array('msg'=>$msg), function($message) use ($ruta) {
    $message->from('[email protected]', $_POST['subj']);
    $message->to($_POST['to'])->subject($_POST['subj']);
    $size = sizeOf($ruta); //obtener el recuento de la cantidad de archivos adjuntos

    for ($i=0; $i < $size; $i++) {
        $message->attach($ruta[$i]);
    }
},true);
    
answered by 19.05.2018 / 16:08
source