如何阻止Drupal发送任何形式的电子邮件?


21

我在Pantheon上设置了开发,暂存和实时服务器工作流程。我的网站上有很多规则,由于各种原因,这些规则会导致向成员发送电子邮件。有时我需要在我的开发/登台站点上进行处理,但是我意识到,由于它们具有实时数据,因此当我进行某些工作时,有时用户会收到其他或重复的电子邮件。

有什么简单的方法可以关闭开发/登台服务器上的所有电子邮件功能(最好是自动关闭,以防止我忘记我)?理想情况下,我想通过自定义模块禁用电子邮件,因为我已经采取了确保在开发/登台中启用自定义模块的步骤。


2
这里的答案都不令人满意。更改settings.php意味着它将被推向生产。在Test and Dev中安装模块意味着从Live克隆时它将被覆盖。一些建议的代码更改-认真吗?settings.local.php可以工作,但是没有提到。我在本地开发站点中有一个,但是对于Git工作流,这在Pantheon环境中不切实际,因为必须先切换到SFTP,然后才能在那里获取文件或进行更新。因此,很遗憾,无辜的生产用户将继续偶尔收到来自测试的电子邮件。
cdonner

3
@cdonner是的,很认真。有很多方法可以解决您遇到的连锁问题,所有这些方法都非常简单。我个人是git update-index --assume-unchanged sites/default/settings.php为了防止settings.php在不同环境中被推送。有些人更喜欢一些条件逻辑,该条件逻辑检查环境设置并包括基于环境的不同conf文件(存在的几乎所有其他Web框架,使用任何语言)。唯一的限制是个人的想象力,它是基本的PHP / git东西,不需要添加答案
Clive

1
我尊重您的意见,克莱夫。不过,这就是问题所在。如果您有一个大型网站,如果一个团队成员忘记在登录之前进行假设不变的git调用,那么大量用户可以从测试环境中获取大量电子邮件,我作为负责此事的人不希望依靠你的方法。
cdonner 2015年

1
如果确实选择修改sites/default/settings.php,则改为git update-index --skip-worktree sites/default/settings.php。使用时--assume-unchanged,如果执行,则会丢失对settings.php所做的更改git reset --hard。见stackoverflow.com/questions/13630849/…–

您是否也可以将settings.php放入.gitignore?
埃文·多诺万

Answers:


38

作为另一个更快的选择,您可以将以下行添加到站点的settings.php文件中(如果您安装了Devel模块,那么如果这是一个开发站点,则应该安装)。

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

这将用Devel的开发邮件系统代替默认的邮件系统,该系统将电子邮件写入文件日志,而不是发送给收件人。默认情况下,文件存储在中temporary://devel-mails,但是您可以通过设置另一个变量来更改它,例如。

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

11

只是将另一个模块添加到“该模块有一个”列表中的注释:

重新路由电子邮件会拦截来自Drupal站点的所有传出电子邮件,并将它们重新路由到预定义的可配置电子邮件地址。

我同意可以通过几行代码轻松实现这种功能,但是使用此模块,您可以继续接收到预定义地址的电子邮件,其中包含原始收件人的详细信息,即功能性恕我直言。


3
重新路由电子邮件还可以让您将代码放入settings.php文件中,以根据主机名(或您要使用的任何if()语句)启用/禁用/更改设置,因此您可以使其自动在生产中关闭并在任何其他机器。
diamondsea

10

或者,您可以使用hook_mail_alter来重定向或阻止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
这基本上是邮件重定向的全部工作;也许只写这几行比包含一个全新的模块更好
克莱夫(Clive)

这不是一个好主意,因为当您忘记它git commit .或类似的东西时,它们会潜入您的产品环境中。
Duncanmoo '18年

5

Drupal 8

对于Drupal 8,您可以通过配置系统打开Devel模块邮件处理程序。

有了drush这将是:

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

2
您还可以在以下环境中设置此设置settings.local.php$config['system.mail']['interface']['default'] = 'devel_mail_log';
Patrick Kenny

要指定日志目录,则为$config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';
leymannx

4

在这种情况下,我通常使用“ 重新路由电子邮件”模块。它可以将所有电子邮件从开发人员重新路由到特定电子邮件。发送的电子邮件还指定该电子邮件应发送到的位置。


3

这将正常工作,并且在所有三种环境中都是安全的。

在settings.php中添加它。复制它,并将环境更改test为Test。

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

然后在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>'));
  }
}

有关更改邮件想法的信息,请访问http://www.jaypan.com/tutorial/preventing-emails-being-sent-drupal-7-development-environment


请注意,这可能是访问绕过漏洞。例如,在通行证重置电子邮件中,散列的通行证和重置链接将发送给看门狗。
awolfey



2

因此,如果您有用于开发,暂存和生产的特定文件,则可以将其放在settings.php或settings.local.php中。

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

SMTP设置为localhost并安装MailCatcherGitHub),它可以捕获发送给它的任何消息以在Web界面中显示。

安装

  1. gem install mailcatcher
  2. mailcatcher
  3. 将您sendmail_path的PHP 配置为:

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

    或在Apache配置中

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

  5. 通过发送邮件 smtp://localhost:1025

在Drush中,您可以执行以下操作:

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

1

如果您不想触摸Drupal配置,在服务器上设置MailHog以捕获来自应用程序的所有电子邮件。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.