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.


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

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.


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'] = ''; 
}

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

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.


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 .


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


É 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

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'] = "example@example.com";
  // Enable inserting a message into the email body when the mail is being
  // rerouted.
  $conf['reroute_email_enable_message'] = 1;
}


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 some@from.address"
  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

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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.