Come posso impedire a Drupal di inviare e-mail di qualsiasi tipo?


21

Ho un flusso di lavoro server di sviluppo, gestione temporanea e live impostato su Pantheon. Il mio sito ha molte regole che fanno sì che i membri vengano inviati per e-mail per vari motivi. A volte ho bisogno di lavorare su questi sui miei siti di sviluppo / messa in scena, ma mi sono reso conto che, poiché hanno i dati in tempo reale, a volte gli utenti riceveranno e-mail aggiuntive o duplicate quando sto lavorando su qualcosa.

Esiste un modo semplice per disattivare tutte le funzionalità di posta elettronica (preferibilmente automaticamente per impedirmi di dimenticare) su un server di sviluppo / gestione temporanea? Idealmente, desidero disabilitare la posta elettronica tramite un modulo personalizzato, poiché ho già predisposto dei passaggi per assicurarmi che un modulo personalizzato sia abilitato su dev / staging.


2
Nessuna delle risposte qui è soddisfacente. Cambiare settings.php significa che questo verrà portato alla produzione. Installare un modulo in Test and Dev significa che verrà sovrascritto quando clonerai da Live. Alcune modifiche al codice suggerite - sul serio? Un settings.local.php funzionerebbe ma non è stato menzionato. Ne ho uno nel sito di sviluppo locale, ma con un flusso di lavoro Git questo non è pratico per gli ambienti Pantheon perché devo passare a SFTP prima di poter ottenere il file lì o effettuare aggiornamenti. Quindi, ahimè, gli utenti di produzione innocenti continueranno a ricevere occasionalmente e-mail dal test.
Cdonner,

3
@cdonner Sì, sul serio. Ci sono molti modi in cui puoi risolvere il problema a catena a cui hai ceduto, tutti molto semplici. Personalmente uso git update-index --assume-unchanged sites/default/settings.phpper evitare che settings.php venga spostato in ambienti diversi. Alcune persone preferiscono una logica condizionale che controlla le impostazioni dell'ambiente e include diversi file di configurazione basati sull'ambiente (praticamente ogni altro framework web esistente, in qualsiasi lingua). L'unico limite è qui la propria immaginazione, è PHP di base / roba git, non ha bisogno di aggiungere ai risposte
Clive

1
Rispetto la tua opinione, Clive. Ecco il problema, però. Se hai un grande sito in cui un gran numero di utenti può ricevere un gran numero di e-mail da un ambiente di test se un membro del team dimentica di effettuare una chiamata git invariata prima di effettuare il check-in, io come responsabile per questo non vorrei fare affidamento sul tuo metodo.
Cdonner,

1
Se si sceglie di modificare sites/default/settings.php, invece git update-index --skip-worktree sites/default/settings.php. Con --assume-unchanged, perdi le modifiche apportate a settings.php se lo fai git reset --hard. Vedere stackoverflow.com/questions/13630849/...

Non potresti anche inserire settings.php nel tuo .gitignore?
Evan Donovan,

Risposte:


38

Come altra opzione, più veloce, puoi aggiungere le seguenti righe al file settings.php del tuo sito (se hai installato il modulo Devel, cosa che sicuramente dovresti se questo è un sito di sviluppo).

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

Ciò sostituirà il sistema di posta predefinito con il sistema di posta di sviluppo di Devel, che scrive le e-mail in un registro file anziché inviarle a un destinatario. Per impostazione predefinita, i file sono memorizzati temporary://devel-mails, ma è possibile modificarlo impostando un'altra variabile, ad es.

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

11

Solo una nota per aggiungere un altro modulo all'elenco "Esiste un modulo per quello":

Reindirizza e-mail intercetta tutte le e-mail in uscita da un sito Drupal e le reindirizza a un indirizzo e-mail configurabile predefinito.

Concordo sul fatto che questa funzionalità può essere facilmente implementata con poche righe di codice, ma utilizzando questo modulo, è possibile continuare a ricevere e-mail a un indirizzo predefinito, con dettagli sul destinatario originale, simpatico imho di funzionalità.


3
Il reindirizzamento della posta elettronica consente inoltre di inserire il codice nel file settings.php per abilitare / disabilitare / modificare le impostazioni in base al nome host (o qualunque altra istruzione if () che si desidera utilizzare), in modo da poterlo attivare automaticamente su Produzione e ON su qualsiasi altra macchina.
Diamondsea,

10

In alternativa, puoi utilizzare hook_mail_alter per reindirizzare o prevenire le email di 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
Questo è essenzialmente tutto il reindirizzamento della posta; probabilmente è meglio solo scrivere queste poche righe piuttosto che includere un modulo completamente nuovo
Clive

Non è una buona idea, questo è il tipo di codice che si intrufola nel tuo ambiente di produzione quando te ne dimentichi e git commit .o qualcosa di simile.
Duncanmoo,

5

Drupal 8

Per Drupal 8, è possibile attivare il gestore di posta del modulo Devel attraverso il sistema di configurazione.

Con drushesso sarebbe:

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

2
Puoi anche impostare questo per ambiente in settings.local.php: $config['system.mail']['interface']['default'] = 'devel_mail_log';
Patrick Kenny

Per specificare la directory di registro, allora è $config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';.
leymannx,

4

Di solito uso il modulo Reroute Email per questo caso. Può reindirizzare tutte le e-mail dallo sviluppatore a determinate e-mail. L'e-mail inviata specifica anche dove inviare questa e-mail.


3

Funzionerà senza sviluppo ed è sicuro in tutti e tre gli ambienti.

Aggiungi questo in settings.php. Copiarlo e modificare l'ambiente in testper Test.

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

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

Il merito dell'idea di alterazione della posta va a http://www.jaypan.com/tutorial/preventing-emails-being-sent-drupal-7-development-environment .


Si noti che questa potrebbe essere una vulnerabilità di bypass di accesso. In un'e-mail di reimpostazione pass, il link con hash e reimpostazione verrà inviato al watchdog, per esempio.
Awolfey,

2

Penso che il modulo Mail Redirect sia perfetto per te :) Un altro modo sporco è installare il modulo SMTP e impostare un smtp sbagliato;)


È possibile utilizzare questo modulo ed essere ancora in grado di testare la funzionalità Mail?
GoodSp33d

Sì, perché il sistema invia e-mail all'indirizzo e-mail scelto
arrubiu


2

Quindi potresti metterlo nel tuo settings.php o settings.local.php se ne hai di specifici per lo sviluppo, la messa in scena e la produzione.

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

Supponendo che si stia utilizzando il modulo Mailsystem , basta andare su admin/config/system/mailsysteme selezionare DevelMailLog.


1

Set-up vostro SMTP a localhosted installare MailCatcher ( GitHub ) che cattura qualsiasi messaggio inviato ad esso per la visualizzazione in un interfaccia web.

Installazione

  1. gem install mailcatcher
  2. mailcatcher
  3. Configura il tuo sendmail_pathin PHP per:

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

    o nella configurazione di Apache :

    php_admin_value sendmail_path "/usr/bin/env catchmail -f some@from.address"
  4. Vai a http://localhost:1080/

  5. Invia posta attraverso smtp://localhost:1025

In Drush puoi fare come:

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

1

se non vuoi toccare le configurazioni di Drupal, configura MailHog sul tuo server per catturare tutte le e-mail che escono dalla tua applicazione.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.