diff --git a/core/modules/contact/src/MailHandler.php b/core/modules/contact/src/MailHandler.php index 42d60a5f3e..44677d6ffc 100644 --- a/core/modules/contact/src/MailHandler.php +++ b/core/modules/contact/src/MailHandler.php @@ -10,6 +10,9 @@ use Drupal\Core\StringTranslation\TranslationInterface; use Psr\Log\LoggerInterface; +use Drupal\Core\Url; +use Drupal\symfony_mailer\Email; + /** * Provides a class for handling assembly and dispatch of contact mail messages. */ @@ -111,11 +114,11 @@ public function sendMailMessages(MessageInterface $message, AccountInterface $se // Send email to the recipient(s). $key_prefix = $message->isPersonal() ? 'user' : 'page'; - $this->mailManager->mail('contact', $key_prefix . '_mail', $to, $recipient_langcode, $params, $sender_cloned->getEmail()); + $this->sendMail($key_prefix . '_mail', $to, $recipient_langcode, $params, $sender_cloned->getEmail()); // If requested, send a copy to the user, using the current language. if ($message->copySender()) { - $this->mailManager->mail('contact', $key_prefix . '_copy', $sender_cloned->getEmail(), $current_langcode, $params, $sender_cloned->getEmail()); + $this->sendMail($key_prefix . '_copy', $sender_cloned->getEmail(), $current_langcode, $params, $sender_cloned->getEmail()); } // If configured, send an auto-reply, using the current language. @@ -128,7 +131,7 @@ public function sendMailMessages(MessageInterface $message, AccountInterface $se ]); } else { - $this->mailManager->mail('contact', 'page_autoreply', $sender_cloned->getEmail(), $current_langcode, $params); + $this->sendMail('page_autoreply', $sender_cloned->getEmail(), $current_langcode, $params); } } @@ -148,4 +151,70 @@ public function sendMailMessages(MessageInterface $message, AccountInterface $se } } + /** + * Sends a single mail. + */ + protected function sendMail($key, $to, $langcode, $params, $reply = NULL) { + $message = (new Email("contact.$key"))->to($to); + if ($reply) { + $message->addReplyTo($reply); + } + $contact_message = $params['contact_message']; + /** @var \Drupal\user\UserInterface $sender */ + $sender = $params['sender']; + $language = \Drupal::languageManager()->getLanguage($langcode); + + $variables = [ + '@site-name' => \Drupal::config('system.site')->get('name'), + '@subject' => $contact_message->getSubject(), + '@form' => !empty($params['contact_form']) ? $params['contact_form']->label() : NULL, + '@form-url' => Url::fromRoute('', [], ['absolute' => TRUE, 'language' => $language])->toString(), + '@sender-name' => $sender->getDisplayName(), + ]; + if ($sender->isAuthenticated()) { + $variables['@sender-url'] = $sender->toUrl('canonical', ['absolute' => TRUE, 'language' => $language])->toString(); + } + else { + $variables['@sender-url'] = $params['sender']->getEmail(); + } + + $message->data($variables); + $options = ['langcode' => $language->getId()]; + + switch ($key) { + case 'page_mail': + case 'page_copy': + $message->subject($this->t('[@form] @subject', $variables, $options)); + $message->appendParagraph($this->t("@sender-name (@sender-url) sent a message using the contact form at @form-url.", $variables, $options)); + $build = \Drupal::entityTypeManager() + ->getViewBuilder('contact_message') + ->view($contact_message, 'mail'); + $message->appendContent($build); + break; + + case 'page_autoreply': + $message->subject($this->t('[@form] @subject', $variables, $options)); + $message->content($params['contact_form']->getReply()); + break; + + case 'user_mail': + case 'user_copy': + $variables += [ + '@recipient-name' => $params['recipient']->getDisplayName(), + '@recipient-edit-url' => $params['recipient']->toUrl('edit-form', ['absolute' => TRUE, 'language' => $language])->toString(), + ]; + $message->subject($this->t('[@site-name] @subject', $variables, $options)); + $message->appendParagraph($this->t('Hello @recipient-name,', $variables, $options)); + $message->appendParagraph($this->t("@sender-name (@sender-url) has sent you a message via your contact form at @site-name.", $variables, $options)); + $message->appendParagraph($this->t("If you don't want to receive such emails, you can change your settings at @recipient-edit-url.", $variables, $options)); + $build = \Drupal::entityTypeManager() + ->getViewBuilder('contact_message') + ->view($contact_message, 'mail'); + $message->appendContent($build); + break; + } + + \Drupal::service('symfony_mailer')->send($message); + } + } diff --git a/core/modules/user/user.module b/core/modules/user/user.module index f21829bfec..efbdca88cd 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -26,6 +26,8 @@ use Drupal\user\RoleInterface; use Drupal\user\UserInterface; +use Drupal\symfony_mailer\Email; + /** * Implements hook_help(). */ @@ -1051,7 +1053,6 @@ function _user_mail_notify($op, AccountInterface $account, $langcode = NULL) { } if (\Drupal::config('user.settings')->get('notify.' . $op)) { - $params['account'] = $account; $langcode = $langcode ? $langcode : $account->getPreferredLangcode(); // Get the custom site notification email to use as the from email address // if it has been set. @@ -1064,14 +1065,42 @@ function _user_mail_notify($op, AccountInterface $account, $langcode = NULL) { if (empty($site_mail)) { $site_mail = ini_get('sendmail_from'); } - $mail = \Drupal::service('plugin.manager.mail')->mail('user', $op, $account->getEmail(), $langcode, $params, $site_mail); + + $mailer = \Drupal::service('symfony_mailer'); + $mail_config = \Drupal::config('user.mail'); + $subject = $mail_config->get("$op.subject"); + $content = [ + '#type' => 'processed_text', + '#text' => $mail_config->get("$op.body"), + '#format' => $mail_config->get('text_format'), + ]; + $data = ['user' => $account]; + $token_options = ['langcode' => $langcode, 'callback' => 'user_mail_tokens', 'clear' => TRUE]; + + $message = (new Email("user.$op")) + ->addTo($account->getEmail()) + ->subject($subject) + ->content($content) + ->addReplyTo($site_mail) + ->data($data) + ->enableTokenReplace($token_options); + $result = $mailer->send($message); + if ($op == 'register_pending_approval') { // If a user registered requiring admin approval, notify the admin, too. // We use the site default language for this. - \Drupal::service('plugin.manager.mail')->mail('user', 'register_pending_approval_admin', $site_mail, \Drupal::languageManager()->getDefaultLanguage()->getId(), $params); + $token_options['langcode'] = \Drupal::languageManager()->getDefaultLanguage()->getId(); + $message = (new Email("user.$op")) + ->addTo($site_mail) + ->subject($subject) + ->content($content) + ->addReplyTo($site_mail) + ->data($data) + ->enableTokenReplace($token_options); + $mailer->send($message); } } - return empty($mail) ? NULL : $mail['result']; + return $result; } /**