Як я можу відмовити Drupal надсилати електронні листи будь-якого типу?


21

У мене на Пантеоні налаштований робочий процес, інсценування та поточний сервер. На моєму веб-сайті є багато правил, через які з різних причин учасники надсилаються електронною поштою. Мені іноді потрібно працювати над цим на моїх сайтах розробки / постановки, але я зрозумів, що, оскільки вони мають живі дані, інколи користувачі отримуватимуть додаткові або копії електронних листів, коли я працюю над чимось.

Чи є який-небудь простий спосіб вимкнути всі можливості електронної пошти (бажано автоматично, щоб не забути) на сервері розробки / постановки? В ідеалі я хотів би відключити електронну пошту за допомогою спеціального модуля, оскільки у мене вже є кроки, щоб переконатися, що користувальницький модуль увімкнено при розробці / постановці.


2
Жодна з відповідей тут не задовільна. Зміна settings.php означає, що це підштовхне виробництво. Встановлення модуля в програмі Test і Dev означає, що він буде перезаписаний, коли ви клонуєтесь з Live. Деякі запропоновані зміни коду - серйозно? Налаштування.local.php працюватиме, але не згадується. У мене він є на сайті локальної розробки, але з робочим процесом Git це не практично для середовищ Pantheon, тому що я повинен перейти на SFTP, перш ніж я можу отримати файл там або зробити оновлення. Отже, на жаль, невинні користувачі виробництва продовжуватимуть періодично отримувати електронні листи від тесту.
cdonner

3
@cdonner Так, серйозно. Існує багато способів вирішити нотаріальну проблему, до якої ви піддалися, і всі вони дуже прості. Особисто я використовую git update-index --assume-unchanged sites/default/settings.phpдля запобігання натисканням settings.php на різних середовищах. Деякі люди віддають перевагу умовній логіці, яка перевіряє параметри середовища та включає різні файли конфіденцій, засновані на оточенні (а майже всі інші веб-рамки, що існують, на будь-якій мові). Єдине обмеження тут - це фантазія, це основні PHP / git речі, не потрібно додавати у відповіді
Clive

1
Я поважаю вашу думку, Клайв. Однак тут проблема. Якщо у вас є великий сайт, на якому велика кількість користувачів може отримати велику кількість електронних листів із тестового середовища, якщо один член команди забуде здійснити дзвінок без змін, який передбачається перед реєстрацією, я як особа, відповідальна за це, не хотіла б покладатися на свій метод.
cdonner

1
Якщо ви вирішите змінити sites/default/settings.php, замість цього зробіть git update-index --skip-worktree sites/default/settings.php. Завдяки цьому --assume-unchangedви втрачаєте зміни, які ви внесли в settings.php, якщо зробите це 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 та перенаправляє їх на заздалегідь задану налаштовану електронну адресу.

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


3
Перенаправлення електронної пошти також дозволяє вставити код у файл settings.php, щоб увімкнути / вимкнути / змінити налаштування залежно від вашого імені хоста (або будь-якого випадку, якщо (), який ви хочете використовувати), так що ви можете автоматично увімкнути Вимкнення виробництва та ВКЛЮЧИТИ будь-яка інша машина.
diamondsea

10

Або ви можете використовувати kuka_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
Це по суті все, що робить переадресація пошти; Напевно, краще просто написати ці кілька рядків, ніж включити цілком новий модуль
Clive

Непогана ідея, це код типу, який прокрадається у ваше середовище продукту, коли ви забудете про нього та git commit .щось подібне.
Данканму

5

Друпал 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

Зазвичай для цього випадку використовую модуль перестановки електронної пошти . Він може перенаправити всю електронну пошту від розробника до певної електронної пошти. Надісланий електронний лист також вказує, куди цей електронний лист має бути надісланий.


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-en Environment .


Зауважте, що це може бути вразливість обходу доступу. На електронну пошту для скидання пропуску, хеш-пропуск та посилання для скидання будуть надіслані сторожовій собаці, наприклад,
awolfey

2

Я думаю, що модуль переадресації пошти ідеально підходить для вас :) Ще один брудний спосіб - встановити модуль SMTP і встановити неправильний smtp;)


Чи можливо використовувати цей модуль і все-таки мати можливість перевірити функціональність пошти?
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; 
}

Це краще рішення, ніж прийнята відповідь. Це не дозволяє відправляти пошту взагалі, а не просто перенаправляти на макетну адресу, яка все ще потребує спроби надсилання пошти.
Брайан Jiencke

2

Таким чином, ви можете помістити це у your settings.php або settings.local.php, якщо у вас є конкретні для розробника, постановки та виробництва.

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

Налаштувати свій 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

У Друші ви можете робити:

php -d sendmail_path="$(which catchmail)" drush.php some-command

1

якщо ви не хочете торкатися конфігурацій Drupal, встановіть MailHog на своєму сервері, щоб отримувати всі електронні листи, що виходять із вашої програми.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.