Làm thế nào tôi có thể ngăn Drupal gửi e-mail dưới bất kỳ hình thức nào?


21

Tôi có một quy trình phát triển máy chủ, dàn dựng và máy chủ trực tiếp được thiết lập trên Pantheon. Trang web của tôi có rất nhiều quy tắc khiến các thành viên được gửi e-mail vì nhiều lý do. Đôi khi tôi cần phải làm việc trên những trang này trên các trang dev / staging của mình nhưng tôi nhận ra rằng, vì họ có dữ liệu trực tiếp, đôi khi người dùng sẽ nhận được e-mail bổ sung hoặc trùng lặp khi tôi đang làm việc gì đó.

Có cách nào dễ dàng để tắt tất cả khả năng gửi thư điện tử (tốt nhất là tự động để ngăn tôi quên) trên máy chủ dev / staging không? Lý tưởng nhất là tôi muốn tắt e-mail thông qua một mô-đun tùy chỉnh, vì tôi đã có sẵn các bước để đảm bảo mô-đun tùy chỉnh được bật trên dev / staging.


2
Không có câu trả lời nào ở đây là thỏa đáng. Thay đổi settings.php có nghĩa là điều này sẽ được đẩy sang sản xuất. Cài đặt một mô-đun trong Test và Dev có nghĩa là nó sẽ bị ghi đè khi bạn sao chép từ Live. Một số thay đổi mã đề xuất - nghiêm túc? Một settings.local.php sẽ hoạt động nhưng không được đề cập. Tôi có một trang trong trang phát triển cục bộ, nhưng với quy trình Git, điều này không thực tế đối với môi trường Pantheon vì tôi phải chuyển sang SFTP trước khi tôi có thể lấy tệp ở đó hoặc cập nhật. Vì vậy, than ôi, người dùng sản xuất vô tội sẽ tiếp tục thỉnh thoảng nhận được email từ thử nghiệm.
cdonner

3
@cdonner Vâng, nghiêm túc. Có nhiều cách bạn có thể giải quyết vấn đề gõ cửa mà bạn đã chịu thua, tất cả đều rất đơn giản. Cá nhân tôi sử dụng git update-index --assume-unchanged sites/default/settings.phpđể giữ cài đặt.php không bị đẩy xung quanh các môi trường khác nhau. Một số người thích một số logic có điều kiện đã kiểm tra cài đặt môi trường và bao gồm các tệp conf khác nhau dựa trên môi trường (gần như mọi khung web khác tồn tại, trong bất kỳ ngôn ngữ nào). Giới hạn duy nhất ở đây là trí tưởng tượng của một người, đó là công cụ PHP / git cơ bản, không cần thêm vào câu trả lời
Clive

1
Tôi tôn trọng ý kiến ​​của bạn, Clive. Đây là vấn đề, mặc dù. Nếu bạn có một trang web lớn, nơi một số lượng lớn người dùng có thể nhận được một số lượng lớn email từ môi trường thử nghiệm nếu một thành viên trong nhóm quên thực hiện cuộc gọi git không thay đổi giả định trước khi đăng ký, tôi là người chịu trách nhiệm cho việc này sẽ không muốn dựa vào phương pháp của bạn
cdonner

1
Nếu bạn chọn sửa đổi sites/default/settings.php, thay vào đó làm git update-index --skip-worktree sites/default/settings.php. Với --assume-unchanged, bạn sẽ mất các thay đổi bạn đã thực hiện cho settings.php nếu bạn thực hiện a git reset --hard. Xem stackoverflow.com/questions/13630849/

Bạn cũng không thể đặt settings.php vào .gitignore của mình chứ?
Evan Donovan

Câu trả lời:


38

Như một tùy chọn khác, nhanh hơn, bạn có thể thêm các dòng sau vào tệp settings.php của trang web của bạn (nếu bạn đã cài đặt mô-đun Devel, điều mà bạn chắc chắn nên làm nếu đây là trang dev).

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

Điều đó sẽ thay thế hệ thống thư mặc định bằng hệ thống thư phát triển của Devel, ghi email vào nhật ký tệp thay vì gửi chúng cho người nhận. Theo mặc định, các tệp được lưu trữ temporary://devel-mails, nhưng bạn có thể thay đổi điều đó bằng cách đặt một biến khác, vd.

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

11

Chỉ cần một lưu ý để thêm một mô-đun khác vào danh sách "Có một mô-đun cho điều đó":

Định tuyến lại email chặn tất cả các email gửi đi từ một trang web Drupal và định tuyến lại chúng đến một địa chỉ email có thể định cấu hình được xác định trước.

Tôi đồng ý rằng chức năng này có thể dễ dàng được thực hiện với một vài dòng mã, nhưng bằng cách sử dụng mô-đun này, bạn có thể tiếp tục nhận email đến một địa chỉ được xác định trước, với chi tiết về người nhận ban đầu, imho chức năng tốt.


3
Định tuyến lại email cũng cho phép bạn đặt mã trong tệp settings.php để bật / tắt / thay đổi cài đặt dựa trên tên máy chủ (hoặc bất cứ câu lệnh if () nào bạn muốn sử dụng), do đó bạn có thể tự động bật TẮT sản xuất và BẬT bất kỳ máy nào khác.
diamondsea

10

Hoặc bạn có thể sử dụng hook_mail_alter để chuyển hướng hoặc ngăn chặn các thư điện tử:

/**
* Implements hook_mail_alter
*/
function yourmodule_mail_alter(&$message) {
  // set 'To' field to nothing, so Drupal won’t have any address
  $message['to'] = ''; 
}

3
Đây thực chất là tất cả các Chuyển hướng thư làm; có lẽ tốt hơn là chỉ viết vài dòng này hơn là bao gồm một mô-đun hoàn toàn mới
Clive

Không phải là một ý tưởng tốt, đây là loại mã họ lẻn vào môi trường prod của bạn khi bạn quên nó và git commit .hoặc một cái gì đó tương tự.
Duncanmoo

5

Drupal 8

Đối với Drupal 8, bạn có thể bật trình xử lý thư mô-đun Devel thông qua hệ thống cấu hình.

Với drushnó sẽ là:

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

2
Bạn cũng có thể đặt môi trường này cho mỗi môi trường trong settings.local.php: $config['system.mail']['interface']['default'] = 'devel_mail_log';
Patrick Kenny

Để chỉ định các log log thì nó $config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';.
leymannx

4

Tôi thường sử dụng mô đun Email định tuyến lại cho trường hợp này. Nó có thể định tuyến lại tất cả email từ dev đến email nhất định. Email được gửi cũng chỉ định nơi email này sẽ được gửi đến.


3

Điều này sẽ hoạt động mà không phát triển và an toàn trong cả ba môi trường.

Thêm phần này trong settings.php. Sao chép nó và thay đổi môi trường để testthử nghiệm.

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

Sau đó, trong mô hình của tôi:

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

Tín dụng cho ý tưởng thay đổi thư đi đến http://www.jaypan.com/tutorial/preventing-emails-being-sent-drupal-7-development-en môi trường .


Lưu ý rằng đây có thể là một lỗ hổng truy cập bỏ qua. Trên một email thiết lập lại pass, liên kết băm và thiết lập lại băm sẽ được gửi đến watchdog, ví dụ.
awolfey

2

Tôi nghĩ rằng mô-đun Chuyển hướng thư là hoàn hảo cho bạn :) Một cách bẩn thỉu khác là cài đặt mô-đun SMTP và đặt sai smtp;)


Có thể sử dụng mô-đun này mà vẫn có thể kiểm tra chức năng Mail không?
GoodSp33d

Có, bởi vì hệ thống gửi email đến địa chỉ email đã chọn
Arrayubiu


2

Vì vậy, bạn có thể đặt cái này trong settings.php hoặc settings.local.php nếu bạn có những cái cụ thể cho dev, staging & sản xuất.

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

Giả sử rằng bạn đang sử dụng mô-đun Mailsystem , chỉ cần truy cập admin/config/system/mailsystemvà chọn DevelMailLog.


1

Set-up của bạn SMTP để localhostvề và cài đặt MailCatcher ( GitHub ) mà bắt bất kỳ tin nhắn gửi đến nó để trưng bày trong một giao diện web.

Cài đặt

  1. gem install mailcatcher
  2. mailcatcher
  3. Định cấu hình sendmail_pathtrong PHP của bạn để:

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

    hoặc trong cấu hình Apache :

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

  5. Gửi thư qua smtp://localhost:1025

Trong Drush bạn có thể làm như sau:

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

1

nếu bạn không muốn chạm vào cấu hình Drupal, hãy thiết lập MailHog trên máy chủ của bạn để bắt tất cả các email ra khỏi ứng dụng của bạn.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.