Bagaimana saya bisa menghentikan Drupal mengirim email dalam bentuk apa pun?

21

Saya memiliki alur kerja dev, staging, dan server live yang diatur di Pantheon. Situs saya memiliki banyak peraturan yang menyebabkan anggota dikirim melalui email karena berbagai alasan. Kadang-kadang saya perlu mengerjakan ini di situs dev / staging saya tetapi saya menyadari bahwa, karena mereka memiliki data langsung, kadang-kadang pengguna akan menerima email tambahan atau duplikat ketika saya sedang mengerjakan sesuatu.

Apakah ada cara mudah untuk mematikan semua kemampuan e-mail (lebih disukai secara otomatis untuk mencegah saya lupa) pada server dev / staging? Idealnya, saya ingin menonaktifkan e-mail melalui modul khusus, karena saya sudah memiliki langkah-langkah untuk memastikan modul khusus diaktifkan pada dev / staging.

Patrick Kenny
sumber
2
Tidak ada jawaban di sini yang memuaskan. Mengubah pengaturan.php berarti ini akan didorong ke produksi. Menginstal modul di Test and Dev berarti modul itu akan ditimpa ketika Anda mengkloning dari Live. Beberapa perubahan kode yang disarankan - serius? Setting.local.php akan berfungsi tetapi tidak disebutkan. Saya punya satu di situs pengembangan lokal, tetapi dengan alur kerja Git ini tidak praktis untuk lingkungan Pantheon karena saya harus beralih ke SFTP sebelum saya bisa mendapatkan file di sana atau membuat pembaruan. Jadi, sayangnya, pengguna produksi yang tidak bersalah akan terus menerima email dari pengujian.
cdonner
3
@cdonner Ya, serius. Ada banyak cara untuk menyelesaikan masalah knock-on yang Anda lakukan, semuanya sangat mudah. Secara pribadi saya gunakan git update-index --assume-unchanged sites/default/settings.phpuntuk menjaga pengaturan.php dari didorong di lingkungan yang berbeda. Beberapa orang lebih suka beberapa logika kondisional yang memeriksa pengaturan lingkungan dan menyertakan file conf berbeda berdasarkan lingkungan (seperti hampir semua kerangka web lainnya yang ada, dalam bahasa apa pun). Satu-satunya batasan di sini adalah imajinasi seseorang, itu adalah hal-hal dasar PHP / git, tidak perlu ditambahkan ke jawaban
Clive
1
Saya menghargai pendapat Anda, Clive. Namun, inilah masalahnya. Jika Anda memiliki situs besar di mana sejumlah besar pengguna dapat memperoleh sejumlah besar email dari lingkungan pengujian jika salah satu anggota tim lupa untuk membuat panggilan git yang dianggap tidak berubah sebelum check-in, saya sebagai orang yang bertanggung jawab untuk ini tidak akan mau mengandalkan metode Anda.
cdonner
1
Jika Anda memilih untuk memodifikasi sites/default/settings.php, lakukan git update-index --skip-worktree sites/default/settings.php. Dengan --assume-unchanged, Anda kehilangan perubahan yang Anda buat pada settings.php jika Anda melakukan git reset --hard. Lihat stackoverflow.com/questions/13630849/…
Tidak bisakah Anda juga memasukkan setting.php ke .gitignore Anda?
Evan Donovan

Jawaban:

38

Sebagai opsi lain yang lebih cepat, Anda dapat menambahkan baris berikut ke file settings.php situs Anda (jika Anda memiliki modul Devel yang diinstal, yang tentunya Anda harus lakukan jika ini adalah situs dev).

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

Itu akan menggantikan sistem surat default dengan sistem surat pengembangan Devel, yang menulis email ke file log daripada mengirimnya ke penerima. Secara default file disimpan temporary://devel-mails, tetapi Anda dapat mengubahnya dengan mengatur variabel lain, misalnya.

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

Hanya catatan untuk menambahkan modul lain ke daftar "Ada modul untuk itu":

Ubah rute email menyadap semua email keluar dari situs Drupal dan arahkan kembali ke alamat email yang dapat dikonfigurasi yang sudah ditentukan sebelumnya.

Saya setuju bahwa fungsi ini dapat dengan mudah diimplementasikan dengan beberapa baris kode, tetapi dengan menggunakan modul ini, Anda dapat terus menerima email ke alamat yang telah ditentukan, dengan perincian tentang penerima asli, fungsi yang bagus, imho.

claire_
sumber
3
Ubah rute email juga memungkinkan Anda memasukkan kode dalam file settings.php Anda untuk mengaktifkan / menonaktifkan / mengubah pengaturan berdasarkan nama host Anda (atau apa pun jika () pernyataan yang ingin Anda gunakan), sehingga Anda dapat membuatnya secara otomatis MATI pada Produksi dan AKTIF pada mesin lain.
diamondsea
10

Atau Anda dapat menggunakan hook_mail_alter untuk mengarahkan ulang atau mencegah surat 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
sumber
3
Ini pada dasarnya adalah semua Pengalihan Email tidak; mungkin lebih baik hanya menulis beberapa baris ini daripada memasukkan modul baru
Clive
Bukan ide yang baik, ini adalah mereka jenis kode yang menyelinap ke lingkungan prod Anda ketika Anda melupakannya dan git commit .atau sesuatu yang serupa.
Duncanmoo
5

Drupal 8

Untuk Drupal 8, Anda dapat menghidupkan penangan surat modul Devel melalui sistem konfigurasi.

Dengan drushitu akan menjadi:

drush -y pm-enable devel
drush -y config-set system.mail interface.default devel_mail_log
Erik Schwartz
sumber
2
Anda juga dapat mengatur ini per lingkungan di settings.local.php: $config['system.mail']['interface']['default'] = 'devel_mail_log';
Patrick Kenny
Untuk menentukan dir log maka itu $config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';.
leymannx
4

Saya biasanya menggunakan modul Reroute Email untuk kasus ini. Itu dapat mengalihkan semua email dari dev ke email tertentu. Email yang dikirim juga menentukan ke mana email ini harus dikirim.

Permana
sumber
3

Ini akan bekerja tanpa devel dan aman di ketiga lingkungan.

Tambahkan ini di settings.php. Salin dan ubah lingkungan menjadi testuntuk Test.

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

Kemudian dalam modul saya:

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

Kredit untuk email dan ide berubah ke http://www.jaypan.com/tutorial/preventing-emails-being-sent-drupal-7-development-environment .

awolfey
sumber
Perhatikan bahwa ini bisa menjadi kerentanan akses pintas. Pada email pass reset, hashed pass dan reset link akan dikirim ke watchdog, misalnya.
awolfey
2

Saya pikir modul Redirect Mail sangat cocok untuk Anda :) Cara kotor lainnya adalah menginstal modul SMTP dan mengatur smtp yang salah;)

arrubiu
sumber
Apakah mungkin menggunakan modul ini dan masih dapat menguji fungsionalitas Mail?
GoodSp33d
Ya, karena sistem mengirim email ke alamat email yang dipilih
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
sumber
Ini adalah solusi yang lebih baik daripada jawaban yang diterima. Ini menghentikan surat agar tidak dikirim sama sekali, alih-alih hanya mengarahkan ulang ke alamat dummy yang masih memerlukan upaya pengiriman surat.
Bryan Jiencke
2

Jadi Anda dapat meletakkan ini di settings.php atau settings.local.php Anda jika Anda memiliki yang spesifik untuk dev, staging & produksi.

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

Dengan asumsi bahwa Anda menggunakan modul Mailsystem , buka admin/config/system/mailsystemdan pilih DevelMailLog.

Martin Poulsen
sumber
1

Siapkan SMTP Anda untuk localhostdan instal MailCatcher ( GitHub ) yang menangkap setiap pesan yang dikirim kepadanya untuk ditampilkan di antarmuka web.

Instalasi

  1. gem install mailcatcher
  2. mailcatcher
  3. Konfigurasikan sendmail_path di PHP untuk:

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

    atau dalam konfigurasi Apache :

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

  5. Kirim surat melalui smtp://localhost:1025

Di Drush Anda dapat melakukan seperti:

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

jika Anda tidak ingin menyentuh konfigurasi Drupal, atur MailHog di server Anda untuk menangkap semua e-mail yang keluar dari aplikasi Anda.

shumushin
sumber