Drupalがあらゆる種類の電子メールを送信しないようにするにはどうすればよいですか?


21

Pantheonには、開発者、ステージング、およびライブサーバーのワークフローが設定されています。私のサイトには多くのルールがあり、さまざまな理由でメンバーにメールが送信されます。開発/ステージングサイトでこれらの作業を行う必要がある場合がありますが、ライブデータがあるため、作業中にユーザーが追加または重複した電子メールを受信する場合があることに気付きました。

開発/ステージングサーバーですべての電子メール機能を(簡単に忘れないように自動的に)オフにする簡単な方法はありますか?理想的には、カスタムモジュールが開発/ステージングで有効になっていることを確認するための手順が既に用意されているため、カスタムモジュールを介して電子メールを無効にしたいと思います。


2
ここでの答えはどれも満足のいくものではありません。settings.phpを変更すると、これが本番環境にプッシュされます。Test and Devにモジュールをインストールすると、Liveからクローンを作成したときに上書きされます。いくつかの提案されたコード変更-真剣?settings.local.phpは機能しますが、言及されていません。ローカル開発サイトにありますが、Gitワークフローでは、Pantheon環境では実用的ではありません。SFTPに切り替えてからファイルを取得したり、更新したりする必要があるからです。したがって、残念ながら、無実の実稼働ユーザーは、テストからメールを時々受信し続けます。
ドナー

3
@cdonnerはい、真剣に。あなたが負けたノックオンの問題を解決する方法はたくさんありますが、どれも非常に簡単です。個人的にはgit update-index --assume-unchanged sites/default/settings.php、settings.phpが異なる環境にプッシュされるのを防ぐために使用しています。一部の人々は、環境設定をチェックし、環境に基づいて異なるconfファイルを含む条件付きロジックを好みます(他のほとんどすべてのWebフレームワークは、あらゆる言語で存在します)。ここでの唯一の制限は、想像力です。基本的なPHP / gitのものであり、回答に追加する必要はありません
Clive

1
クライヴ、あなたの意見を尊重します。ただし、ここに問題があります。あるチームメンバーがチェックイン前に想定外のgit呼び出しを行うことを忘れた場合に、テスト環境から多数のユーザーが多数のメールを取得できる大きなサイトがある場合、この責任者として私は望みませんあなたの方法に依存します。
ドナー

1
変更する場合はsites/default/settings.php、代わりに変更しますgit update-index --skip-worktree sites/default/settings.php。を使用すると--assume-unchanged、settings.phpに加えた変更が失われますgit reset --hardstackoverflow.com/questions/13630849/…を

settings.phpを.gitignoreに入れることもできませんか?
エヴァンドノヴァン

回答:


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()ステートメント)に基づいて設定を有効化/無効化/変更できるため、本番環境で自動的にオフにし、オンにすることができます他のマシン。
ダイヤモンド

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 .たり、類似した何かをしたときにあなたの製品環境に潜入するタイプのコードです。
ダンカンムー

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';
パトリック・ケニー

ログdirを指定する場合、それは$config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';です。
レイマンクス

4

この場合、通常、メールの再ルーティングモジュールを使用します。すべての電子メールをdevから特定の電子メールに再ルーティングできます。送信される電子メールは、この電子メールの送信先も指定します。


3

これは開発なしで機能し、3つの環境すべてで安全です。

これをsettings.phpに追加します。それをコピーして、環境を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

Mail Redirectモジュールはあなたにぴったりだと思います:)別の汚い方法は、SMTPモジュールをインストールして間違ったsmtpを設定することです;)


このモジュールを使用しても、メール機能をテストできますか?
-GoodSp33d

はい、システムが選択したメールアドレスにメールを送信するため
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; 
}

これは、受け入れられている答えよりも優れたソリューションです。これにより、メールの送信がまだ必要なダミーアドレスに単に再ルーティングするのではなく、メールの送信が完全に停止します。
ブライアンジェンケ14

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をセットアップし、MailCatcherGitHub)をlocalhostインストールします。MailCatcherは、送信されたメッセージをキャッチしてWebインターフェースに表示します。

設置

  1. gem install mailcatcher
  2. mailcatcher
  3. sendmail_pathPHPで以下を構成します。

    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をセットアップして、アプリケーションから送信されるすべての電子メールをキャッチします。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.