'Check mail is sent successfully or not on Laravel 5

I have a function that can send mail on Laravel5 using this

/**
 *  Send Mail from Parts Specification Form
 */
 public function sendMail(Request $request) {
    $data = $request->all();

    $messageBody = $this->getMessageBody($data);

    Mail::raw($messageBody, function ($message) {
        $message->from('[email protected]', 'Learning Laravel');
        $message->to('[email protected]');
        $message->subject('Learning Laravel test email');
    });

    return redirect()->back();
 }

 /**
  * Return message body from Parts Specification Form
  * @param object $data
  * @return string
  */
 private function getMessageBody($data) {

    $messageBody = 'dummy dummy dummy dummy';
 }

and is sent successfully. But how to check if it was sent or not? Like

if (Mail::sent == 'error') {
 echo 'Mail not sent';
} else {
 echo 'Mail sent successfully.';
}

I'm just guessing that code.



Solution 1:[1]

Hope this helps

The Mail::failures() will return an array of failed emails.

Mail::send(...)

if( count(Mail::failures()) > 0 ) {

   echo "There was one or more failures. They were: <br />";

   foreach(Mail::failures() as $email_address) {
       echo " - $email_address <br />";
    }

} else {
    echo "No errors, all sent successfully!";
}

source : http://laravel.io/forum/08-08-2014-how-to-know-if-e-mail-was-sent

Solution 2:[2]

You may additionally can make use "Swift_TransportException" to identify any errors.

try{

   //code to send the mail

}catch(\Swift_TransportException $transportExp){
  //$transportExp->getMessage();
}

Solution 3:[3]

You can use the Mail::failures() function for that. It will have a collection of failed mails if it exists so you can use the code below to check for it.

public function sendMail(Request $request) {
    $data = $request->all();

    $messageBody = $this->getMessageBody($data);

    Mail::raw($messageBody, function ($message) use ($messageBody) {
        $message->from('[email protected]', 'Learning Laravel');
        $message->to('[email protected]');
        $message->subject($messageBody); 
    });

    // check for failed ones
    if (Mail::failures()) {
        // return failed mails
        return new Error(Mail::failures()); 
    }

    // else do redirect back to normal
    return redirect()->back();
}

Solution 4:[4]

For Laravel 9.11.0

Mail::failires() // is depricated in laravel 9.11.0

To check if your email was sent successfully one could wrap mail send in a try catch block:

try {
    Mail::to($userEmail)->send($welcomeMailable);
} catch (Exception $e) {
  //Email sent failed.
}

or since Mail::to($email)->send($mailable) on success returns an instance of : SentMessage one could check:


$welcomeEmailSent = Mail::to($userEmail)->send($welcomeMailable);

if($welcomeEmailSent instanceof \Illuminate\Mail\SentMessage){
  //email sent success
}else{
  //email sent failed
}

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 ch271828n
Solution 2 vkGunasekaran
Solution 3 Kerel
Solution 4 Leo