Wie kann ich Drupal davon abhalten, E-Mails jeglicher Art zu versenden?

21

Ich habe einen Entwicklungs-, Staging- und Live-Server-Workflow auf Pantheon eingerichtet. Meine Website enthält viele Regeln, die dazu führen, dass Mitglieder aus verschiedenen Gründen per E-Mail benachrichtigt werden. Manchmal muss ich auf meinen Entwicklungs- / Staging-Sites daran arbeiten, aber ich habe festgestellt, dass Benutzer, da sie die Live-Daten haben, manchmal zusätzliche oder doppelte E-Mails erhalten, wenn ich an etwas arbeite.

Gibt es eine einfache Möglichkeit, alle E-Mail-Funktionen auf einem Entwickler- / Staging-Server zu deaktivieren (vorzugsweise automatisch, um zu verhindern, dass ich sie vergesse)? Idealerweise möchte ich E-Mail über ein benutzerdefiniertes Modul deaktivieren, da ich bereits Schritte eingerichtet habe, um sicherzustellen, dass ein benutzerdefiniertes Modul auf dev / staging aktiviert ist.

Patrick Kenny
quelle
2
Keine der Antworten hier ist zufriedenstellend. Das Ändern der settings.php bedeutet, dass dies in die Produktion gedrängt wird. Wenn Sie ein Modul in Test and Dev installieren, wird es beim Klonen von Live überschrieben. Einige vorgeschlagene Codeänderungen - ernsthaft? Eine settings.local.php würde funktionieren, wurde aber nicht erwähnt. Ich habe eine in der lokalen Entwicklungssite, aber mit einem Git-Workflow ist dies für die Pantheon-Umgebungen nicht praktisch, da ich zu SFTP wechseln muss, bevor ich die Datei dort abrufen oder Aktualisierungen vornehmen kann. Leider erhalten unschuldige Produktionsbenutzer weiterhin gelegentlich E-Mails von Test.
cdonner
3
@cdonner Ja, im Ernst. Es gibt viele Möglichkeiten, wie Sie das Problem lösen können, dem Sie erlegen sind. Alle sind sehr einfach. Persönlich verhindere ich git update-index --assume-unchanged sites/default/settings.php, dass settings.php in verschiedenen Umgebungen verwendet wird. Einige Leute bevorzugen eine bedingte Logik, die die Umgebungseinstellungen überprüft und verschiedene, auf der Umgebung basierende Conf-Dateien enthält (so ziemlich jedes andere existierende Webframework in einer beliebigen Sprache). Die einzige Grenze hier ist die Vorstellungskraft, es sind grundlegende PHP / Git-Sachen, die nicht zu den Antworten hinzugefügt werden müssen
Clive
1
Ich respektiere deine Meinung, Clive. Hier ist jedoch das Problem. Wenn Sie eine große Site haben, auf der eine große Anzahl von Benutzern eine große Anzahl von E-Mails aus einer Testumgebung abrufen kann, wenn ein Teammitglied vergisst, vor dem Einchecken einen unveränderten Git-Anruf zu tätigen, möchte ich als Verantwortlicher dies nicht sich auf Ihre Methode verlassen.
Donnerstag,
1
Wenn Sie Änderungen vornehmen möchten sites/default/settings.php, tun Sie dies stattdessen git update-index --skip-worktree sites/default/settings.php. Mit --assume-unchangedverlieren Sie die Änderungen, die Sie an settings.php vorgenommen haben, wenn Sie a git reset --hard. Siehe stackoverflow.com/questions/13630849/…
Könntest du nicht auch settings.php in deinen .gitignore einfügen?
Evan Donovan

Antworten:

38

Als weitere, schnellere Option können Sie die folgenden Zeilen zur settings.php-Datei Ihrer Site hinzufügen (wenn Sie das Devel-Modul installiert haben, was Sie auf jeden Fall tun sollten, wenn es sich um eine Entwickler-Site handelt).

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

Dadurch wird das Standard-Mail-System durch das Entwicklungs-Mail-System von Devel ersetzt, das E-Mails in ein Dateiprotokoll schreibt, anstatt sie an einen Empfänger zu senden. Standardmäßig werden die Dateien in gespeichert. temporary://devel-mailsSie können dies jedoch ändern, indem Sie eine andere Variable festlegen, z.

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

Nur eine Anmerkung zum Hinzufügen eines weiteren Moduls zur Liste "Es gibt ein Modul für dieses":

E-Mail umleiten fängt alle ausgehenden E-Mails von einer Drupal-Site ab und leitet sie an eine vordefinierte konfigurierbare E-Mail-Adresse um.

Ich bin damit einverstanden, dass diese Funktionalität leicht mit ein paar Codezeilen implementiert werden kann, aber mit diesem Modul können Sie weiterhin E-Mails an eine vordefinierte Adresse mit Details zum ursprünglichen Empfänger erhalten, nette Funktionalität imho.

claire_
quelle
3
Bei der Umleitung von E-Mails können Sie auch Code in Ihre settings.php-Datei einfügen, um Einstellungen basierend auf Ihrem Hostnamen (oder einer beliebigen if () - Anweisung, die Sie verwenden möchten) zu aktivieren / deaktivieren / ändern jede andere Maschine.
Diamondsea
10

Oder Sie können hook_mail_alter verwenden, um Drupal-Mails umzuleiten oder zu verhindern:

/**
* Implements hook_mail_alter
*/
function yourmodule_mail_alter(&$message) {
  // set 'To' field to nothing, so Drupal won’t have any address
  $message['to'] = ''; 
}
lenni
quelle
3
Dies ist im Wesentlichen alles, was Mail Redirect tut. wahrscheinlich ist es besser, nur diese paar Zeilen zu schreiben, als ein ganz neues Modul aufzunehmen
Clive
Keine gute Idee, das ist eine Art Code, der sich in Ihre Produktumgebung einschleicht, wenn Sie es vergessen git commit .oder ähnliches.
Duncanmoo
5

Drupal 8

Für Drupal 8 können Sie den E-Mail-Handler des Devel-Moduls über das Konfigurationssystem aktivieren.

Damit drushwäre es:

drush -y pm-enable devel
drush -y config-set system.mail interface.default devel_mail_log
Erik Schwartz
quelle
2
Sie können dies auch pro Umgebung einstellen in settings.local.php: $config['system.mail']['interface']['default'] = 'devel_mail_log';
Patrick Kenny
Um das Protokollverzeichnis anzugeben, ist es dann $config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';.
Leymannx
4

In diesem Fall verwende ich normalerweise das E-Mail-Umleitungsmodul . Es kann alle E-Mails von dev an bestimmte E-Mails umleiten. In der gesendeten E-Mail wird auch angegeben, wohin diese E-Mail gesendet werden soll.

Permana
quelle
3

Dies funktioniert ohne Entwicklung und ist in allen drei Umgebungen sicher.

Fügen Sie dies in settings.php hinzu. Kopieren Sie es und ändern Sie die Umgebung in testfür Test.

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

Dann in mymodule:

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

Die E-Mail-Änderungsidee ist unter http://www.jaypan.com/tutorial/preventing-emails-being-sent-drupal-7-development-environment erhältlich .

awolfey
quelle
Beachten Sie, dass dies eine Sicherheitsanfälligkeit in Bezug auf die Zugriffsumgehung sein kann. Bei einer Pass-Reset-E-Mail werden beispielsweise der Hash-Pass und der Reset-Link an Watchdog gesendet.
awolfey
2

Ich denke, dass Mail Redirect- Modul perfekt für Sie ist :) Ein anderer schmutziger Weg ist die Installation des SMTP-Moduls und die Einstellung eines falschen SMTP;)

arrubiu
quelle
Ist es möglich, dieses Modul zu verwenden und dennoch die Mail-Funktionalität zu testen?
GoodSp33d
Ja, da das System E-Mails an die ausgewählte E-Mail-Adresse sendet
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
quelle
Dies ist eine bessere Lösung als die akzeptierte Antwort. Dadurch wird verhindert, dass die E-Mail vollständig gesendet wird, anstatt nur an eine Dummy-Adresse umgeleitet zu werden, für die noch ein E-Mail-Sendeversuch erforderlich ist.
Bryan Jiencke
2

Sie können dies also in Ihre settings.php oder settings.local.php einfügen, wenn Sie spezielle Einstellungen für Entwicklung, Inszenierung und Produktion haben.

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
quelle
1

Angenommen, Sie verwenden das Mailsystem- Modul, gehen Sie zu admin/config/system/mailsystemund wählen Sie DevelMailLog.

Martin Poulsen
quelle
1

Richten Sie Ihr SMTP für den MailCatcher ( GitHub ) ein localhostund installieren Sie ihn. Er fängt alle an ihn gesendeten Nachrichten ab, um sie auf einer Weboberfläche anzuzeigen.

Installation

  1. gem install mailcatcher
  2. mailcatcher
  3. Konfigurieren Sie Ihr sendmail_pathin PHP um:

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

    oder in der Apache Konfiguration :

    php_admin_value sendmail_path "/usr/bin/env catchmail -f [email protected]"
  4. Gehe zu http://localhost:1080/

  5. Mail senden über smtp://localhost:1025

In Drush können Sie Folgendes tun:

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

Wenn Sie Drupal-Konfigurationen nicht berühren möchten, richten Sie MailHog auf Ihrem Server ein, um alle E-Mails aus Ihrer Anwendung abzufangen .

Shumushin
quelle