php - Laravel Email in Job Queue not working except sync
I am using Laravel 5.8, I configured an email containing the invoice sent to user after they place an order.
Email is delivered when set QUEUE_DRIVER=sync
but when I set it to redis/database and I run the php artisan queue:work redis --tries=5
it shows the queue is processed
Processing: Modules\Checkout\Mail\Invoice
Processed: Modules\Checkout\Mail\Invoice
succesfully and no entry in the failed_jobs either.
CODE: Modules\Checkout\Jobs\SendInvoiceEmail.php
class SendInvoiceEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public $order;
public function __construct(Order $order)
{
$this->order = $order;
}
public function handle()
{
Mail::to($this->order->customer_email)
->send(new Invoice($this->order));
}
}
And this is the Modules\Checkout\Mail\Invoice.php
class Invoice extends Mailable
{
use Queueable, SerializesModels;
public $order;
public function __construct($order)
{
$this->order = $order;
}
public function build()
{
return $this->subject('New order: ', ['id' => $this->order->id]))
->view("emails.invoice");
}
}
Then I am dispatching it in the Controller after Order created
SendInvoiceEmail::dispatch($order);
Can anyone point out if I've missed anything and what I am doing wrong?
I've done the php artisan config:cache and clear:cache
restarted the server.
This works just as expected if I set QUEUE_DRIVER=sync
in .env instead of QUEUE_DRIVER=redis or database
Answer
Solution:
I had that problem too and solve it putting a key in the config/mail.php
file
in mailers['smtp']
I add local_domain
equals to my domain (example.com
)
The reason is the Swift Mailer class can use this key to put in the HELO field of the email. If you use QUEUE=sync
the framework uses the domain in env file, but when you use a different queue it doesn't cache the domain.
Answer
Solution:
Thing is .env
or config.php
both configurations should work normally.
My main issue was the application would save these settings from .env
or config.php
to database. then for the next time it looked in database for these smtp configs and anything other than sync
tends to fail.
I don't know why it was configured so I removed and the issue was resolved