Jak mogę powstrzymać Drupala przed wysyłaniem wiadomości e-mail?


21

Mam konfigurację pracy serwera deweloperskiego, tymczasowego i na żywo skonfigurowaną w Pantheon. Moja strona ma wiele zasad, które powodują, że członkowie są wysyłani e-mailem z różnych powodów. Czasami muszę popracować nad nimi na moich stronach deweloperskich / inscenizacyjnych, ale zdałem sobie sprawę, że ponieważ mają one dane na żywo, czasami użytkownicy otrzymają dodatkowe lub zduplikowane wiadomości e-mail, gdy nad czymś pracuję.

Czy jest jakiś prosty sposób, aby wyłączyć wszystkie możliwości wysyłania wiadomości e-mail (najlepiej automatycznie, aby zapobiec zapomnieniu) na serwerze deweloperskim / pomostowym? Idealnie chciałbym wyłączyć pocztę e-mail za pomocą niestandardowego modułu, ponieważ mam już kroki, aby upewnić się, że moduł niestandardowy jest włączony podczas tworzenia / przemieszczania.


2
Żadna z odpowiedzi tutaj nie jest zadowalająca. Zmiana ustawień. Php oznacza, że ​​zostanie to zepchnięte do produkcji. Zainstalowanie modułu w Test i Dev oznacza, że ​​zostanie on nadpisany po sklonowaniu z Live. Niektóre sugerowane zmiany kodu - poważnie? Settings.local.php działałby, ale nie został wspomniany. Mam jeden w lokalnej witrynie programistycznej, ale przy przepływie pracy Git nie jest to praktyczne w środowiskach Pantheon, ponieważ muszę przejść na SFTP, zanim będę mógł pobrać plik lub dokonać aktualizacji. Tak więc, niestety, niewinni użytkownicy produkcyjni będą od czasu do czasu otrzymywać e-maile z testu.
— cdonner

3
@cdonner Tak, poważnie. Istnieje wiele sposobów rozwiązania problemu domina, z którym wszyscy ulegliście. Wszystkie są bardzo proste. Osobiście używam, git update-index --assume-unchanged sites/default/settings.phpaby nie dopuszczać, by settings.php był wypychany w różnych środowiskach. Niektórzy ludzie wolą logikę warunkową, która sprawdza ustawienia środowiska i zawiera różne pliki conf oparte na środowisku (a właściwie prawie każdy inny istniejący framework internetowy, w dowolnym języku). Jedynym ograniczeniem tutaj jest wyobraźnia, to podstawowe rzeczy związane z PHP / git, nie trzeba dodawać do odpowiedzi
— Clive

1
Szanuję twoją opinię, Clive. Ale tu jest problem. Jeśli masz dużą witrynę, na której duża liczba użytkowników może uzyskać dużą liczbę wiadomości e-mail ze środowiska testowego, jeśli jeden członek zespołu zapomni się wykonać niezmienionego połączenia git przed zameldowaniem, ja jako osoba odpowiedzialna za to nie chcę polegać na twojej metodzie.
— cdonner

1
Jeśli zdecydujesz się na modyfikację sites/default/settings.php, zamiast tego git update-index --skip-worktree sites/default/settings.php. Za pomocą --assume-unchangedtracisz zmiany wprowadzone w ustawieniach. Php, jeśli wykonasz git reset --hard. Zobacz stackoverflow.com/questions/13630849/…

Czy nie możesz również umieścić settings.php w swoim .gitignore?
— Evan Donovan,

Odpowiedzi:


38

Jako kolejną, szybszą opcję, możesz dodać następujące wiersze do pliku settings.php swojej witryny (jeśli masz zainstalowany moduł Devel, co na pewno powinieneś, jeśli jest to witryna deweloperska).

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

Zastąpi to domyślny system pocztowy rozwiniętym systemem pocztowym Devela, który zapisuje wiadomości e-mail w dzienniku plików zamiast wysyłać je do adresata. Domyślnie pliki są przechowywane temporary://devel-mails, ale możesz to zmienić, ustawiając inną zmienną, np.

$conf['devel_debug_mail_directory'] = '/path/to/folder';

11

Tylko uwaga, aby dodać kolejny moduł do listy „Istnieje moduł dla tego”:

Przekierowane wiadomości e-mail przechwytują wszystkie wychodzące wiadomości e-mail z witryny Drupal i przekierowują je na wstępnie zdefiniowany konfigurowalny adres e-mail.

Zgadzam się, że tę funkcjonalność można łatwo zaimplementować za pomocą kilku wierszy kodu, ale za pomocą tego modułu możesz nadal otrzymywać wiadomości e-mail na wcześniej zdefiniowany adres, ze szczegółami na temat pierwotnego odbiorcy, miłą funkcjonalność imho.


3
E-mail przekierowujący pozwala również wstawić kod do pliku settings.php, aby włączyć / wyłączyć / zmienić ustawienia w oparciu o nazwę hosta (lub dowolną instrukcję if (), której chcesz użyć), dzięki czemu możesz go automatycznie wyłączać przy produkcji i włączać przy każda inna maszyna.
— diamondsea

10

Lub możesz użyć hook_mail_alter, aby przekierować lub zapobiec mailom drupal:

/**
* Implements hook_mail_alter
*/
function yourmodule_mail_alter(&$message) {
  // set 'To' field to nothing, so Drupal won’t have any address
  $message['to'] = ''; 
}

3
Jest to zasadniczo wszystko, co robi przekierowanie poczty; prawdopodobnie lepiej po prostu napisać te kilka wierszy niż dołączyć cały nowy moduł
— Clive

Nie jest to dobry pomysł, jest to rodzaj kodu, który wkrada się do twojego środowiska produkcyjnego, gdy o nim zapomnisz git commit .lub coś podobnego.
— Duncanmoo,

5

Drupal 8

W przypadku Drupal 8 można włączyć moduł obsługi poczty modułu Devel za pośrednictwem systemu konfiguracji.

Dzięki drushtemu byłoby:

drush -y pm-enable devel
drush -y config-set system.mail interface.default devel_mail_log

2
Możesz również ustawić to dla środowiska settings.local.php: $config['system.mail']['interface']['default'] = 'devel_mail_log';
— Patrick Kenny

Aby określić katalog dziennika, to jest $config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';.
— leymannx

4

W tym przypadku zwykle używam modułu E-mail Reroute . Może przekierować wszystkie wiadomości e-mail z programisty na określone wiadomości e-mail. Wysłany e-mail określa także, dokąd ten e-mail powinien zostać wysłany.


3

Działa to bez rozwijania i jest bezpieczne we wszystkich trzech środowiskach.

Dodaj to w settings.php. Skopiuj go i zmień środowisko testna Test.

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

Następnie w module:

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>'));
  }
}

Podziękowania za pomysł zmiany poczty można znaleźć na stronie http://www.jaypan.com/tutorial/preventing-emails-being-sent-drupal-7-development-environment .


Pamiętaj, że może to być usterka umożliwiająca obejście dostępu. W wiadomości e-mail dotyczącej resetowania hasła łącze hashowania i resetowania zostanie wysłane do watchdoga, na przykład.
— awolfey,

2

Myślę, że moduł Przekierowanie poczty jest dla Ciebie idealny :) Innym brudnym sposobem jest instalacja modułu SMTP i ustawienie niewłaściwego smtp;)


Czy można korzystać z tego modułu i nadal testować funkcjonalność poczty?
— GoodSp33d

Tak, ponieważ system wysyła wiadomość e-mail na wybrany adres e-mail
— arrubiu


2

Możesz więc umieścić to w pliku settings.php lub settings.local.php, jeśli masz określone dla deweloperów, inscenizacji i produkcji.

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

Set-up your SMTP do localhosti zainstalować MailCatcher ( GitHub ), który łapie każdą wiadomość wysłaną do niego na wystawie w interfejs WWW.

Instalacja

  1. gem install mailcatcher
  2. mailcatcher
  3. Skonfiguruj swój sendmail_pathw PHP, aby:

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

    lub w konfiguracji Apache :

    php_admin_value sendmail_path "/usr/bin/env catchmail -f some@from.address"
  4. Iść do http://localhost:1080/

  5. Wyślij pocztę przez smtp://localhost:1025

W Drush możesz:

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

1

jeśli nie chcesz dotykać konfiguracji Drupala, skonfiguruj MailHog na swoim serwerze, aby przechwytywał wszystkie wiadomości e-mail wychodzące z Twojej aplikacji.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.