Как я могу запретить Drupal отправлять электронные письма любого рода?

21

У меня на Pantheon настроен рабочий процесс для разработчиков, промежуточных и живых серверов. У моего сайта есть много правил, которые заставляют участников получать электронные письма по разным причинам. Иногда мне нужно работать над этим на моих сайтах разработки / разработки, но я понял, что, поскольку у них есть живые данные, иногда пользователи получают дополнительные или дублирующие электронные письма, когда я работаю над чем-то.

Есть ли простой способ отключить все возможности электронной почты (желательно автоматически, чтобы я не забыл) на сервере dev / staging? В идеале, я хотел бы отключить электронную почту через пользовательский модуль, так как у меня уже есть шаги, чтобы убедиться, что пользовательский модуль включен на dev / staging.

Патрик Кенни
источник
2
Ни один из ответов здесь не является удовлетворительным. Изменение settings.php означает, что это будет запущено в производство. Установка модуля в Test и Dev означает, что он будет перезаписан при клонировании из Live. Некоторые предлагаемые изменения кода - серьезно? Файл settings.local.php будет работать, но не упоминается. У меня есть один на локальном сайте разработки, но с рабочим процессом Git это не практично для сред Pantheon, потому что мне нужно переключиться на SFTP, прежде чем я смогу получить файл или сделать обновления. Так что, увы, пользователи невинного производства продолжат время от времени получать электронные письма от теста.
cdonner
3
@cdonner Да, серьезно. Есть много способов решить проблему, с которой вы столкнулись, все они очень просты. Лично я использую git update-index --assume-unchanged sites/default/settings.phpдля того, чтобы settings.php не перемещался по разным средам. Некоторые люди предпочитают некоторую условную логику, которая проверяет настройки среды и включает в себя различные conf-файлы, основанные на среде (почти во всех существующих веб-фреймворках на любом языке). Единственное ограничение здесь свое воображение, это основной PHP / мерзавец материал, не должны быть добавлены к ответам
Клайв
1
Я уважаю твое мнение, Клайв. Здесь проблема, однако. Если у вас большой сайт, на котором большое количество пользователей могут получать большое количество электронных писем из тестовой среды, если один из членов команды забывает сделать git-вызов без изменений перед регистрацией, я, как ответственное за это лицо, не хотел бы полагаться на ваш метод.
cdonner
1
Если вы решили изменить sites/default/settings.php, вместо этого сделайте git update-index --skip-worktree sites/default/settings.php. При этом --assume-unchangedвы потеряете изменения, внесенные в settings.php, если сделаете a git reset --hard. См stackoverflow.com/questions/13630849/...
Не могли бы вы также поместить settings.php в свой .gitignore?
Эван Донован

Ответы:

38

В качестве другого, более быстрого варианта вы можете добавить следующие строки в файл settings.php вашего сайта (если у вас установлен модуль Devel, что вам, безусловно, следует делать, если это сайт разработчика).

$conf['mail_system'] = array(
  'default-system' => 'DevelMailLog',
);

Это заменит почтовую систему по умолчанию на почтовую систему разработки Devel, которая записывает электронные письма в файловый журнал, а не отправляет их получателю. По умолчанию файлы хранятся в temporary://devel-mails, но вы можете изменить это, установив другую переменную, например.

$conf['devel_debug_mail_directory'] = '/path/to/folder';
Клайв
источник
11

Просто обратите внимание, чтобы добавить еще один модуль в список «Есть модуль для этого»:

Перенаправлять электронную почту перехватывает все исходящие электронные письма с сайта Drupal и перенаправляет их на предварительно определенный настраиваемый адрес электронной почты.

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

claire_
источник
3
Перенаправлять электронную почту также позволяет вам поместить код в файл settings.php, чтобы включить / отключить / изменить настройки на основе вашего имени хоста (или любого другого оператора if (), который вы хотите использовать), так что вы можете автоматически отключить его при производстве и включении любая другая машина.
Diamondsea
10

Или вы можете использовать hook_mail_alter для перенаправления или предотвращения друпал почты:

/**
* Implements hook_mail_alter
*/
function yourmodule_mail_alter(&$message) {
  // set 'To' field to nothing, so Drupal won’t have any address
  $message['to'] = ''; 
}
Ленни
источник
3
По сути, это все, что делает Mail Redirect; вероятно, лучше просто написать эти несколько строк, чем включать целый новый модуль
Клайв
Не очень хорошая идея, это тот тип кода, который проникает в вашу среду разработки, когда вы забываете об этом git commit .или что-то подобное.
Duncanmoo
5

Drupal 8

Для Drupal 8 вы можете включить обработчик почты модуля Devel через систему конфигурации.

С drushним было бы:

drush -y pm-enable devel
drush -y config-set system.mail interface.default devel_mail_log
Эрик Шварц
источник
2
Вы также можете установить это для каждой среды в settings.local.php: $config['system.mail']['interface']['default'] = 'devel_mail_log';
Патрик Кенни
Чтобы указать лог-каталог, то это $config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';.
Leymannx
4

Я обычно использую модуль электронной почты Reroute для этого случая. Он может перенаправить всю электронную почту от разработчика на определенную электронную почту. В электронном письме также указывается, куда следует отправить это электронное письмо.

Permana
источник
3

Это будет работать без разработки и безопасно во всех трех средах.

Добавьте это в settings.php. Скопируйте его и измените среду testдля тестирования.

// Stop email on dev.
if (isset($_SERVER['PANTHEON_ENVIRONMENT']) &&
  $_SERVER['PANTHEON_ENVIRONMENT'] === 'dev') {
  // @see MYMODULE_mail_alter().
  $conf['development_environment'] = TRUE;
}

Тогда в моем модуле:

function MYMODULE_mail_alter(&$message) {
  if(variable_get('development_environment', FALSE)) {
    // First: Prevent the mail from being sent.
    $message['send'] = FALSE;

    // Next: Log the mail so it can be debugged if necessary
    watchdog('Development Env', 'The following email was not sent: !message', array('!message' => '<pre>' . print_r($message, TRUE) . '</pre>'));
  }
}

Автор идеи сообщения об изменении адреса электронной почты: http://www.jaypan.com/tutorial/preventing-emails-being-sent-drupal-7-development-environment .

awolfey
источник
Обратите внимание, что это может быть уязвимость обхода доступа. В электронном письме сброса пропуска хешированная ссылка пропуска и сброса будет отправлена ​​наблюдателю, например.
awolfey
2

Я думаю, что модуль Mail Redirect идеально подходит для вас :) Еще один грязный способ - установить SMTP-модуль и установить неправильный smtp;)

Arrubiu
источник
Можно ли использовать этот модуль и при этом проверить работоспособность почты?
GoodSp33d
Да, потому что система отправляет электронную почту на выбранный адрес электронной почты
arrubiu
2

https://api.drupal.org/api/drupal/modules!system!system.api.php/function/hook_mail_alter/7

<?php
/**
 * Implements hook_mail_alter().
 */
function mymodule_mail_alter(&$message) {
  $message['send'] = FALSE; 
}
Coder1
источник
Это лучшее решение, чем принятый ответ. Это останавливает отправку почты полностью, вместо того, чтобы просто перенаправить на фиктивный адрес, который все еще требует попытки отправки почты.
Брайан Джинке
2

Таким образом, вы можете поместить это в ваши settings.php или settings.local.php, если у вас есть конкретные для dev, staging & production.

if(module_exists('devel')) {
  // Use Devel's maillog
  $conf['mail_system'] = array( 
    'default-system' => 'DevelMailLog',
  );
  // To set custom path 
  // $conf['devel_debug_mail_directory'] = '/path/to/folder';
} 
elseif (module_exists('mail_redirect')) {
  // Enable email rerouting.
  $conf['reroute_email_enable'] = 1;
  // Space, comma, or semicolon-delimited list of email addresses to pass
  // through. Every destination email address which is not on this list will be  
  // rerouted to the first address on the list.
  $conf['reroute_email_address'] = "example@example.com";
  // Enable inserting a message into the email body when the mail is being
  // rerouted.
  $conf['reroute_email_enable_message'] = 1;
}
Майк Гиффорд
источник
1

Предполагая, что вы используете модуль Mailsystem , просто перейдите admin/config/system/mailsystemи выберите DevelMailLog.

Мартин Поулсен
источник
1

Настроить свой SMTP , чтобы localhostи установить MailCatcher ( GitHub ) , который улавливает любое сообщение , отправленное на этом дисплее в веб - интерфейсе.

Установка

  1. gem install mailcatcher
  2. mailcatcher
  3. Настройте sendmail_pathв PHP:

    sendmail_path = /usr/bin/env catchmail -f some@from.address

    или в конфигурации Apache :

    php_admin_value sendmail_path "/usr/bin/env catchmail -f some@from.address"
  4. Перейти к http://localhost:1080/

  5. Отправить почту через smtp://localhost:1025

В Drush вы можете сделать как:

php -d sendmail_path="$(which catchmail)" drush.php some-command
kenorb
источник
1

если вы не хотите трогать конфиги Drupal, настройте MailHog на своем сервере, чтобы перехватывать все электронные письма, приходящие из вашего приложения.

shumushin
источник