Chris@0: token = $token; Chris@0: $this->storage = $entity_manager->getStorage('user'); Chris@0: $this->logger = $logger; Chris@0: $this->mailManager = $mail_manager; Chris@0: $this->languageManager = $language_manager; Chris@0: $this->emailValidator = $email_validator; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) { Chris@0: return new static($configuration, $plugin_id, $plugin_definition, Chris@0: $container->get('token'), Chris@0: $container->get('entity.manager'), Chris@0: $container->get('logger.factory')->get('action'), Chris@0: $container->get('plugin.manager.mail'), Chris@0: $container->get('language_manager'), Chris@0: $container->get('email.validator') Chris@0: ); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function execute($entity = NULL) { Chris@0: if (empty($this->configuration['node'])) { Chris@0: $this->configuration['node'] = $entity; Chris@0: } Chris@0: Chris@0: $recipient = PlainTextOutput::renderFromHtml($this->token->replace($this->configuration['recipient'], $this->configuration)); Chris@0: Chris@0: // If the recipient is a registered user with a language preference, use Chris@0: // the recipient's preferred language. Otherwise, use the system default Chris@0: // language. Chris@0: $recipient_accounts = $this->storage->loadByProperties(['mail' => $recipient]); Chris@0: $recipient_account = reset($recipient_accounts); Chris@0: if ($recipient_account) { Chris@0: $langcode = $recipient_account->getPreferredLangcode(); Chris@0: } Chris@0: else { Chris@0: $langcode = $this->languageManager->getDefaultLanguage()->getId(); Chris@0: } Chris@0: $params = ['context' => $this->configuration]; Chris@0: Chris@16: $message = $this->mailManager->mail('system', 'action_send_email', $recipient, $langcode, $params); Chris@16: // Error logging is handled by \Drupal\Core\Mail\MailManager::mail(). Chris@16: if ($message['result']) { Chris@0: $this->logger->notice('Sent email to %recipient', ['%recipient' => $recipient]); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function defaultConfiguration() { Chris@0: return [ Chris@0: 'recipient' => '', Chris@0: 'subject' => '', Chris@0: 'message' => '', Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function buildConfigurationForm(array $form, FormStateInterface $form_state) { Chris@0: $form['recipient'] = [ Chris@0: '#type' => 'textfield', Chris@0: '#title' => t('Recipient email address'), Chris@0: '#default_value' => $this->configuration['recipient'], Chris@0: '#maxlength' => '254', Chris@0: '#description' => t('You may also use tokens: [node:author:mail], [comment:author:mail], etc. Separate recipients with a comma.'), Chris@0: ]; Chris@0: $form['subject'] = [ Chris@0: '#type' => 'textfield', Chris@0: '#title' => t('Subject'), Chris@0: '#default_value' => $this->configuration['subject'], Chris@0: '#maxlength' => '254', Chris@0: '#description' => t('The subject of the message.'), Chris@0: ]; Chris@0: $form['message'] = [ Chris@0: '#type' => 'textarea', Chris@0: '#title' => t('Message'), Chris@0: '#default_value' => $this->configuration['message'], Chris@0: '#cols' => '80', Chris@0: '#rows' => '20', Chris@0: '#description' => t('The message that should be sent. You may include placeholders like [node:title], [user:account-name], [user:display-name] and [comment:body] to represent data that will be different each time message is sent. Not all placeholders will be available in all contexts.'), Chris@0: ]; Chris@0: return $form; Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function validateConfigurationForm(array &$form, FormStateInterface $form_state) { Chris@0: if (!$this->emailValidator->isValid($form_state->getValue('recipient')) && strpos($form_state->getValue('recipient'), ':mail') === FALSE) { Chris@0: // We want the literal %author placeholder to be emphasized in the error message. Chris@0: $form_state->setErrorByName('recipient', t('Enter a valid email address or use a token email address such as %author.', ['%author' => '[node:author:mail]'])); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function submitConfigurationForm(array &$form, FormStateInterface $form_state) { Chris@0: $this->configuration['recipient'] = $form_state->getValue('recipient'); Chris@0: $this->configuration['subject'] = $form_state->getValue('subject'); Chris@0: $this->configuration['message'] = $form_state->getValue('message'); Chris@0: } Chris@0: Chris@0: /** Chris@0: * {@inheritdoc} Chris@0: */ Chris@0: public function access($object, AccountInterface $account = NULL, $return_as_object = FALSE) { Chris@0: $result = AccessResult::allowed(); Chris@0: return $return_as_object ? $result : $result->isAllowed(); Chris@0: } Chris@0: Chris@0: }