at the end of the day, it was inevitable
This commit is contained in:
@@ -0,0 +1,161 @@
|
||||
<?php
|
||||
|
||||
namespace UserBundle\Mailer;
|
||||
|
||||
use AppBundle\Entity\EmailedDocument;
|
||||
use Psr\Log\LoggerInterface;
|
||||
use UserBundle\Entity\Notification\Notification;
|
||||
use UserBundle\Entity\User;
|
||||
|
||||
/**
|
||||
* Class LoggableMailer
|
||||
*
|
||||
* @package UserBundle\Mailer
|
||||
*/
|
||||
class LoggableMailer implements MailerInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @var MailerInterface
|
||||
*/
|
||||
private $mailer;
|
||||
|
||||
/**
|
||||
* @var LoggerInterface
|
||||
*/
|
||||
private $logger;
|
||||
|
||||
/**
|
||||
* LoggableMailer constructor.
|
||||
*
|
||||
* @param MailerInterface $mailer A MailerInterface instance.
|
||||
* @param LoggerInterface $logger A LoggerInterface instance.
|
||||
*/
|
||||
public function __construct(
|
||||
MailerInterface $mailer,
|
||||
LoggerInterface $logger
|
||||
) {
|
||||
$this->mailer = $mailer;
|
||||
$this->logger = $logger;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send generated password to user.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
* @param string $password Generated password.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendPassword(User $user, $password)
|
||||
{
|
||||
$this->logger->info('Send password to '. $user->getId());
|
||||
|
||||
return $this->mailer->sendPassword($user, $password);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send password resetting confirmation email.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendPasswordResettingConfirmation(User $user)
|
||||
{
|
||||
$this->logger->info('Send password resetting confirmation to '. $user->getId());
|
||||
|
||||
return $this->mailer->sendPasswordResettingConfirmation($user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send notification email to specified addresses.
|
||||
*
|
||||
* @param array $addresses Array of recipient emails.
|
||||
* @param string $subject Notification subject.
|
||||
* @param string $body Notification body.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendNotificationEmail(array $addresses, $subject, $body)
|
||||
{
|
||||
$this->logger->info(
|
||||
'Send notification to '. implode(', ', $addresses) .' recipients'
|
||||
);
|
||||
|
||||
return $this->mailer->sendNotificationEmail($addresses, $subject, $body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send emailed document to recipients.
|
||||
*
|
||||
* @param EmailedDocument $emailedDocument A EmailedDocument instance.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendEmailedDocument(EmailedDocument $emailedDocument)
|
||||
{
|
||||
$this->logger->info('Send emailed document to '. implode(', ', $emailedDocument->getEmailTo()));
|
||||
|
||||
return $this->mailer->sendEmailedDocument($emailedDocument);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send generated password and confirm url to user.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
* @param string $confirmUrl Generated confirm url.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendVerificationSuccess(User $user, $confirmUrl)
|
||||
{
|
||||
$this->logger->info('Send verification success email to '. $user->getId());
|
||||
|
||||
return $this->mailer->sendVerificationSuccess($user, $confirmUrl);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send email about failed verification.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendVerificationRejected(User $user)
|
||||
{
|
||||
$this->logger->info('Send verification success email to '. $user->getId());
|
||||
|
||||
return $this->mailer->sendVerificationRejected($user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send unsubscribe notification.
|
||||
*
|
||||
* @param Notification $notification A Notification entity.
|
||||
* @param User $user A User entity who unsubscribe from
|
||||
* specified notification.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendUnsubscribe(Notification $notification, User $user)
|
||||
{
|
||||
$this->logger->info('Send unsubscribe notification to '. $notification->getOwner()->getFullName());
|
||||
|
||||
return $this->mailer->sendUnsubscribe($notification, $user);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send mail messages.
|
||||
*
|
||||
* Should be called only in command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function flushQueue()
|
||||
{
|
||||
$this->logger->info('Spool messages');
|
||||
|
||||
$this->mailer->flushQueue();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,337 @@
|
||||
<?php
|
||||
|
||||
namespace UserBundle\Mailer;
|
||||
|
||||
use AppBundle\Configuration\ConfigurationInterface;
|
||||
use AppBundle\Configuration\ParametersName;
|
||||
use AppBundle\Entity\EmailedDocument;
|
||||
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
|
||||
use UserBundle\Entity\Notification\Notification;
|
||||
use UserBundle\Entity\User;
|
||||
use FOS\UserBundle\Model\UserInterface;
|
||||
|
||||
/**
|
||||
* Class Mailer
|
||||
* Default implementation of MailerInterface.
|
||||
*
|
||||
* @package UserBundle\Mailer
|
||||
*/
|
||||
class Mailer implements MailerInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* @var \Swift_Mailer
|
||||
*/
|
||||
private $mailer;
|
||||
|
||||
/**
|
||||
* @var \Swift_Transport
|
||||
*/
|
||||
private $transport;
|
||||
|
||||
/**
|
||||
* @var \Twig_Environment
|
||||
*/
|
||||
private $twig;
|
||||
|
||||
/**
|
||||
* @var ConfigurationInterface
|
||||
*/
|
||||
private $configuration;
|
||||
|
||||
/**
|
||||
* @var UrlGeneratorInterface
|
||||
*/
|
||||
private $urlGenerator;
|
||||
|
||||
/**
|
||||
* @param \Swift_Mailer $mailer A Swift_Mailer instance.
|
||||
* @param \Swift_Transport $transport A Swift_Transport instance.
|
||||
* @param \Twig_Environment $twig A \Twig_Environment instance.
|
||||
* @param ConfigurationInterface $configuration A ConfigurationInterface
|
||||
* instance.
|
||||
* @param UrlGeneratorInterface $urlGenerator A UrlGeneratorInterface
|
||||
* instance.
|
||||
*/
|
||||
public function __construct(
|
||||
\Swift_Mailer $mailer,
|
||||
\Swift_Transport $transport,
|
||||
\Twig_Environment $twig,
|
||||
ConfigurationInterface $configuration,
|
||||
UrlGeneratorInterface $urlGenerator
|
||||
) {
|
||||
$this->mailer = $mailer;
|
||||
$this->transport = $transport;
|
||||
$this->twig = $twig;
|
||||
$this->configuration = $configuration;
|
||||
$this->urlGenerator = $urlGenerator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send generated password to user.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
* @param string $password Generated password.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendPassword(User $user, $password)
|
||||
{
|
||||
return $this->sendEmail(
|
||||
$user->getEmail(),
|
||||
'Password is changed',
|
||||
ParametersName::MAIL_PASSWORD,
|
||||
[
|
||||
'user' => $user,
|
||||
'password' => $password,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send generated password and confirm url to user.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
* @param string $password A user plain password.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendVerificationSuccess(User $user, $password)
|
||||
{
|
||||
return $this->sendEmail(
|
||||
$user->getEmail(),
|
||||
'Verification status',
|
||||
ParametersName::MAIL_VERIFICATION_SUCCESS,
|
||||
[
|
||||
'user' => $user,
|
||||
'password' => $password,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send email about failed verification.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendVerificationRejected(User $user)
|
||||
{
|
||||
return $this->sendEmail(
|
||||
$user->getEmail(),
|
||||
'Verification status',
|
||||
ParametersName::MAIL_VERIFICATION_REJECT,
|
||||
[
|
||||
'user' => $user,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send password resetting confirmation email.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendPasswordResettingConfirmation(User $user)
|
||||
{
|
||||
return $this->sendEmail(
|
||||
$user->getEmail(),
|
||||
'Password resetting',
|
||||
ParametersName::MAIL_RESETTING_CONFIRMATION,
|
||||
[
|
||||
'user' => $user,
|
||||
'confirmationUrl' => $this->urlGenerator->generate('app_index_index', [
|
||||
'part' => 'auth/reset-password',
|
||||
'resetting_token' => $user->getConfirmationToken(),
|
||||
], UrlGeneratorInterface::ABSOLUTE_URL),
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send notification email to specified addresses.
|
||||
*
|
||||
* @param array $addresses Array of recipient emails.
|
||||
* @param string $subject Notification subject.
|
||||
* @param string $body Notification body.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendNotificationEmail(array $addresses, $subject, $body)
|
||||
{
|
||||
$from = $this->configuration->getParameter(ParametersName::MAILER_ADDRESS);
|
||||
$fromName = $this->configuration->getParameter(ParametersName::MAILER_SENDER_NAME);
|
||||
|
||||
$message = \Swift_Message::newInstance()
|
||||
->setTo($addresses)
|
||||
->setFrom($from, $fromName)
|
||||
->setSubject($subject)
|
||||
->setBody($body, 'text/html');
|
||||
|
||||
return $this->send($message) > 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @param string $renderedTemplate
|
||||
* @param array|string $fromEmail
|
||||
* @param array|string $toEmail
|
||||
*/
|
||||
public function sendEmailMessage(UserInterface $user, $baseurl)
|
||||
{
|
||||
// Render the email, use the first line as the subject, and the rest as the body
|
||||
$parameters = array(
|
||||
'user' => $user,
|
||||
'confirmationUrl' => $baseurl.'/auth/confirm-account/'.$user->getConfirmationToken(),
|
||||
);
|
||||
$toEmail = (string) $user->getEmail();
|
||||
$template = $this->twig->load('@FOSUser/Registration/email.txt.twig');
|
||||
|
||||
$message = (new \Swift_Message())
|
||||
->setSubject('Verify your email address')
|
||||
->setFrom("support@socialhose.io","SOCIALHOSE.IO")
|
||||
->setTo($toEmail)
|
||||
->setBody($template->render(
|
||||
$parameters
|
||||
));
|
||||
|
||||
$this->send($message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send emailed document to recipients.
|
||||
*
|
||||
* @param EmailedDocument $emailedDocument A EmailedDocument instance.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendEmailedDocument(EmailedDocument $emailedDocument)
|
||||
{
|
||||
$subject = $emailedDocument->getSubject() === ''
|
||||
? 'Emailed document content'
|
||||
: $emailedDocument->getSubject();
|
||||
|
||||
$from = $this->configuration->getParameter(ParametersName::MAILER_ADDRESS);
|
||||
$fromName = $this->configuration->getParameter(ParametersName::MAILER_SENDER_NAME);
|
||||
|
||||
$message = \Swift_Message::newInstance()
|
||||
->setTo($emailedDocument->getEmailTo())
|
||||
->setFrom($from, $fromName)
|
||||
->setReplyTo($emailedDocument->getEmailReplyTo())
|
||||
->setSubject($subject)
|
||||
->setBody($emailedDocument->getContent(), 'text/html');
|
||||
|
||||
return $this->send($message) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Send unsubscribe notification.
|
||||
*
|
||||
* @param Notification $notification A Notification entity.
|
||||
* @param User $user A User entity who unsubscribe from
|
||||
* specified notification.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendUnsubscribe(Notification $notification, User $user)
|
||||
{
|
||||
return $this->sendEmail(
|
||||
$user->getEmail(),
|
||||
sprintf(
|
||||
'User %s unsubscribed from %s',
|
||||
$user->getFullName(),
|
||||
$notification->getName()
|
||||
),
|
||||
ParametersName::MAIL_UNSUBSCRIBE,
|
||||
[
|
||||
'user' => $user,
|
||||
'notification' => $notification,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send mail messages.
|
||||
*
|
||||
* Should be called only in command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function flushQueue()
|
||||
{
|
||||
$transport = $this->mailer->getTransport();
|
||||
if ($transport instanceof \Swift_Transport_SpoolTransport) {
|
||||
$spool = $transport->getSpool();
|
||||
if ($spool instanceof \Swift_MemorySpool) {
|
||||
$spool->flushQueue($this->transport);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $recipient Recipient email address.
|
||||
* @param string $subject Email subject.
|
||||
* @param string $bodyParameterName Name of configuration parameter which is
|
||||
* holds body text.
|
||||
* @param array $parameters Template parameters.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
private function sendEmail($recipient, $subject, $bodyParameterName, array $parameters = [])
|
||||
{
|
||||
$from = $this->configuration->getParameter(ParametersName::MAILER_ADDRESS);
|
||||
$fromName = $this->configuration->getParameter(ParametersName::MAILER_SENDER_NAME);
|
||||
|
||||
$message = \Swift_Message::newInstance($subject, $this->twig->render(
|
||||
'UserBundle::email_layout.html.twig',
|
||||
[
|
||||
'body' => $this->twig->createTemplate(
|
||||
$this->configuration->getParameter($bodyParameterName)
|
||||
)->render($parameters),
|
||||
]
|
||||
), 'text/html')
|
||||
->setTo($recipient)
|
||||
->setFrom($from, $fromName);
|
||||
|
||||
return $this->send($message) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Swift_Message $message
|
||||
* @return int
|
||||
*/
|
||||
private function send($message)
|
||||
{
|
||||
$this->resetTransport();
|
||||
|
||||
return $this->mailer->send($message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset SMTP connection for each send so that connections
|
||||
* are not dropped during long-running processes.
|
||||
*
|
||||
* See https://github.com/swiftmailer/swiftmailer/issues/490#issuecomment-72492442
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function resetTransport()
|
||||
{
|
||||
try {
|
||||
if ($this->transport instanceof \Swift_Transport_AbstractSmtpTransport) {
|
||||
$this->transport->reset();
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
try {
|
||||
$this->transport->stop();
|
||||
} catch (\Exception $e) {
|
||||
// pass
|
||||
}
|
||||
// $this->transport->start();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace UserBundle\Mailer;
|
||||
|
||||
use AppBundle\Entity\EmailedDocument;
|
||||
use UserBundle\Entity\Notification\Notification;
|
||||
use UserBundle\Entity\User;
|
||||
|
||||
/**
|
||||
* Interface MailerInterface
|
||||
* Send emails to user.
|
||||
*
|
||||
* @package UserBundle\Mailer
|
||||
*/
|
||||
interface MailerInterface
|
||||
{
|
||||
|
||||
/**
|
||||
* Send generated password to user.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
* @param string $password Generated password.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendPassword(User $user, $password);
|
||||
|
||||
/**
|
||||
* Send email about success verification.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
* @param string $confirmUrl Generated confirm url.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendVerificationSuccess(User $user, $confirmUrl);
|
||||
|
||||
/**
|
||||
* Send email about failed verification.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendVerificationRejected(User $user);
|
||||
|
||||
/**
|
||||
* Send password resetting confirmation email.
|
||||
*
|
||||
* @param User $user A User entity instance.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendPasswordResettingConfirmation(User $user);
|
||||
|
||||
/**
|
||||
* Send notification email to specified addresses.
|
||||
*
|
||||
* @param array $addresses Array of recipient emails.
|
||||
* @param string $subject Notification subject.
|
||||
* @param string $body Notification body.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendNotificationEmail(array $addresses, $subject, $body);
|
||||
|
||||
/**
|
||||
* Send emailed document to recipients.
|
||||
*
|
||||
* @param EmailedDocument $emailedDocument A EmailedDocument instance.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendEmailedDocument(EmailedDocument $emailedDocument);
|
||||
|
||||
/**
|
||||
* Send unsubscribe notification.
|
||||
*
|
||||
* @param Notification $notification A Notification entity.
|
||||
* @param User $user A User entity who unsubscribe from
|
||||
* specified notification.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function sendUnsubscribe(Notification $notification, User $user);
|
||||
|
||||
/**
|
||||
* Send mail messages.
|
||||
*
|
||||
* Should be called only in command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function flushQueue();
|
||||
}
|
||||
Reference in New Issue
Block a user