1
resposta

Falha no envio de e-mails

Bom dia. Após a criação do listener EnviarEmailSerieAdicionada , os e-mails não estão mais sendo enviados. Segue o código:


namespace App\Listeners;

use App\Events\NovaSerie;
use App\User;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\InteractsWithQueue;
//use Illuminate\Contracts\Mail\Mailable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Mail;

class EnviarEmailSerieAdicionada
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  NovaSerie  $event
     * @return void
     */
    public function handle(NovaSerie $event)
    {
        $nomeSerie = $event->nomeSerie;
        $qtdTemporadas = $event->qtdTemporadas;
        $qtdEpisodios = $event->qtdEpisodios;

        $users = User::all();
        foreach ($users as $index => $user) {
            $multiplicador = $index + 1;
            $email = new NovaSerie(
                $nomeSerie,
                $qtdTemporadas,
                $qtdEpisodios
            );
            $email->subject('Nova série adicionada!');
            $when = now()->addSecond($multiplicador * 5);

            Mail::to($user)->later($when, $email);
        }
    }
}

O VSCode aponta que o método subject não foi definido e que a variável email não é do tipo esperado. Alguma sugestão?

1 resposta

Olá, Paulo! Tudo bem com você?

Peço desculpas pela demora no retorno a sua mensagem.

De acordo com o código enviado, o problema pode estar na utilização da classe NovaSerie como objeto de e-mail. O erro aponta que o método subject não foi definido e que a variável email não é do tipo esperado.

Uma possível solução seria utilizar a classe Mailable do Laravel para criar o e-mail. Podemos criar uma nova classe que estende Mailable e definir o assunto e as informações da série no método build. Por exemplo:

namespace App\Mail;

use App\Events\NovaSerie;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;

class EmailSerieAdicionada extends Mailable
{
    use Queueable, SerializesModels;

    public $nomeSerie;
    public $qtdTemporadas;
    public $qtdEpisodios;

    /**
     * Create a new message instance.
     *
     * @return void
     */
    public function __construct($nomeSerie, $qtdTemporadas, $qtdEpisodios)
    {
        $this->nomeSerie = $nomeSerie;
        $this->qtdTemporadas = $qtdTemporadas;
        $this->qtdEpisodios = $qtdEpisodios;
    }

    /**
     * Build the message.
     *
     * @return $this
     */
    public function build()
    {
        return $this->subject('Nova série adicionada!')
                    ->view('emails.serie-adicionada');
    }
}

Em seguida, podemos atualizar o trecho do código do listener EnviarEmailSerieAdicionada para criar uma instância da classe EmailSerieAdicionada ao invés de NovaSerie. Por exemplo:

// ...

use App\Mail\EmailSerieAdicionada;

// ...

public function handle(NovaSerie $event)
{
    $nomeSerie = $event->nomeSerie;
    $qtdTemporadas = $event->qtdTemporadas;
    $qtdEpisodios = $event->qtdEpisodios;

    $users = User::all();
    foreach ($users as $index => $user) {
        $multiplicador = $index + 1;
        $email = new EmailSerieAdicionada(
            $nomeSerie,
            $qtdTemporadas,
            $qtdEpisodios
        );
        $when = now()->addSecond($multiplicador * 5);

        Mail::to($user)->later($when, $email);
    }
}

// ...

Dessa forma, estaremos utilizando corretamente a classe Mailable para criar o e-mail e definir o assunto. Devemos nos certificar também de que a view emails.serie-adicionada existe e contém o conteúdo desejado para o e-mail.

Espero ter ajudado.

Abraços e bons estudos!