Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Fatal error: Maximum execution time of 300 seconds exceeded com PHPMailer

Fatal error: Maximum execution time of 300 seconds exceeded com PHPMailer

Implementei uma página onde o usuário insere o e-mail e recebe um link para cadastrar uma nova senha caso tenha esquecido a senha anterior. Para isso estou usando o PHPMailer na versão 6.5, e meu PHP está na versão 7.4. Com o código configurado estou recebendo o seguinte erro:

Fatal error: Maximum execution time of 300 seconds exceeded

Segue abaixo a classe Email com a configuração padrão do PHPMailer e a classe EmailParaSenha, responsável por pegar o email do usuário e extender a classe Email.

  • Classe Email
<?php

namespace Lucas\Procedo\Suport;

use Exception;
use stdClass;
use PHPMailer\PHPMailer\PHPMailer;

class Email
{
    /**
     * @var PHPMailer
     */
    private $email;

    /**
     * @var stdClass
     */
    private $dados;

    /**
     * @var Exception
     */
    private $error;

    public function __construct()
    {
        $this->email = new PHPMailer(true);
        $this->dados = new stdClass();

        $this->email->isSMTP();
        $this->email->isHTML();
        $this->email->setLanguage("br");

        $this->email->SMTPAuth = true;
        $this->email->SMTPSecure = true;
        $this->email->CharSet = "utf-8";

        $this->email->Host = "server_host";
        $this->email->Port = "465";
        $this->email->Username = "mail_server";
        $this->email->Password = "senha";
    }

    public function adicionaMensagem(string $assunto, string $corpoDaMensagem, string $nomeDestinatario, string $emailDestinatario): Email
    {
        $this->dados->assunto = $assunto;
        $this->dados->corpoDaMensagem = $corpoDaMensagem;
        $this->dados->nomeDestinatario = $nomeDestinatario;
        $this->dados->emailDestinatario = $emailDestinatario;
        return $this;
    }

    public function enviaEmail(string $nomeRemetente, string $emailRemetente): bool
    {
        try {
            $this->email->Subject = $this->dados->assunto;
            $this->email->msgHTML($this->dados->corpoDaMensagem);
            $this->email->addAddress(
                $this->dados->emailDestinatario, 
                $this->dados->nomeDestinatario
            );
            $this->email->setFrom($emailRemetente, $nomeRemetente);

            $this->email->send();
            return true;
        } catch (Exception $exception) {
            $this->error = $exception;
            return false;
        }
    }

    public function error(): ?Exception
    {
        return$this->error;
    }
}

*Classe EmailParaSenha

<?php

namespace Lucas\Procedo\Controller;

use Doctrine\ORM\EntityManagerInterface;
use Lucas\Procedo\Entity\Usuario;
use Lucas\Procedo\Helper\FlashMessagesTrait;
use Lucas\Procedo\Suport\Email;
use Nyholm\Psr7\Response;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;

class EmailParaSenha extends Email implements RequestHandlerInterface
{
    use FlashMessagesTrait;

    /**
     * @var \Doctrine\Common\Persistence\ObjectRepository|\Doctrine\ORM\EntityRepository|\Doctrine\Persistence\ObjectRepository
     */
    private $repositorioDeUsuarios;

    public function __construct(EntityManagerInterface $entityManager)
    {
        $this->repositorioDeUsuarios = $entityManager->getRepository(Usuario::class);
    }

    public function handle(ServerRequestInterface $request): ResponseInterface
    {
        $emailDoUsuario = filter_var(
            $request->getParsedBody()['userEmail'],
            FILTER_VALIDATE_EMAIL
        );

        $resposta = new Response(302, ['Location' => '/esqueci-senha']);

        if(is_null($emailDoUsuario) || $emailDoUsuario === false) {
            $this->defineMensagem('danger',
                'Insira um email válido!'
            );
            return $resposta;
        }

        $usuario = $this->repositorioDeUsuarios->findOneBy(['email' => $emailDoUsuario]);

        if(is_null($usuario)) {
            $this->defineMensagem('danger',
                'Insira um email válido!'
            );
            return $resposta;
        }

        $email = new Email();
        $email->adicionaMensagem(
            'E-mail teste',
            'Teste de envio de e-mails com phpmailer.',
            'Lucas Souza',
            $emailDoUsuario
        );

        $email->enviaEmail('Lucas', 'email_remetente');

        if(!$email->error()) {
            var_dump(true);
        } else {
            echo $email->error()->getMessage();
        }

        $this->defineMensagem(
            'info',
            'Cheque seu e-mail para informações de como cadastrar uma nova senha.'
        );

        return new Response(302, ['Location' => '/login']);
    }
}
1 resposta
solução!

Resolvido

Aparentemente o erro estava no servidor de e-mails que estava usando para testar. Fiz o teste com outro serviço de e-mails e funcionou.