Как модуль сообщает Drupal, какой почтовый плагин следует использовать?


Как модуль сообщает Drupal, какой почтовый плагин следует использовать? Модуль Поддержки аутентификации SMTP использует следующий код в обработчике отправки своей формы настроек.

$values = $form_state->getValues();
$config = $this->configFactory->getEditable('smtp.settings');
$mail_config = $this->configFactory->getEditable('system.mail');
$mail_system = $mail_config->get('interface');

// Updating config vars.
if (isset($values['smtp_password'])) {
  $config->set('smtp_password', $values['smtp_password']);
}
$config->set('smtp_on', $values['smtp_on'])
  ->set('smtp_host', $values['smtp_host'])
  ->set('smtp_hostbackup', $values['smtp_hostbackup'])
  ->set('smtp_port', $values['smtp_port'])
  ->set('smtp_protocol', $values['smtp_protocol'])
  ->set('smtp_username', $values['smtp_username'])
  ->set('smtp_from', $values['smtp_from'])
  ->set('smtp_fromname', $values['smtp_fromname'])
  ->set('smtp_allowhtml', $values['smtp_allowhtml'])
  ->set('smtp_debugging', $values['smtp_debugging'])
  ->save();

// If an address was given, send a test e-mail message.
if ($test_address = $values['smtp_test_address']) {
  $params['subject'] = t('Drupal SMTP test e-mail');
  $params['body'] = array(t('If you receive this message it means your site is capable of using SMTP to send e-mail.'));
  $account = \Drupal::currentUser();
  // If module is off, send the test message with SMTP by temporarily overriding.
  if (!$config->get('smtp_on')) {
    $original = $mail_config->get('interface');
    $mail_system['default'] = 'SMTPMailSystem';
    $mail_config->set('interface', $mail_system)->save();
  }
  \Drupal::service('plugin.manager.mail')->mail('smtp', 'smtp-test', $test_address, $account->getPreferredLangcode(), $params);
  if (!$config->get('smtp_on')) {
    $mail_config->set('interface', $original)->save();
  }
  drupal_set_message(t('A test e-mail has been sent to @email via SMTP. You may want to check the log for any error messages.', ['@email' => $test_address]));
}

Этот код не работает, так как в наборе журналов с директивой mail.log я вижу следующее, где очевидно, что Drupal все еще использует почтовый плагин, определенный в PhpMail.php .

[11-марта-2016 06:36:14 UTC] почта() на [/главная/домен/public_html/ядро/библиотека/Drupal/Ядро/Почта/Плагин/Почта/phpmail.php:101]: Кому: [email protected] -- Заголовки: MIME-Версия: 1.0 Тип содержимого: текст/обычный; кодировка=UTF-8; формат=потоковый; delsp=да Кодировка передачи содержимого: 8-Битная X-Почтовая программа: Отправитель Drupal: [email protected] От: Отредактировано <[email protected]>

Я очистил журнал перед отправкой тестового электронного письма с административной страницы модуля Поддержка аутентификации SMTP; поэтому я уверен, что журнал вызван отправкой теста электронная почта.

Поскольку метод, используемый в этом модуле, похоже, не работает, как правильно настроить плагин, который Drupal использует для отправки электронных писем?

Обновление

Чтобы прояснить мой вопрос, в используемом коде есть две вещи, которые мне непонятны.

  1. Код устанавливает почтовый плагин, который должен использовать Drupal, только для тестовой электронной почты, но, как я вижу, этот метод не работает, так как Drupal по-прежнему использует плагин по умолчанию.
  2. Помимо настройки почтовый плагин для тестовой электронной почты модуль не изменяет почтовый плагин, установленный Drupal. Как тогда Drupal может узнать, как использовать почтовый плагин, реализованный модулем?
Author: kiamlaluno, 2016-03-11

1 answers

На основе Почтовые бэкэнды теперь являются аннотированными плагинами, drupal_mail_service() был удален и документация для MailManagerInterface интерфейс, модуль, реализующий почтовый плагин, не должен устанавливать свой собственный плагин в качестве плагина по умолчанию, потому что MailManagerInterface интерфейс не документирует никаких ключей конфигурации, которые должны использовать реализующие его классы; только сопровождающий сайта в конечном итоге знает, какой почтовый менеджер используется и какие ключи конфигурации использует почтовый менеджер. Это аналогично настройке обработчиков кэша, которая выполняется в settings.php файл.

Модуль Аутентификации SMTP выполняет правильные действия, когда он не устанавливает свой плагин в качестве плагина по умолчанию для отправки электронных писем.

Что касается кода для отправки тестового электронного письма, правильный не должен напрямую задавать ключи конфигурации, если он хочет быть независимым от текущей реализации почтового менеджера. В конечном счете, следует использовать код, подобный следующему.

$mailer = \Drupal::service('plugin.manager.mail')->createInstance($plugin_id);
$bool = $mailer->send($mailer->format($message));
 0
Author: kiamlaluno, 2016-03-18 23:34:58