Comment puis-je empêcher Drupal d'envoyer des e-mails de toute nature?

21

J'ai un flux de travail de développement, de mise en scène et de serveur en direct configuré sur Pantheon. Mon site comporte de nombreuses règles qui obligent les membres à être envoyés par courrier électronique pour diverses raisons. J'ai parfois besoin de travailler dessus sur mes sites de développement / staging mais j'ai réalisé que, comme ils ont les données en direct, les utilisateurs recevront parfois des e-mails supplémentaires ou en double lorsque je travaille sur quelque chose.

Existe-t-il un moyen simple de désactiver toutes les fonctionnalités de messagerie (de préférence automatiquement pour m'empêcher d'oublier) sur un serveur de développement / de transfert? Idéalement, j'aimerais désactiver le courrier électronique via un module personnalisé, car j'ai déjà des étapes en place pour m'assurer qu'un module personnalisé est activé sur dev / staging.

Patrick Kenny
la source
2
Aucune des réponses ici n'est satisfaisante. La modification de settings.php signifie que cela sera poussé en production. L'installation d'un module dans Test and Dev signifie qu'il sera écrasé lorsque vous clonerez depuis Live. Quelques modifications de code suggérées - sérieusement? Un settings.local.php fonctionnerait mais n'a pas été mentionné. J'en ai un sur le site de développement local, mais avec un flux de travail Git, ce n'est pas pratique pour les environnements Pantheon car je dois passer à SFTP avant de pouvoir y obtenir le fichier ou effectuer des mises à jour. Ainsi, hélas, des utilisateurs de production innocents continueront de recevoir occasionnellement des e-mails de test.
cdonner le
3
@cdonner Oui, sérieusement. Il existe de nombreuses façons de résoudre le problème d'activation auquel vous avez succombé, toutes très simples. Personnellement, j'utilise git update-index --assume-unchanged sites/default/settings.phppour empêcher settings.php d'être poussé dans différents environnements. Certaines personnes préfèrent une logique conditionnelle qui vérifie les paramètres d'environnement et inclut différents fichiers de conf basés sur l'environnement (à peu près tous les autres frameworks Web existants, dans n'importe quelle langue). La seule limite ici est l'imagination, c'est des trucs basiques PHP / git, n'a pas besoin d'être ajouté aux réponses
Clive
1
Je respecte votre opinion, Clive. Mais voici le problème. Si vous avez un grand site où un grand nombre d'utilisateurs peuvent recevoir un grand nombre d'e-mails à partir d'un environnement de test si un membre de l'équipe oublie de faire un appel git inchangé avant de s'enregistrer, je ne suis pas responsable en tant que responsable de cela compter sur votre méthode.
cdonner du
1
Si vous choisissez de modifier sites/default/settings.php, faites-le à la place git update-index --skip-worktree sites/default/settings.php. Avec --assume-unchanged, vous perdez les modifications que vous avez apportées à settings.php si vous effectuez une git reset --hard. Voir stackoverflow.com/questions/13630849/…
Ne pourriez-vous pas également mettre settings.php dans votre .gitignore?
Evan Donovan

Réponses:

38

Comme autre option, plus rapide, vous pouvez ajouter les lignes suivantes au fichier settings.php de votre site (si vous avez installé le module Devel, ce que vous devriez certainement faire s'il s'agit d'un site de développement).

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

Cela remplacera le système de messagerie par défaut par le système de messagerie de développement de Devel, qui écrit les e-mails dans un journal de fichiers plutôt que de les envoyer à un destinataire. Par défaut, les fichiers sont stockés dans temporary://devel-mails, mais vous pouvez modifier cela en définissant une autre variable, par exemple.

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

Juste une note pour ajouter un autre module à la liste "Il y a un module pour ça":

Rerouter les e-mails intercepte tous les e-mails sortants d'un site Drupal et les redirige vers une adresse e-mail configurable prédéfinie.

Je suis d'accord que cette fonctionnalité peut facilement être implémentée avec quelques lignes de code, mais en utilisant ce module, vous pouvez continuer à recevoir des e-mails à une adresse prédéfinie, avec des détails sur le destinataire d'origine, belle fonctionnalité à mon humble avis.

claire_
la source
3
La redirection de l'e-mail vous permet également de mettre du code dans votre fichier settings.php pour activer / désactiver / modifier les paramètres en fonction de votre nom d'hôte (ou de la déclaration if () que vous souhaitez utiliser), vous pouvez donc l'activer automatiquement sur Production et sur ON toute autre machine.
diamondsea
10

Ou vous pouvez utiliser hook_mail_alter pour rediriger ou empêcher les e-mails 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
la source
3
C'est essentiellement tout ce que fait la redirection de messagerie; probablement mieux que d'écrire ces quelques lignes que d'inclure un tout nouveau module
Clive
Ce n'est pas une bonne idée, c'est le type de code qui se faufile dans votre environnement de production lorsque vous l'oubliez et git commit .ou quelque chose de similaire.
Duncanmoo
5

Drupal 8

Pour Drupal 8, vous pouvez activer le gestionnaire de messagerie du module Devel via le système de configuration.

Avec drushce serait:

drush -y pm-enable devel
drush -y config-set system.mail interface.default devel_mail_log
Erik Schwartz
la source
2
Vous pouvez également définir cela par environnement dans settings.local.php: $config['system.mail']['interface']['default'] = 'devel_mail_log';
Patrick Kenny
Pour spécifier le répertoire du journal, c'est $config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';.
leymannx
4

J'utilise habituellement le module Reroute Email pour ce cas. Il peut rediriger tous les e-mails du développeur vers certains e-mails. L'e-mail envoyé spécifie également où cet e-mail doit être envoyé.

Permana
la source
3

Cela fonctionnera sans développement et est sûr dans les trois environnements.

Ajoutez ceci dans settings.php. Copiez-le et changez l'environnement en testpour Test.

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

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

Le crédit pour l'idée de modification du courrier va à http://www.jaypan.com/tutorial/preventing-emails-being-sent-drupal-7-development-environment .

awolfey
la source
Notez que cela pourrait être une vulnérabilité de contournement d'accès. Sur un e-mail de réinitialisation de passe, le passe haché et le lien de réinitialisation seront envoyés à Watchdog, par exemple.
awolfey
2

Je pense que le module Mail Redirect est parfait pour vous :) Une autre façon sale est d'installer le module SMTP et de définir un mauvais smtp;)

arrubiu
la source
Est-il possible d'utiliser ce module tout en étant capable de tester la fonctionnalité Mail?
GoodSp33d
Oui, car le système envoie un e-mail à l'adresse e-mail choisie
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
la source
C'est une meilleure solution que la réponse acceptée. Cela empêche le courrier d'être envoyé complètement, au lieu de simplement rediriger vers une adresse fictive qui nécessite toujours une tentative d'envoi de courrier.
Bryan Jiencke
2

Vous pouvez donc mettre cela dans votre settings.php ou settings.local.php si vous en avez des spécifiques pour le développement, la mise en scène et la 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'] = "[email protected]";
  // Enable inserting a message into the email body when the mail is being
  // rerouted.
  $conf['reroute_email_enable_message'] = 1;
}
Mike Gifford
la source
1

En supposant que vous utilisez le module Mailsystem , allez simplement sur admin/config/system/mailsystemet sélectionnez DevelMailLog.

Martin Poulsen
la source
1

Configurez votre SMTP pour localhostet installer MailCatcher ( GitHub ) qui attire tout message qui lui est envoyé à l' affichage dans une interface Web.

Installation

  1. gem install mailcatcher
  2. mailcatcher
  3. Configurez votre sendmail_pathen PHP pour:

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

    ou en configuration Apache :

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

  5. Envoyer du courrier via smtp://localhost:1025

Dans Drush, vous pouvez faire comme:

php -d sendmail_path="$(which catchmail)" drush.php some-command
kenorb
la source
1

si vous ne voulez pas toucher aux configurations Drupal, configurez MailHog sur votre serveur pour capter tous les e-mails sortant de votre application.

shumushin
la source