SwiftMailer не отправляет почту в MessageHandler - PullRequest
0 голосов
/ 21 апреля 2020

Я использую SwiftMailer в своем проекте Symfony 5 для отправки электронных писем.

Я использовал его в контроллере для отправки электронного письма с паролем сброса, и все работало. Я сейчас пытаюсь использовать его в MessageHandler, вот код, который я сейчас использую:

final class SendEmailMessageHandler implements MessageHandlerInterface
{
private $mailer;

public function __construct(\Swift_Mailer $mailer)
{
    $this->mailer = $mailer;
}

public function __invoke(SendEmailMessage $message)
{
    $mail = (new \Swift_Message())
        ->setFrom($message->getFrom())
        ->setTo($message->getTo())
        ->setBody($message->getBody(), $message->getContentType())
        ->setSubject($message->getSubject());
    $response = $this->mailer->send($mail);
}
}

Ответ в порядке, но почта никогда не достигает моего почтового ящика.

Вот как я отправляю свое сообщение SendEmailMessage:

class AskResetPassword extends AbstractController
{
use ResetPasswordControllerTrait;

private $resetPasswordHelper;
private $validator;
private $bus;

public function __construct(ResetPasswordHelperInterface $resetPasswordHelper, ValidatorInterface $validator, MessageBusInterface $bus)
{
    $this->resetPasswordHelper = $resetPasswordHelper;
    $this->validator = $validator;
    $this->bus = $bus;
}

public function __invoke($data)
{
    $emailConstraints = new Assert\Email();

    $email = $data->getEmail();
    if ($email) {
        $errors = $this->validator->validate($email, $emailConstraints);
        if (count($errors) === 0) {
            return $this->processPasswordReset($email);
        } else {
            return new JsonResponse(['success' => false, 'error' => 'Invalid E-Mail format'], 404);
        }
    }
}

private function processPasswordReset($email)
{
    $user = $this->getDoctrine()->getRepository(User::class)->findOneBy([
        'email' => $email,
    ]);

    $this->setCanCheckEmailInSession();

    if (!$user) {
        // Do not reveal whether a user account was found or not.
        return new JsonResponse(['success' => true], 200);
    }

    try {
        $resetToken = $this->resetPasswordHelper->generateResetToken($user);
    } catch (ResetPasswordExceptionInterface $e) {
        return new JsonResponse(['success' => false, 'error' => 'There was a problem handling your password reset request - ' . $e->getReason()]);
    }
    $message = new SendEmailMessage($email);
    $message->setFrom('from.from@from.from');
    $message->setBody(
        $this->renderView('reset_password/email.html.twig', [
            'resetToken' => $resetToken,
            'tokenLifetime' => $this->resetPasswordHelper->getTokenLifetime()
        ])
    );
    $message->setSubject('Votre demande de changement de mot de passe');
    $this->bus->dispatch($message);

    return new JsonResponse(['success' => true], 200);
}
}

Вот мой swiftmailer.yaml:

swiftmailer:
    url: '%env(MAILER_URL)%'
    spool: { type: 'memory' }

Можете ли вы помочь мне?

Ответы [ 2 ]

0 голосов
/ 21 апреля 2020

Ответ: «НЕ спулингируйте электронные письма, если вы не хотите обрабатывать их позже». Проверьте документы Spool Emails

Спулер - это механизм очереди, который будет обрабатывать вашу очередь сообщений одну за другой. Это было введено, когда swift-mailer был переписан и добавлен обратно в symfony. В сочетании с компонентом Messenger, который предоставляет абстрактный интерфейс MessageBusInterface, он будет делегировать правому бэкэнду сервис, который может быть smtp relay, pu sh уведомлением или любым другим типом RP C, который может инициировать действия на отдельных веб-сервисах.

Поскольку symfony добавляет новые возможности к шине сообщений, эта функция была добавлена, чтобы использовать ее для очередей сообщений и других служб, где транзакционные электронные письма и уведомления обрабатываются отдельно.

Для обработки вашей очереди просто запустите:

APP_ENV=prod php bin/console swiftmailer:spool:send

В обычной установке спулинг отключен, когда вы включаете спулинг в памяти, он будет ждать, пока запрос не будет завершен, и ядро ​​собирается завершить работу. Если вы используете что-то еще для отладки, которая завершает работу ядра на полпути, или есть другие компоненты и части приложения, которые удерживают ядро ​​в памяти, события не будут инициированы и почта не будет отправлена.

Вы можете проверить всю документацию здесь: Отправка писем

0 голосов
/ 21 апреля 2020

Я не могу вспомнить точную причину, почему и во время публикации этого сообщения я изо всех сил пытаюсь найти ответ, но тип swiftmailer должен быть файлом вместо памяти. Эта проблема GitHub ссылается на это. Вы также можете посмотреть, как изменить тип здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...