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.

Patrick Kenny
źródło
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';
Clive
źródło
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.

claire_
źródło
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'] = ''; 
}
lenni
źródło
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
Erik Schwartz
źródło
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.

Permana
źródło
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 .

awolfey
źródło
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;)

arrubiu
źródło
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'] = "[email protected]";
  // Enable inserting a message into the email body when the mail is being
  // rerouted.
  $conf['reroute_email_enable_message'] = 1;
}
Mike Gifford
źródło
1

Zakładając, że używasz modułu Mailsystem , po prostu przejdź do admin/config/system/mailsystemi wybierz DevelMailLog.

Martin Poulsen
źródło
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 [email protected]"
  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
kenorb
źródło
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.

shumushin
źródło