Mercurial > hg > isophonics-drupal-site
diff core/modules/contact/src/MailHandler.php @ 0:4c8ae668cc8c
Initial import (non-working)
author | Chris Cannam |
---|---|
date | Wed, 29 Nov 2017 16:09:58 +0000 |
parents | |
children | 129ea1e6d783 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core/modules/contact/src/MailHandler.php Wed Nov 29 16:09:58 2017 +0000 @@ -0,0 +1,151 @@ +<?php + +namespace Drupal\contact; + +use Drupal\Core\Entity\EntityManagerInterface; +use Drupal\Core\Language\LanguageManagerInterface; +use Drupal\Core\Mail\MailManagerInterface; +use Drupal\Core\Session\AccountInterface; +use Drupal\Core\StringTranslation\StringTranslationTrait; +use Drupal\Core\StringTranslation\TranslationInterface; +use Psr\Log\LoggerInterface; + +/** + * Provides a class for handling assembly and dispatch of contact mail messages. + */ +class MailHandler implements MailHandlerInterface { + + use StringTranslationTrait; + + /** + * Language manager service. + * + * @var \Drupal\Core\Language\LanguageManagerInterface + */ + protected $languageManager; + + /** + * Logger service. + * + * @var \Drupal\Core\Logger\LoggerChannelInterface + */ + protected $logger; + + /** + * Mail manager service. + * + * @var \Drupal\Core\Mail\MailManagerInterface + */ + protected $mailManager; + + /** + * The user entity storage handler. + * + * @var \Drupal\Core\Entity\EntityStorageInterface + */ + protected $userStorage; + + /** + * Constructs a new \Drupal\contact\MailHandler object. + * + * @param \Drupal\Core\Mail\MailManagerInterface $mail_manager + * Mail manager service. + * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager + * Language manager service. + * @param \Psr\Log\LoggerInterface $logger + * A logger instance. + * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation + * String translation service. + * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager + * Entity manager service. + */ + public function __construct(MailManagerInterface $mail_manager, LanguageManagerInterface $language_manager, LoggerInterface $logger, TranslationInterface $string_translation, EntityManagerInterface $entity_manager) { + $this->languageManager = $language_manager; + $this->mailManager = $mail_manager; + $this->logger = $logger; + $this->stringTranslation = $string_translation; + $this->userStorage = $entity_manager->getStorage('user'); + } + + /** + * {@inheritdoc} + */ + public function sendMailMessages(MessageInterface $message, AccountInterface $sender) { + // Clone the sender, as we make changes to mail and name properties. + $sender_cloned = clone $this->userStorage->load($sender->id()); + $params = []; + $current_langcode = $this->languageManager->getCurrentLanguage()->getId(); + $recipient_langcode = $this->languageManager->getDefaultLanguage()->getId(); + $contact_form = $message->getContactForm(); + + if ($sender_cloned->isAnonymous()) { + // At this point, $sender contains an anonymous user, so we need to take + // over the submitted form values. + $sender_cloned->name = $message->getSenderName(); + $sender_cloned->mail = $message->getSenderMail(); + + // For the email message, clarify that the sender name is not verified; it + // could potentially clash with a username on this site. + $sender_cloned->name = $this->t('@name (not verified)', ['@name' => $message->getSenderName()]); + } + + // Build email parameters. + $params['contact_message'] = $message; + $params['sender'] = $sender_cloned; + + if (!$message->isPersonal()) { + // Send to the form recipient(s), using the site's default language. + $params['contact_form'] = $contact_form; + + $to = implode(', ', $contact_form->getRecipients()); + } + elseif ($recipient = $message->getPersonalRecipient()) { + // Send to the user in the user's preferred language. + $to = $recipient->getEmail(); + $recipient_langcode = $recipient->getPreferredLangcode(); + $params['recipient'] = $recipient; + } + else { + throw new MailHandlerException('Unable to determine message recipient'); + } + + // 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()); + + // 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()); + } + + // If configured, send an auto-reply, using the current language. + if (!$message->isPersonal() && $contact_form->getReply()) { + // User contact forms do not support an auto-reply message, so this + // message always originates from the site. + if (!$sender_cloned->getEmail()) { + $this->logger->error('Error sending auto-reply, missing sender e-mail address in %contact_form', [ + '%contact_form' => $contact_form->label(), + ]); + } + else { + $this->mailManager->mail('contact', 'page_autoreply', $sender_cloned->getEmail(), $current_langcode, $params); + } + } + + if (!$message->isPersonal()) { + $this->logger->notice('%sender-name (@sender-from) sent an email regarding %contact_form.', [ + '%sender-name' => $sender_cloned->getUsername(), + '@sender-from' => $sender_cloned->getEmail(), + '%contact_form' => $contact_form->label(), + ]); + } + else { + $this->logger->notice('%sender-name (@sender-from) sent %recipient-name an email.', [ + '%sender-name' => $sender_cloned->getUsername(), + '@sender-from' => $sender_cloned->getEmail(), + '%recipient-name' => $message->getPersonalRecipient()->getUsername(), + ]); + } + } + +}