2
respostas

O envio de e-mail não está funcionando

Olá, estou na sexta aula do curso (https://cursos.alura.com.br/course/laravel-e-mails-eventos-uploads-testes/task/106202) onde mostra o envio de e-mail de teste para o Mailtrap.

Eu já verifiquei várias vezes o código, mas não sei porque que na hora que cadastro uma série, fica um demora enorme até dá o erro de limite de tempo:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

A minha configuração do arquivo .env está assim:

MAIL_FROM_ADDRESS="hello@example.com"
MAIL_FROM_NAME="${APP_NAME}"

MAIL_MAILER=smtp
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=
MAIL_PASSWORD=

Só apaguei as informações do usuário e senha, mas no arquivo está igual a enviada no Mailtrap.

E o meu método store do SeriesController está assim:

    public function store(SeriesFormRequest $request)
    {
        $serie = $this->repository->add($request);
        
        $email = new SeriesCreated(
                $serie->nome,
                $serie->id,
                $request->seasonsQty,
                $request->episodesPerSeason
        );
        Mail::to($request->user())->send($email);
        
        return to_route('series.index')
                        ->with('mensagem.sucesso', "Série '{$serie->nome}' adicionada com sucesso!");
    }

Alguém mais está passando ou passou por algo parecido?

2 respostas

Oi!

Parece que o erro de limite de tempo que você está enfrentando pode ter algumas causas, e irei abordar as possíveis soluções em etapas.

  1. Configuração do ambiente .env: Parece que suas configurações no arquivo .env estão corretas. Você definiu o driver de e-mail como SMTP e configurou o host e a porta para o Mailtrap, que é um serviço de teste de e-mail muito útil. No entanto, você mencionou que removeu as informações de usuário e senha. Certifique-se de que você preencheu as credenciais corretas do Mailtrap (MAIL_USERNAME e MAIL_PASSWORD) no arquivo .env, pois essas informações são necessárias para autenticar seu aplicativo com o servidor de e-mail.

  2. Verificação de conexão com o Mailtrap: Antes de investigar mais a fundo, é importante garantir que seu aplicativo Laravel possa se conectar ao servidor SMTP do Mailtrap. Você pode fazer isso executando o seguinte comando no terminal:

php artisan tinker
\Mail::connection('mailtrap')->getSwiftMailer()->getTransport()->start();

Isso testará a conexão com o servidor SMTP configurado. Certifique-se de que você não recebe erros ao executar esse comando. Se ocorrer algum erro, verifique as credenciais no arquivo .env e certifique-se de que seu aplicativo tenha acesso à internet.

  1. Configurações de Firewall ou Bloqueio de Portas: Verifique se seu servidor permite conexões de saída na porta 2525 (a porta que você configurou para o Mailtrap). Às vezes, firewalls ou configurações de segurança do servidor podem bloquear determinadas portas. Certifique-se de que a porta 2525 esteja liberada.

  2. Verificando o código no método store do SeriesController: O código que você compartilhou parece correto, mas vou analisá-lo para garantir que nada esteja causando o atraso:

public function store(SeriesFormRequest $request)
{
    $serie = $this->repository->add($request);

    $email = new SeriesCreated(
        $serie->nome,
        $serie->id,
        $request->seasonsQty,
        $request->episodesPerSeason
    );
    Mail::to($request->user())->send($email);

    return redirect()->route('series.index')
                    ->with('mensagem.sucesso', "Série '{$serie->nome}' adicionada com sucesso!");
}

O código parece correto em relação ao envio de e-mail. No entanto, o atraso que você está enfrentando pode estar relacionado a algum problema de rede, já que a função Mail::to($request->user())->send($email); não deveria causar um atraso significativo.

  1. Monitoramento do tempo de execução: Para investigar o problema de atraso com mais precisão, você pode adicionar registros de tempo no seu código para descobrir onde o atraso ocorre. Isso pode ajudar a identificar se o problema está no envio de e-mail ou em outra parte do código. Por exemplo:
public function store(SeriesFormRequest $request)
{
    $start = microtime(true); // Registra o tempo de início

    $serie = $this->repository->add($request);

    $email = new SeriesCreated(
        $serie->nome,
        $serie->id,
        $request->seasonsQty,
        $request->episodesPerSeason
    );

    Mail::to($request->user())->send($email);

    $end = microtime(true); // Registra o tempo de término
    $executionTime = ($end - $start); // Calcula o tempo de execução

    // Registre o tempo de execução para depuração
    \Log::info("Tempo de execução do envio de e-mail: " . $executionTime);

    return redirect()->route('series.index')
                    ->with('mensagem.sucesso', "Série '{$serie->nome}' adicionada com sucesso!");
}

Isso permitirá que você verifique os registros e identifique se o envio de e-mail está causando o atraso.

  1. Análise de logs e erro: Além disso, é fundamental verificar os logs do Laravel para ver se há informações detalhadas sobre o erro. Você pode verificar os logs no arquivo storage/logs/laravel.log. Procure por qualquer erro ou mensagem de registro relacionada ao envio de e-mail.

Depuração Adicional: Se nenhuma das etapas anteriores resolver o problema, pode ser útil adicionar mais informações de depuração, como registros de pilha de chamadas (stack traces) ou capturar exceções para entender melhor onde o código está falhando. Isso pode ser feito adicionando blocos try...catch em torno das operações que podem lançar exceções.

Por exemplo:

try {
    // Seu código de envio de e-mail aqui
} catch (\Exception $e) {
    \Log::error('Erro ao enviar e-mail: ' . $e->getMessage());
}

Valeu!

Boa tarde Estudante. Eu verifiquei o que você disse, mas logo na segunda etapa já deu um erro dizendo que o método connection não existe.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Você sabe porque está dando esse erro?