Laravel 6 Event Listener Mailable Queue unable to access - laravel

Environment:
php: 7.4.2
laravel: 6.15.0
Scenario: Upon user registration, event(new NewUserHasRegisteredEvent($user)); is triggered.
In my EventServiceProvider.php
protected $listen = [
NewUserHasRegisteredEvent::class => [
\App\Listeners\WelcomeNewUserListener::class,
],
];
My NewUserHasRegisteredEvent.php
<?php
namespace App\Events;
use App\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class NewUserHasRegisteredEvent
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
}
My WelcomeNewUserListener.php Note that it implements ShouldQueue
<?php
namespace App\Listeners;
use App\Events\NewUserHasRegisteredEvent;
use App\Mail\WelcomeUserMail;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Facades\Mail;
class WelcomeNewUserListener implements ShouldQueue
{
public function __construct()
{
//
}
public function handle(NewUserHasRegisteredEvent $event)
{
Mail::to($event->user->email)->send(new WelcomeUserMail($event->user));
}
}
My WelcomeUserMail.php
<?php
namespace App\Mail;
use App\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
class WelcomeUserMail extends Mailable
{
use Queueable, SerializesModels;
public $user;
public function __construct(User $user)
{
$this->user = $user;
}
public function build()
{
return $this->markdown('emails/new-welcome')
->with('user', $this->user);
}
}
My new-welcome.blade.php
#component('mail::message')
Hello {{ $user->name ?? 'name' }}, ...
#endcomponent
Issue: When the user receives the registration email, the $user->name is not defined hence i'm using ?? operator. Weird thing is when I remove the ShouldQueue from the WelcomeNewUserListener.php then the $user->name works perfectly fine.
Please suggest. I want to use queue via event/listeners way.

Related

How to pass user data into a JSON file using Laravel one to one

I am having issues getting user data in a JSON file am using one to one relationship
this is my PostRequest Model
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class PostRequest extends Model
{
use HasFactory;
public function user(){
return $this->belongsTo(User::class, 'artisan_id');
}
}
User model
<?php
namespace App\Models;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laratrust\Traits\LaratrustUserTrait;
use App\Models\Verify;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Database\Eloquent\Model;
class User extends Authenticatable
{
use LaratrustUserTrait;
use HasFactory, Notifiable;
public function PostRequest(){
return $this->hasOne(PostRequest::class, 'artisan_id');
}
}
Controller
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use App\Models\PostRequest;
use App\Models\User;
class ChatController extends Controller
{
public function getMessages(){
return view('user/message'); //response()->json($contacts);
}
public function getContact(){
$email = Auth::user()->email;
$contacts = PostRequest::select('artisan_id')->where('email', '=', $email)
->limit('1')
->orderBy('id', 'DESC')
->user();
return response()->json($contacts);
//}
}
}
if run the above controller I get this error msg
[14:09:51] LOG.error: Call to undefined method Illuminate\Database\Eloquent\Builder:: user() {"userId":15,"exception":{}
If I run this I get all data, buh den I need a specific data
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use App\Models\PostRequest;
use App\Models\User;
class ChatController extends Controller
{
public function getMessages(){
return view('user/message'); //response()->json($contacts);
}
public function getContact(){
$email = Auth::user()->email;
$contacts = PostRequest::all();
return response()->json($contacts);
//}
}
}
Just try this query:
$email = Auth::user()->email;
$contacts = PostRequest::where('email', $email)->first()->user;
return response()->json($contacts);

How to pass data from database to Mailable?

I know how to pass data to view but how do you pass data to a mailable? I'm also a bit confused on where to put the database call DB::select, in the controller or the mailable? So far I've tried this:
web.php:
Route::get('/test-email', 'App\Http\Controllers\TestMailController#test');
TestMailController.php:
<?php
namespace App\Http\Controllers;
use App\Mail\ContactMail;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
class TestMailController extends Controller
{
public function test()
{
return new ContactMail();
}
}
TestMail.php:
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\DB;
use phpDocumentor\Reflection\DocBlock\Tags\Var_;
class TestMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
public $data;
public function __construct()
{
$this->data = DB::select('select * from db_name');
}
public function build()
{
return $this->markdown('emails.testmail')->with('data', $data);
}
}
You need to use $this :
public function build()
{
return $this->markdown('emails.testmail')->with('data', $this->data);
}

Creating Email queue in Laravel

Newsletter.php
<?php
namespace App\Mail;
use App\Order;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Http\Request;
class Newsletter extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* #return void
*/
public $order;
public function __construct($order)
{
$this->order = $order;
}
/**
* Build the message.
*
* #return $this
*/
public function build()
{
return $this->view('mail', $this->order)->subject($this->order['subject']);
}
}
SendReminderEmail.php
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Mail;
use App\Mail\Newsletter;
use App\User;
class SendReminderEmail implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* #return void
*/
public $order, $email;
public function __construct($order, $emails)
{
$this->order = $order;
$this->email = $emails;
}
/**
* Execute the job.
*
* #return void
*/
public function handle()
{
//for($i=0;$i<count($this->email);$i++)
Mail::to($this->email)->queue(new Newsletter($this->order));
}
}
Controller
public function sendSubMail(Request $request){
$data = ['text' => $request->input('message'), 'subject' => $request->input('subject')];
$emails = DB::table('emails')->get();
for ($i=0; $i < count($emails); $i++) {
try {
Mail::to($emails[$i])->queue(new Newsletter($data));
//dispatch((new Job)->onQueue('high'))
dispatch(new SendReminderEmail($data, $emails[$i]));
} catch (Exception $e) {
}
}
return view('emailSent', ['sub' => 'Emails successfully sent']);
}
Can anyone explain me how to create an Email queue in laravel. I tried many ways but none of them seems to work.
I'm trying to send email using queues. I have to send more than 1500 in the request. but the queue which I implemented doesnt seem to work. Please help.
Thanks in advance
Using Cron to send mail One Method

laravel queue not working like it did before

Hello i was working with mailable and using queue but when i used php artisan queue:listen and send a mail it did not work like it was supposed to do, i did get the email on mailtrap, but there was no message in my console. I tried sending the mail first and then use my command but it worked without my command. and it does not take a while because its sending immediately here is my code
controller.php
use Illuminate\Support\Facades\Mail;
use App\Mail\testmail;
class Controller extends Controller{
public function email($email, Request $request){
$emailuser = $request->input('email');
$message = $request->input('bericht');
mail::to($email)->queue(new testmail($emailuser, $message));
}
}
testmail.php
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class testmail extends Mailable
{
use Queueable, SerializesModels;
public $emailuser;
public $message;
/**
* Create a new message instance.
*
* #return void
*/
public function __construct($emailuser, $message)
{
$this->emailuser = $emailuser;
$this->message = $message;
}
/**
* Build the message.
*
* #return $this
*/
public function build()
{
return $this->markdown('email.mail');
}
}
mail.blade.php
#component('mail::message')
{{ $emailuser }}
{{ $message }}
Thanks,<br>
{{ config('app.name') }}
#endcomponent
does anyone know how to fixs this because i need it to have a delay for my application
Use a job instead of Maillable and in that job in handle function write down the code to send the email in that job
for i.e-:
$job = (new SendWelcomeEmail($activation->code,$user))->onQueue('default');
and the job file SendwelcomeEmail would like following-:
<?php
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Jobs\Job;
use Mail;
class SendWelcomeEmail extends Job implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
/**
* Create a new job instance.
*
* #return void
*/
protected $activation_code;
protected $user;
public function __construct($activation_code,$user)
{
$this->activation_code=$activation_code;
$this->user=$user;
}
/**
* Execute the job.
*
* #return void
*/
public function handle()
{
try{
$user=$this->user;
Mail::send('emails.user.register', ['activation_code' => $this->activation_code,'user'=>$this->user], function ($m) use ($user) {
$m->to($user->email,$user->first_name." ".$user->last_name)
->subject(trans('emails.USER_REGISTER_SUBJECT',['project'=>trans('project.project_name')]));
});
\Log::useDailyFiles(storage_path().'/logs/user-registration/success/'.date('Y-m-d').'.log');
\Log::info('Welcome Email Send to-:'.$user->email);
}catch(Exception $ex){
\Log::useDailyFiles(storage_path().'/logs/user-registration/error/'.date('Y-m-d').'.log');
\Log::error($ex->getMessage());
\Log::error("Line Number->".$ex->getLine());
}
}
}

Only mailables may be queued

I have to update from 5.1 to 5.4
This was code for mail with`5.1
Mail::queue('emails.welcome_client', compact('user', 'userPassword'), function ($message) use ($user, $adminEmails) {
$message->subject('Welcome to Enterprise Solutions!');
$message->from(env('MAIL_FROM_ADDRESS'), env('MAIL_FROM_NAME'));
$message->to($user->email);
foreach($adminEmails as $adminEmail) {
$message->bcc($adminEmail);
}
});
I have to change from Laravel 5.1 to 5.4
so I create object mail
here it is
<?php
namespace App\Mail;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class ClientMail extends Mailable
{
use Queueable, SerializesModels;
/**
* Create a new message instance.
*
* #return void
*/
public $user;
// protected $content;
public function __construct($user)
{
$this->content = $user;
}
/**
* Build the message.
*
* #return $this
*/
public function build()
{
return $this->from(('MAIL_FROM_ADDRESS'), env('MAIL_FROM_NAME'))
->subject('Welcome to Enterprise Solutions!')
->view('emails.welcome_client');
}
}
and in controller I do this
Mail::to($user->email)
->bcc($adminEmail)
->queue(new ClientMail($adminEmails));
when I try to run I get this error: Undefined $adminEmail. How I can fix this problem?
Try this one:
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;
class ClientMail extends Mailable implements ShouldQueue
{
use Queueable, SerializesModels;
/**
* Build the message.
*
* #return $this
*/
public function build()
{
$this->from(('MAIL_FROM_ADDRESS'), env('MAIL_FROM_NAME'))
->subject('Welcome to Enterprise Solutions!')
->view('emails.welcome_client');
return $this;
}
}
And in Controller call:
Mail::to($user->email)->bcc($adminEmails)->queue(new ClientMail());

Resources