L’invio di email in una applicazione Laravel è realizzato in modo semplice e flessibile e sfrutta tre concetti base: i mailer, i mailable, e la facade Mail.
Ognuno dei tre si occupa di un diverso aspetto del ciclo di vita dell’invio di un messaggio di posta elettronica. I mailer sono le configurazioni dei servizi di invio email (locali o remoti) che può usare l’applicazione. I mailable sono speciali classi che rappresentano un modello di email da inviare. La facade Mail, infine, è il punto d’accesso per chiedere l’effettivo invio di un mailable attraverso un mailer.
Configurazione dei mailer in Laravel
La configurazione dei mailer in Laravel si trova nel file config/mail.php. È possibile definire diversi mailer, ognuno caratterizzato da un nome e da un transport driver
In questo modo, Laravel consente all’applicazione non solo di configurare il server di posta disponibile, ma di utilizzare diversi server o servizi di emailing per inviare determinati messaggi di posta elettronica. Questa possibilità è molto importante per applicazioni che si trovano a dover inviare sia email transazionali (quelle che partono in risposta a una specifica richiesta dell’utente e che è necessario che vengano consegnate quanto prima, come per esempio quelle con i codici per cambiare password o la conferma di un ordine) che email bulk (newsletter e altri invii di marketing, che possono viaggare su canali più lenti).
È possibile configurare il mailer predefinito e dei mailer di failover, nel caso in cui qualcuno degli altri presenti problemi.
Creare un mailable in Laravel
Un mailable è una classe PHP che rappresenta uno specifico tipo di email inviata dalla propria applicazione. È possibile creare una nuova classe mailable tramite il comando Artisan make.
$ php artisan make:mail OrderShipped INFO Mail [app/Mail/OrderShipped.php] created successfully.
La configurazione di un mailable avviene attraverso i tre metodi envelope, content e attachments, che si occupano rispettivamente di definire le intestazioni, il corpo del messaggio e gli eventuali allegati.
class OrderShipped extends Mailable { use Queueable, SerializesModels; public Order $order; public function __construct(Order $order) { $this->order = $order; } public function envelope() { return new Envelope( from: new Address('noreply@example.com', 'ExampleDotCom'), subject: 'Order Shipped', ); } public function content() { return new Content( view: 'emails.orders.shipped', text: 'emails.orders.shipped-text' ); } public function attachments() { $code = $this->order->code; return [ Attachment::fromPath("/path/to/order-$code.pdf"), ]; } }
Il rendering del contenuto dell’email è, ovviamente, affidato a opportuni template Blade. È possibile recuperare i dati da utilizzare per il rendering della singola email utilizzando le property pubbliche definite dalla classe mailable.
<div> Code: {{ $order->code }} Address: {{ $order->address }} ... </div>
Invio delle email in Laravel
L’invio effettivo di una email avviene tramite la facade Mail e il suo metodo to.
use App\Model\Order class OrderShipmentController extends Controller { public function ship(Order $order) { $order = Order::findOrFail($order); // do stuff to actually start shipping the order $recipient = auth()->user(); Mail::to($recipient)->send(new OrderShipped($order)); } }
Il destinatario della email può essere passato come stringa di indirizzo email oppure tramite un oggetto o collezione di oggetti che abbiano le proprietà name ed email.
L’email effettiva da mandare è indicata tramite un mailable, a cui vengono passate le property necessarie per fare il rendering del template Blade associato agli opportuni contenuti.
La facade Mail offre diversi metodi chainable che permettono di definire più nel dettaglio l’esatto invio che si vuole effettuare, sia per quanto riguarda i destinatari (con i metodi cc e bcc) che i tempi e le modalità di invio (queue o later)