ฉันจะหยุด Drupal ไม่ให้ส่งอีเมลทุกประเภทได้อย่างไร


21

ฉันมีการตั้งค่าเวิร์กโฟลว์ dev, staging และ live เซิร์ฟเวอร์บน Pantheon เว็บไซต์ของฉันมีกฎมากมายที่ทำให้สมาชิกต้องส่งอีเมลด้วยเหตุผลหลายประการ บางครั้งฉันต้องทำงานกับสิ่งเหล่านี้บนเว็บไซต์ dev / การจัดเตรียมของฉัน แต่ฉันตระหนักว่าเนื่องจากพวกเขามีข้อมูลสดบางครั้งผู้ใช้จะได้รับอีเมลเพิ่มเติมหรือทำซ้ำเมื่อฉันทำงานกับบางสิ่ง

มีวิธีใดบ้างที่จะปิดความสามารถในการส่งอีเมลทั้งหมด (โดยอัตโนมัติเพื่อป้องกันไม่ให้ฉันลืม) บนเซิร์ฟเวอร์ dev / การจัดเตรียม เป็นการดีที่ฉันต้องการปิดการใช้งานอีเมลผ่านโมดูลที่กำหนดเองเนื่องจากฉันมีขั้นตอนในการทำให้แน่ใจว่าโมดูลที่กำหนดเองเปิดใช้งานใน dev / การแสดงละคร


2
ไม่มีคำตอบที่นี่ที่น่าพอใจ การเปลี่ยน settings.php หมายความว่าสิ่งนี้จะถูกผลักไปสู่การผลิต การติดตั้งโมดูลในการทดสอบและการพัฒนาหมายถึงว่ามันจะถูกเขียนทับเมื่อคุณโคลนจาก Live บางคนแนะนำการเปลี่ยนแปลงรหัส - อย่างจริงจัง? settings.local.php จะใช้งานได้ แต่ไม่ได้กล่าวถึง ฉันมีหนึ่งในไซต์การพัฒนาท้องถิ่น แต่ด้วยเวิร์กโฟลว์ Git สิ่งนี้ไม่เหมาะสำหรับสภาพแวดล้อมของแพนธีออนเพราะฉันต้องเปลี่ยนไปใช้ SFTP ก่อนจึงจะสามารถรับไฟล์ที่นั่นหรืออัปเดตได้ ดังนั้นผู้ใช้ที่เป็นผู้ผลิตที่บริสุทธิ์จะยังคงได้รับอีเมลจากการทดสอบเป็นครั้งคราว
cdonner

3
@cdonner ใช่อย่างจริงจัง มีหลายวิธีที่คุณสามารถแก้ไขปัญหาแบบน็อคออนที่คุณยอมจำนนซึ่งทั้งหมดตรงไปตรงมา ส่วนตัวฉันใช้git update-index --assume-unchanged sites/default/settings.phpเพื่อป้องกัน settings.php จากการถูกผลักไปรอบ ๆ สภาพแวดล้อมที่แตกต่างกัน บางคนชอบตรรกะที่มีเงื่อนไขซึ่งตรวจสอบการตั้งค่าสภาพแวดล้อมและรวมไฟล์ conf ที่แตกต่างกันตามสภาพแวดล้อม (เป็นกรอบเว็บอื่น ๆ ที่มีอยู่จริงทุกภาษา) ข้อ จำกัด เพียงอย่างเดียวที่นี่คือจินตนาการของใครคนหนึ่งมันเป็นสิ่งพื้นฐานของ PHP / git ไม่จำเป็นต้องเพิ่มคำตอบ
Clive

1
ฉันเคารพความคิดเห็นของคุณคลีฟ นี่คือปัญหาแม้ว่า หากคุณมีเว็บไซต์ขนาดใหญ่ที่มีผู้ใช้จำนวนมากสามารถได้รับอีเมลจำนวนมากจากสภาพแวดล้อมการทดสอบถ้าสมาชิกในทีมคนหนึ่งลืมที่จะทำการเรียกคอมไพล์โดยไม่ต้องคิดก่อนที่จะเช็คอินฉันเป็นคนรับผิดชอบเรื่องนี้ พึ่งพาวิธีการของคุณ
cdonner

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 ของคุณได้หรือไม่
Evan Donovan

คำตอบ:


38

คุณสามารถเพิ่มบรรทัดต่อไปนี้ลงในไฟล์ settings.php ของเว็บไซต์ของคุณ (ถ้าคุณติดตั้งโมดูล Devel ซึ่งคุณควรทำอย่างแน่นอนหากนี่เป็นเว็บไซต์ dev)

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

ซึ่งจะแทนที่ระบบเมลเริ่มต้นด้วยระบบเมลการพัฒนาของ Devel ซึ่งจะเขียนอีเมลไปยังไฟล์บันทึกแทนที่จะส่งไปยังผู้รับ โดยค่าเริ่มต้นไฟล์จะถูกเก็บไว้ในtemporary://devel-mailsแต่คุณสามารถแก้ไขได้โดยการตั้งค่าตัวแปรอื่นเช่น

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

11

เพียงแค่ทราบว่าจะเพิ่มโมดูลอื่นไปยังรายการ "มีโมดูลสำหรับที่":

เปลี่ยนเส้นทางอีเมลดักจับอีเมลขาออกทั้งหมดจากเว็บไซต์ Drupal และกำหนดเส้นทางใหม่ไปยังที่อยู่อีเมลที่กำหนดค่าไว้ล่วงหน้า

ฉันยอมรับว่าฟังก์ชันนี้สามารถนำไปใช้กับโค้ดสองสามบรรทัดได้อย่างง่ายดาย แต่เมื่อใช้โมดูลนี้คุณสามารถรับอีเมลต่อไปยังที่อยู่ที่กำหนดไว้ล่วงหน้าได้โดยมีรายละเอียดเกี่ยวกับผู้รับดั้งเดิม


3
เปลี่ยนเส้นทางอีเมลยังให้คุณใส่รหัสในไฟล์ settings.php เพื่อเปิด / ปิด / เปลี่ยนการตั้งค่าตามชื่อโฮสต์ของคุณ (หรืออะไรก็ตามถ้า () คำสั่งที่คุณต้องการใช้) เพื่อให้คุณสามารถปิดใช้งานการผลิตและเปิดโดยอัตโนมัติ เครื่องอื่น ๆ
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

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

เพื่อระบุ dir $config['devel.settings']['debug_mail_directory'] = 'temporary://my-directory';ล็อกแล้วก็
leymannx

4

ฉันมักจะใช้โมดูลReroute Emailสำหรับกรณีนี้ มันสามารถเปลี่ยนเส้นทางอีเมลทั้งหมดจาก dev ไปยังอีเมลบางอย่าง อีเมลที่ส่งยังระบุว่าควรส่งอีเมลนี้ไปที่ใด


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

นี่เป็นทางออกที่ดีกว่าคำตอบที่ยอมรับ วิธีนี้จะป้องกันไม่ให้ส่งจดหมายไปพร้อมกันแทนที่จะเปลี่ยนเส้นทางไปยังที่อยู่หลอกตาที่ยังคงต้องพยายามส่งจดหมายอีกครั้ง
ไบรอัน Jiencke

2

ดังนั้นคุณสามารถใส่มันลงใน settings.php หรือ settings.local.php ของคุณหากคุณมีอันที่เฉพาะเจาะจงสำหรับ dev, staging & production

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และติดตั้งMailCatcher ( GitHub ) ซึ่งจับข้อความใด ๆ ที่ส่งไปยังมันเพื่อแสดงในเว็บอินเตอร์เฟส

การติดตั้ง

  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 configs ให้ติดตั้งMailHogบนเซิร์ฟเวอร์ของคุณเพื่อรับอีเมลทั้งหมดที่ออกมาจากแอปพลิเคชันของคุณ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.