Send emails through the queue

This commit is contained in:
Alexander Skvortsov 2020-03-28 18:52:00 -04:00 committed by Daniël Klabbers
parent 7286889e88
commit ca32879e1e
5 changed files with 71 additions and 43 deletions

View File

@ -10,12 +10,12 @@
namespace Flarum\Api\Controller; namespace Flarum\Api\Controller;
use Flarum\Http\UrlGenerator; use Flarum\Http\UrlGenerator;
use Flarum\Mail\Job\SendRawEmailJob;
use Flarum\Settings\SettingsRepositoryInterface; use Flarum\Settings\SettingsRepositoryInterface;
use Flarum\User\AssertPermissionTrait; use Flarum\User\AssertPermissionTrait;
use Flarum\User\EmailToken; use Flarum\User\EmailToken;
use Flarum\User\Exception\PermissionDeniedException; use Flarum\User\Exception\PermissionDeniedException;
use Illuminate\Contracts\Mail\Mailer; use Illuminate\Contracts\Queue\Queue;
use Illuminate\Mail\Message;
use Illuminate\Support\Arr; use Illuminate\Support\Arr;
use Laminas\Diactoros\Response\EmptyResponse; use Laminas\Diactoros\Response\EmptyResponse;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
@ -33,9 +33,9 @@ class SendConfirmationEmailController implements RequestHandlerInterface
protected $settings; protected $settings;
/** /**
* @var Mailer * @var Queue
*/ */
protected $mailer; protected $queue;
/** /**
* @var UrlGenerator * @var UrlGenerator
@ -49,14 +49,14 @@ class SendConfirmationEmailController implements RequestHandlerInterface
/** /**
* @param \Flarum\Settings\SettingsRepositoryInterface $settings * @param \Flarum\Settings\SettingsRepositoryInterface $settings
* @param Mailer $mailer * @param Queue $queue
* @param UrlGenerator $url * @param UrlGenerator $url
* @param TranslatorInterface $translator * @param TranslatorInterface $translator
*/ */
public function __construct(SettingsRepositoryInterface $settings, Mailer $mailer, UrlGenerator $url, TranslatorInterface $translator) public function __construct(SettingsRepositoryInterface $settings, Queue $queue, UrlGenerator $url, TranslatorInterface $translator)
{ {
$this->settings = $settings; $this->settings = $settings;
$this->mailer = $mailer; $this->queue = $queue;
$this->url = $url; $this->url = $url;
$this->translator = $translator; $this->translator = $translator;
} }
@ -85,11 +85,9 @@ class SendConfirmationEmailController implements RequestHandlerInterface
]; ];
$body = $this->translator->trans('core.email.activate_account.body', $data); $body = $this->translator->trans('core.email.activate_account.body', $data);
$subject = $this->translator->trans('core.email.activate_account.subject');
$this->mailer->raw($body, function (Message $message) use ($actor) { $this->queue->push(new SendRawEmailJob($actor->email, $subject, $body));
$message->to($actor->email);
$message->subject($this->translator->trans('core.email.activate_account.subject'));
});
return new EmptyResponse; return new EmptyResponse;
} }

View File

@ -0,0 +1,36 @@
<?php
/*
* This file is part of Flarum.
*
* For detailed copyright and license information, please view the
* LICENSE file that was distributed with this source code.
*/
namespace Flarum\Mail\Job;
use Flarum\Queue\AbstractJob;
use Illuminate\Contracts\Mail\Mailer;
use Illuminate\Mail\Message;
class SendRawEmailJob extends AbstractJob
{
private $email;
private $subject;
private $body;
public function __construct(string $email, string $subject, string $body)
{
$this->email = $email;
$this->subject = $subject;
$this->body = $body;
}
public function handle(Mailer $mailer)
{
$mailer->raw($this->body, function (Message $message) {
$message->to($this->email);
$message->subject($this->subject);
});
}
}

View File

@ -10,11 +10,11 @@
namespace Flarum\User; namespace Flarum\User;
use Flarum\Http\UrlGenerator; use Flarum\Http\UrlGenerator;
use Flarum\Mail\Job\SendRawEmailJob;
use Flarum\Settings\SettingsRepositoryInterface; use Flarum\Settings\SettingsRepositoryInterface;
use Flarum\User\Event\Registered; use Flarum\User\Event\Registered;
use Illuminate\Contracts\Mail\Mailer; use Illuminate\Contracts\Queue\Queue;
use Illuminate\Contracts\Translation\Translator; use Illuminate\Contracts\Translation\Translator;
use Illuminate\Mail\Message;
class AccountActivationMailer class AccountActivationMailer
{ {
@ -24,9 +24,9 @@ class AccountActivationMailer
protected $settings; protected $settings;
/** /**
* @var Mailer * @var Queue
*/ */
protected $mailer; protected $queue;
/** /**
* @var UrlGenerator * @var UrlGenerator
@ -40,14 +40,14 @@ class AccountActivationMailer
/** /**
* @param \Flarum\Settings\SettingsRepositoryInterface $settings * @param \Flarum\Settings\SettingsRepositoryInterface $settings
* @param Mailer $mailer * @param Queue $queue
* @param UrlGenerator $url * @param UrlGenerator $url
* @param Translator $translator * @param Translator $translator
*/ */
public function __construct(SettingsRepositoryInterface $settings, Mailer $mailer, UrlGenerator $url, Translator $translator) public function __construct(SettingsRepositoryInterface $settings, Queue $queue, UrlGenerator $url, Translator $translator)
{ {
$this->settings = $settings; $this->settings = $settings;
$this->mailer = $mailer; $this->queue = $queue;
$this->url = $url; $this->url = $url;
$this->translator = $translator; $this->translator = $translator;
} }
@ -63,11 +63,9 @@ class AccountActivationMailer
$data = $this->getEmailData($user, $user->email); $data = $this->getEmailData($user, $user->email);
$body = $this->translator->trans('core.email.activate_account.body', $data); $body = $this->translator->trans('core.email.activate_account.body', $data);
$subject = '['.$data['{forum}'].'] '.$this->translator->trans('core.email.activate_account.subject');
$this->mailer->raw($body, function (Message $message) use ($user, $data) { $this->queue->push(new SendRawEmailJob($user->email, $subject, $body));
$message->to($user->email);
$message->subject('['.$data['{forum}'].'] '.$this->translator->trans('core.email.activate_account.subject'));
});
} }
/** /**

View File

@ -10,14 +10,14 @@
namespace Flarum\User\Command; namespace Flarum\User\Command;
use Flarum\Http\UrlGenerator; use Flarum\Http\UrlGenerator;
use Flarum\Mail\Job\SendRawEmailJob;
use Flarum\Settings\SettingsRepositoryInterface; use Flarum\Settings\SettingsRepositoryInterface;
use Flarum\User\PasswordToken; use Flarum\User\PasswordToken;
use Flarum\User\UserRepository; use Flarum\User\UserRepository;
use Illuminate\Contracts\Mail\Mailer; use Illuminate\Contracts\Queue\Queue;
use Illuminate\Contracts\Translation\Translator; use Illuminate\Contracts\Translation\Translator;
use Illuminate\Contracts\Validation\Factory; use Illuminate\Contracts\Validation\Factory;
use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Mail\Message;
use Illuminate\Validation\ValidationException; use Illuminate\Validation\ValidationException;
class RequestPasswordResetHandler class RequestPasswordResetHandler
@ -33,9 +33,9 @@ class RequestPasswordResetHandler
protected $settings; protected $settings;
/** /**
* @var Mailer * @var Queue
*/ */
protected $mailer; protected $queue;
/** /**
* @var UrlGenerator * @var UrlGenerator
@ -55,7 +55,7 @@ class RequestPasswordResetHandler
/** /**
* @param UserRepository $users * @param UserRepository $users
* @param SettingsRepositoryInterface $settings * @param SettingsRepositoryInterface $settings
* @param Mailer $mailer * @param Queue $queue
* @param UrlGenerator $url * @param UrlGenerator $url
* @param Translator $translator * @param Translator $translator
* @param Factory $validatorFactory * @param Factory $validatorFactory
@ -63,14 +63,14 @@ class RequestPasswordResetHandler
public function __construct( public function __construct(
UserRepository $users, UserRepository $users,
SettingsRepositoryInterface $settings, SettingsRepositoryInterface $settings,
Mailer $mailer, Queue $queue,
UrlGenerator $url, UrlGenerator $url,
Translator $translator, Translator $translator,
Factory $validatorFactory Factory $validatorFactory
) { ) {
$this->users = $users; $this->users = $users;
$this->settings = $settings; $this->settings = $settings;
$this->mailer = $mailer; $this->queue = $queue;
$this->url = $url; $this->url = $url;
$this->translator = $translator; $this->translator = $translator;
$this->validatorFactory = $validatorFactory; $this->validatorFactory = $validatorFactory;
@ -110,11 +110,9 @@ class RequestPasswordResetHandler
]; ];
$body = $this->translator->trans('core.email.reset_password.body', $data); $body = $this->translator->trans('core.email.reset_password.body', $data);
$subject = '['.$data['{forum}'].'] '.$this->translator->trans('core.email.reset_password.subject');
$this->mailer->raw($body, function (Message $message) use ($user, $data) { $this->queue->push(new SendRawEmailJob($user->email, $subject, $body));
$message->to($user->email);
$message->subject('['.$data['{forum}'].'] '.$this->translator->trans('core.email.reset_password.subject'));
});
return $user; return $user;
} }

View File

@ -10,11 +10,11 @@
namespace Flarum\User; namespace Flarum\User;
use Flarum\Http\UrlGenerator; use Flarum\Http\UrlGenerator;
use Flarum\Mail\Job\SendRawEmailJob;
use Flarum\Settings\SettingsRepositoryInterface; use Flarum\Settings\SettingsRepositoryInterface;
use Flarum\User\Event\EmailChangeRequested; use Flarum\User\Event\EmailChangeRequested;
use Illuminate\Contracts\Mail\Mailer; use Illuminate\Contracts\Queue\Queue;
use Illuminate\Contracts\Translation\Translator; use Illuminate\Contracts\Translation\Translator;
use Illuminate\Mail\Message;
class EmailConfirmationMailer class EmailConfirmationMailer
{ {
@ -24,9 +24,9 @@ class EmailConfirmationMailer
protected $settings; protected $settings;
/** /**
* @var Mailer * @var Queue
*/ */
protected $mailer; protected $queue;
/** /**
* @var UrlGenerator * @var UrlGenerator
@ -38,10 +38,10 @@ class EmailConfirmationMailer
*/ */
protected $translator; protected $translator;
public function __construct(SettingsRepositoryInterface $settings, Mailer $mailer, UrlGenerator $url, Translator $translator) public function __construct(SettingsRepositoryInterface $settings, Queue $queue, UrlGenerator $url, Translator $translator)
{ {
$this->settings = $settings; $this->settings = $settings;
$this->mailer = $mailer; $this->queue = $queue;
$this->url = $url; $this->url = $url;
$this->translator = $translator; $this->translator = $translator;
} }
@ -52,11 +52,9 @@ class EmailConfirmationMailer
$data = $this->getEmailData($event->user, $email); $data = $this->getEmailData($event->user, $email);
$body = $this->translator->trans('core.email.confirm_email.body', $data); $body = $this->translator->trans('core.email.confirm_email.body', $data);
$subject = '['.$data['{forum}'].'] '.$this->translator->trans('core.email.confirm_email.subject');
$this->mailer->raw($body, function (Message $message) use ($email, $data) { $this->queue->push(new SendRawEmailJob($email, $subject, $body));
$message->to($email);
$message->subject('['.$data['{forum}'].'] '.$this->translator->trans('core.email.confirm_email.subject'));
});
} }
/** /**