Como posso impedir que o Drupal envie e-mails de qualquer tipo?

21

Eu tenho um fluxo de trabalho de servidor de desenvolvimento, teste e ao vivo configurado no Pantheon. Meu site tem muitas regras que fazem com que os membros sejam enviados por email por vários motivos. Às vezes, preciso trabalhar neles nos meus sites de teste / desenvolvimento, mas percebi que, como eles têm dados ativos, às vezes os usuários recebem e-mails adicionais ou duplicados quando estou trabalhando em algo.

Existe alguma maneira fácil de desativar todos os recursos de email (de preferência automaticamente para impedir que eu esqueça) em um servidor de desenvolvimento / armazenamento temporário? Idealmente, eu gostaria de desativar o email por meio de um módulo personalizado, já que já tenho etapas para garantir que um módulo personalizado esteja ativado no desenvolvimento / teste.

Patrick Kenny
fonte
2
Nenhuma das respostas aqui é satisfatória. Alterar o settings.php significa que isso será enviado à produção. A instalação de um módulo no Test and Dev significa que ele será substituído quando você clonar no Live. Algumas alterações de código sugeridas - sério? Um settings.local.php funcionaria, mas não foi mencionado. Eu tenho um no site de desenvolvimento local, mas com um fluxo de trabalho do Git, isso não é prático para os ambientes Pantheon, pois preciso mudar para o SFTP antes de poder obter o arquivo ou fazer atualizações. Portanto, infelizmente, usuários inocentes de produção continuarão recebendo ocasionalmente emails de teste.
cdonner
3
@donner Sim, sério. Existem várias maneiras pelas quais você pode resolver o problema indireto que sucumbiu, todas elas muito diretas. Pessoalmente, uso git update-index --assume-unchanged sites/default/settings.phppara impedir que o settings.php seja empurrado para ambientes diferentes. Algumas pessoas preferem uma lógica condicional que checa as configurações do ambiente e inclui diferentes arquivos conf com base no ambiente (praticamente todos os outros frameworks existentes, em qualquer idioma). O único limite aqui é a imaginação, é PHP básico / stuff git, não precisam ser adicionados às respostas
Clive
11
Eu respeito sua opinião, Clive. Aqui está o problema, no entanto. Se você tem um site grande, em que um grande número de usuários pode receber um grande número de emails de um ambiente de teste, se um membro da equipe se esquece de fazer uma chamada Git sem alteração antes de fazer o check-in, eu, como responsável por isso, não gostaria confiar no seu método.
cdonner
11
Se você optar por modificar sites/default/settings.php, faça git update-index --skip-worktree sites/default/settings.php. Com --assume-unchanged, você perde as alterações feitas no settings.php se fizer um git reset --hard. Veja stackoverflow.com/questions/13630849/…
Você também não poderia colocar o settings.php no seu .gitignore?
Evan Donovan

Respostas:

38

Como outra opção, mais rápida, você pode adicionar as seguintes linhas ao arquivo settings.php do seu site (se você tiver o módulo Devel instalado, o que você certamente deve fazer se for um site de desenvolvimento).

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

Isso substituirá o sistema de correio padrão pelo sistema de correio de desenvolvimento do Devel, que grava emails em um log de arquivos em vez de enviá-los para um destinatário. Por padrão, os arquivos são armazenados temporary://devel-mails, mas você pode alterar isso configurando outra variável, por exemplo.

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

Apenas uma observação para adicionar outro módulo à lista "Existe um módulo para isso":

Redirecionar e-mail intercepta todos os e-mails enviados de um site Drupal e os redireciona para um endereço de e-mail configurável predefinido.

Concordo que essa funcionalidade pode ser facilmente implementada com algumas linhas de código, mas, usando este módulo, você pode continuar recebendo e-mails para um endereço predefinido, com detalhes sobre o destinatário original, ótima funcionalidade.

claire_
fonte
3
Redirecionar e-mail também permite que você coloque o código no seu arquivo settings.php para ativar / desativar / alterar as configurações com base no nome do host (ou na declaração if () que você deseja usar), para que ele seja desativado automaticamente na produção e ativado. qualquer outra máquina.
Diamondsea #
10

Ou você pode usar hook_mail_alter para redirecionar ou impedir emails 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
fonte
3
Isso é essencialmente tudo o que o Redirecionamento de Correio faz; provavelmente é melhor escrever essas poucas linhas do que incluir um módulo totalmente novo
Clive
Não é uma boa ideia, esse é o tipo de código que se infiltra no ambiente de produção quando você se esquece e git commit .ou algo semelhante.
Duncanmoo
5

Drupal 8

No Drupal 8, você pode ativar o manipulador de correio do módulo Devel através do sistema de configuração.

Com drushisso seria:

drush -y pm-enable devel
drush -y config-set system.mail interface.default devel_mail_log
Erik Schwartz
fonte
2
Você também pode definir isso por ambiente em settings.local.php: $config['system.mail']['interface']['default'] = 'devel_mail_log';
Patrick Kenny
Para especificar o diretório de log, então é $config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';.
leymannx 7/01
4

Normalmente, uso o módulo Reroute Email para este caso. Ele pode redirecionar todos os emails de dev para determinados emails. O email enviado também especifica para onde esse email deve ser enviado.

Permana
fonte
3

Isso funcionará sem desenvolvimento e é seguro nos três ambientes.

Adicione isso em settings.php. Copie-o e altere o ambiente testpara Teste.

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

Então no 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>'));
  }
}

O crédito pela ideia de alteração de correio vai para http://www.jaypan.com/tutorial/preventing-emails-being-sent-drupal-7-development-environment .

awolfey
fonte
Observe que isso pode ser uma vulnerabilidade de desvio de acesso. Em um email de redefinição de passe, o link com hash e redefinição de hash será enviado ao watchdog, por exemplo.
awolfey
2

Eu acho que o módulo Redirecionamento de email é perfeito para você :) Outra maneira suja é instalar o módulo SMTP e definir um smtp errado;)

arrubiu
fonte
É possível usar este módulo e ainda conseguir testar a funcionalidade do Mail?
30912 GoodSp33d
Sim, porque o sistema envia e-mail para o endereço de e-mail escolhido
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
fonte
Esta é uma solução melhor que a resposta aceita. Isso impede que o email seja enviado completamente, em vez de apenas redirecionar para um endereço fictício que ainda requer uma tentativa de envio de email.
21714 Bryan Jiencke
2

Então você pode colocar isso no seu settings.php ou settings.local.php se tiver algum específico para desenvolvimento, preparação e produção.

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

Supondo que você esteja usando o módulo Mailsystem , basta ir admin/config/system/mailsysteme selecionar DevelMailLog.

Martin Poulsen
fonte
1

Set-up seu SMTP para localhoste instalar MailCatcher ( GitHub ), que pega qualquer mensagem enviada a ele para exibição em uma interface web.

Instalação

  1. gem install mailcatcher
  2. mailcatcher
  3. Configure o seu sendmail_pathno PHP para:

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

    ou na configuração do Apache :

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

  5. Enviar email através smtp://localhost:1025

No Drush você pode fazer como:

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

se você não quiser tocar nas configurações do Drupal, configure o MailHog no seu servidor para capturar todos os e-mails que saem do seu aplicativo.

shumushin
fonte