¿Cómo puedo evitar que Drupal envíe correos electrónicos de cualquier tipo?

21

Tengo un flujo de trabajo de desarrollo, puesta en escena y servidor en vivo configurado en Pantheon. Mi sitio tiene muchas reglas que hacen que los miembros sean enviados por correo electrónico por varias razones. A veces necesito trabajar en estos en mis sitios de desarrollo / preparación, pero me he dado cuenta de que, dado que tienen los datos en vivo, a veces los usuarios recibirán correos electrónicos adicionales o duplicados cuando estoy trabajando en algo.

¿Hay alguna manera fácil de desactivar toda la capacidad de correo electrónico (preferiblemente automáticamente para evitar que me olvide) en un servidor de desarrollo / preparación? Idealmente, me gustaría deshabilitar el correo electrónico a través de un módulo personalizado, ya que ya tengo los pasos establecidos para asegurarme de que un módulo personalizado esté habilitado en dev / staging.

Patrick Kenny
fuente
2
Ninguna de las respuestas aquí es satisfactoria. Cambiar el settings.php significa que esto se trasladará a producción. Instalar un módulo en Test y Dev significa que se sobrescribirá cuando clones desde Live. Algunos cambios de código sugeridos, ¿en serio? Un settings.local.php funcionaría pero no fue mencionado. Tengo uno en el sitio de desarrollo local, pero con un flujo de trabajo de Git esto no es práctico para los entornos Pantheon porque tengo que cambiar a SFTP antes de poder obtener el archivo allí o realizar actualizaciones. Entonces, por desgracia, los usuarios inocentes de producción continuarán recibiendo ocasionalmente correos electrónicos de la prueba.
Cdonner
3
@cdonner Sí, en serio. Hay muchas maneras en que puede resolver el problema que ha sucumbido, todas ellas muy sencillas. Personalmente, uso git update-index --assume-unchanged sites/default/settings.phppara evitar que settings.php sea empujado por diferentes entornos. Algunas personas prefieren una lógica condicional que verifica la configuración del entorno e incluye diferentes archivos conf basados ​​en el entorno (al igual que cualquier otro marco web existente, en cualquier idioma). El único límite aquí es la imaginación de uno, es algo básico de PHP / git, no es necesario agregarlo a las respuestas
Clive
1
Respeto tu opinión, Clive. Aquí está el problema, sin embargo. Si tiene un sitio grande donde una gran cantidad de usuarios puede recibir una gran cantidad de correos electrónicos de un entorno de prueba si un miembro del equipo olvida hacer una llamada git sin cambios antes de registrarse, yo como persona responsable de esto no querría confiar en tu método.
cdonner
1
Si eliges modificar sites/default/settings.php, hazlo git update-index --skip-worktree sites/default/settings.php. Con --assume-unchanged, pierdes los cambios que hiciste en settings.php si haces un git reset --hard. Ver stackoverflow.com/questions/13630849/…
¿No podrías también poner settings.php en tu .gitignore?
Evan Donovan

Respuestas:

38

Como otra opción más rápida, puede agregar las siguientes líneas al archivo settings.php de su sitio (si tiene instalado el módulo Devel, lo que ciertamente debería hacer si este es un sitio de desarrollo).

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

Eso reemplazará el sistema de correo predeterminado con el sistema de correo de desarrollo de Devel, que escribe correos electrónicos en un registro de archivos en lugar de enviarlos a un destinatario. De manera predeterminada, los archivos se almacenan temporary://devel-mails, pero puede modificarlos configurando otra variable, por ejemplo.

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

Solo una nota para agregar otro módulo a la lista "Hay un módulo para eso":

Redirigir el correo electrónico intercepta todos los correos electrónicos salientes de un sitio de Drupal y los redirige a una dirección de correo electrónico configurable predefinida.

Estoy de acuerdo en que esta funcionalidad se puede implementar fácilmente con unas pocas líneas de código, pero al usar este módulo, podría continuar recibiendo correos electrónicos a una dirección predefinida, con detalles sobre el destinatario original, buena funcionalidad.

claire_
fuente
3
Redirigir el correo electrónico también le permite poner código en su archivo settings.php para habilitar / deshabilitar / cambiar la configuración en función de su nombre de host (o lo que sea si () declaración que desea usar), para que pueda apagarlo automáticamente en Producción y ENCENDIDO en Cualquier otra máquina.
diamondsea
10

O puede usar hook_mail_alter para redirigir o evitar correos 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
fuente
3
Esto es esencialmente todo lo que hace Redirigir correo; probablemente sea mejor escribir estas pocas líneas que incluir un módulo completamente nuevo
Clive
No es una buena idea, este es el tipo de código que se cuela en su entorno de producción cuando se olvida de él git commit .o algo similar.
Duncanmoo
5

Drupal 8

Para Drupal 8, puede activar el controlador de correo del módulo Devel a través del sistema de configuración.

Con drusheso sería:

drush -y pm-enable devel
drush -y config-set system.mail interface.default devel_mail_log
Erik Schwartz
fuente
2
También puede configurar esto por entorno en settings.local.php: $config['system.mail']['interface']['default'] = 'devel_mail_log';
Patrick Kenny
Para especificar el directorio de registro, entonces es $config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';.
leymannx
4

Usualmente uso el módulo Reroute Email para este caso. Puede redirigir todo el correo electrónico desde el desarrollador a cierto correo electrónico. El correo electrónico enviado también especifica a dónde se debe enviar este correo electrónico.

Permana
fuente
3

Esto funcionará sin desarrollo y es seguro en los tres entornos.

Agregue esto en settings.php. Cópielo y cambie el entorno a testPrueba.

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

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

El crédito por la idea de correo alterno va a http://www.jaypan.com/tutorial/preventing-emails-being-sent-drupal-7-development-environment .

awolfey
fuente
Tenga en cuenta que esto podría ser una vulnerabilidad de omisión de acceso. En un correo electrónico de restablecimiento de pase, el pase hash y el enlace de restablecimiento se enviarán a watchdog, por ejemplo.
awolfey
2

Creo que el módulo Redirigir correo es perfecto para usted :) Otra forma sucia es instalar el módulo SMTP y configurar un smtp incorrecto;)

arrubiu
fuente
¿Es posible usar este módulo y aún así poder probar la funcionalidad de Mail?
GoodSp33d
Sí, porque el sistema envía un correo electrónico a la dirección de correo electrónico elegida
arrubiu
2

Por lo tanto, puede poner esto en su settings.php o settings.local.php si tiene unos específicos para dev, puesta en escena y producción.

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

Suponiendo que está utilizando el módulo Mailsystem , simplemente vaya admin/config/system/mailsystemy seleccione DevelMailLog.

Martin Poulsen
fuente
1

Puesta a punto de su SMTP para localhoste instalar MailCatcher ( GitHub ) que atrapa cualquier mensaje enviado a él para la exhibición en una interfaz web.

Instalación

  1. gem install mailcatcher
  2. mailcatcher
  3. Configure su sendmail_pathen PHP para:

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

    o en la configuración de Apache :

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

  5. Enviar correo a través de smtp://localhost:1025

En Drush puedes hacer como:

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

si no desea tocar las configuraciones de Drupal, configure MailHog en su servidor para capturar todos los correos electrónicos que salen de su aplicación.

shumushin
fuente