1. Go to this page and download the library: Download wnx/laravel-sends library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
wnx / laravel-sends example snippets
// An email is sent to $user. The passed $product and $user models will be
// associated with the sent out email generated by the `ProductReviewMail` mailable.
Mail::to($user)->send(new ProductReviewMail($product, $user));
return [
/*
* The fully qualified class name of the `Send` model.
*/
'send_model' => \Wnx\Sends\Models\Send::class,
/**
* If set to true, the content of sent mails is saved to the database.
*/
'store_content' => env('SENDS_STORE_CONTENT', false),
'headers' => [
/**
* Header containing the encrypted FQN of the mailable class.
*/
'mail_class' => env('SENDS_HEADERS_MAIL_CLASS', 'X-Laravel-Mail-Class'),
/**
* Header containing an encrypted JSON object with information which
* Eloquent models are associated with the mailable class.
*/
'models' => env('SENDS_HEADERS_MAIL_MODELS', 'X-Laravel-Mail-Models'),
/**
* Header containing unique ID of the sent out mailable class.
* Set this to `Message-ID`, if you want to use the Message ID as the unique ID identifing the sent mail.
*/
'send_uuid' => env('SENDS_HEADERS_SEND_UUID', 'X-Laravel-Send-UUID'),
],
];
class ProductReviewMail extends Mailable
{
use SerializesModels;
use StoreMailables;
public function __construct(public User $user, public Product $product)
{
}
public function build()
{
return $this
->storeClassName()
->view('emails.products.review')
->subject("$this->product->name waits for your review");
}
}
class ProductReviewMail extends Mailable
{
use SerializesModels;
use StoreMailables;
public function __construct(
public User $user,
public Product $product
) { }
// ...
/**
* @return \Illuminate\Mail\Mailables\Headers
*/
public function headers()
{
// Call storeClassName() and let the package take care of adding the
// header to the outgoing mail.
$this->storeClassName();
// Or – if you want more control – use the getMailClassHeader() method
// to get a Header instance and merge it with your own headers.
return new Headers(
text: [
'X-Custom-Header' => 'Custom Value',
...$this->getMailClassHeader()->toArray(),
],
);
}
}
use Wnx\Sends\Contracts\HasSends;
use Wnx\Sends\Support\HasSendsTrait;
class Product extends Model implements HasSends
{
use HasSendsTrait;
}
class ProductReviewMail extends Mailable
{
use SerializesModels;
use StoreMailables;
public function __construct(
private User $user,
private Product $product
) { }
public function build()
{
return $this
->storeClassName()
->associateWith($this->product)
// ->associateWith([$this->product])
->view('emails.products.review')
->subject("$this->user->name, $this->product->name waits for your review");
}
}
class ProductReviewMail extends Mailable
{
use SerializesModels;
use StoreMailables;
public function __construct(
private User $user,
private Product $product
) { }
// ...
/**
* @return \Illuminate\Mail\Mailables\Headers
*/
public function headers()
{
// Call associateWith() and the package automatically associates the public
// properties with this mailable.
$this->associateWith($this->user);
$this->associateWith([$this->product]);
// Or – if you want more control – use the getMailModelsHeader() method
// to get a Header instance and merge it with your own headers.
return new Headers(
text: [
'X-Custom-Header' => 'Custom Value',
...$this->getMailModelsHeader($this->user)->toArray(),
...$this->getMailModelsHeader([$this->product])->toArray(),
],
);
}
}
$product->sends()->get();
class ProductReviewMail extends Mailable
{
use SerializesModels;
use StoreMailables;
public function __construct(
private User $user,
public Product $product
) { }
public function build()
{
return $this
->associateWith()
->view('emails.products.review')
->subject("$this->user->name, $this->product->name waits for your review");
}
}
class ProductReviewMail extends Mailable
{
use SerializesModels;
use StoreMailables;
public function __construct(
private User $user,
public Product $product
) { }
// ...
/**
* @return \Illuminate\Mail\Mailables\Headers
*/
public function headers()
{
// Call associateWith() and the package automatically associates the public
// properties with this mailable.
$this->associateWith();
// Or – if you want more control – use the getMailModelsHeader() method
// to get a Header instance and merge it with your own headers.
return new Headers(
text: [
'X-Custom-Header' => 'Custom Value',
...$this->getMailModelsHeader()->toArray(),
],
);
}
}
namespace App\Listeners;
use Illuminate\Mail\Events\MessageSent;
use Wnx\Sends\Listeners\StoreOutgoingMailListener;
class CustomStoreOutgoingMailListener extends StoreOutgoingMailListener
{
protected function getSendAttributes(MessageSent $event, array $defaultAttributes): array
{
return array_merge($defaultAttributes, [
'audience' => $this->getAudience($event),
]);
}
// app/Models/Send.php
namespace App\Models;
use Illuminate\Database\Eloquent\Prunable;
use Wnx\Sends\Models\Send as BaseSend;
class Send extends BaseSend
{
use Prunable;
public function prunable()
{
return static::where('created_at', '<=', now()->subMonth());
}
}
// config/sends.php
/*
* The fully qualified class name of the send model.
*/
'send_model' => \App\Models\Send::class,
class AwsSnsSesWebhookController extends SesWebhook {
protected function onDelivery(array $message)
{
$uuidHeader = collect(Arr::get($message, 'mail.headers', []))
->firstWhere('name', config('sends.headers.send_uuid'));
if ($uuidHeader === null) {
return;
}
$send = Send::forUuid($uuidHeader['value'])->first();
if ($send === null) {
return;
}
$send->delivered_at = now();
$send->save();
}
}