152 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			152 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| 
 | |
| namespace Drupal\contact;
 | |
| 
 | |
| use Drupal\Core\Entity\EntityTypeManagerInterface;
 | |
| 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\EntityTypeManagerInterface $entity_type_manager
 | |
|    *   The entity type manager.
 | |
|    */
 | |
|   public function __construct(MailManagerInterface $mail_manager, LanguageManagerInterface $language_manager, LoggerInterface $logger, TranslationInterface $string_translation, EntityTypeManagerInterface $entity_type_manager) {
 | |
|     $this->languageManager = $language_manager;
 | |
|     $this->mailManager = $mail_manager;
 | |
|     $this->logger = $logger;
 | |
|     $this->stringTranslation = $string_translation;
 | |
|     $this->userStorage = $entity_type_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->getAccountName(),
 | |
|         '@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->getAccountName(),
 | |
|         '@sender-from' => $sender_cloned->getEmail(),
 | |
|         '%recipient-name' => $message->getPersonalRecipient()->getAccountName(),
 | |
|       ]);
 | |
|     }
 | |
|   }
 | |
| 
 | |
| }
 |