// Divert all outgoing emails to this address to test and debug emailing features
// $CFG->divertallemailsto = 'root@localhost.local'; // NOT FOR PRODUCTION SERVERS!
//
+// Except for certain email addresses you want to let through for testing. Accepts
+// a comma separated list of regexes.
+// $CFG->divertallemailsexcept = 'tester@dev.com, fred(\+.*)?@example.com'; // NOT FOR PRODUCTION SERVERS!
+//
// Uncomment if you want to allow empty comments when modifying install.xml files.
// $CFG->xmldbdisablecommentchecking = true; // NOT FOR PRODUCTION SERVERS!
//
}
}
+/**
+ * A helper function to test for email diversion
+ *
+ * @param string $email
+ * @return bool Returns true if the email should be diverted
+ */
+function email_should_be_diverted($email) {
+ global $CFG;
+
+ if (empty($CFG->divertallemailsto)) {
+ return false;
+ }
+
+ if (empty($CFG->divertallemailsexcept)) {
+ return true;
+ }
+
+ $patterns = array_map('trim', explode(',', $CFG->divertallemailsexcept));
+ foreach ($patterns as $pattern) {
+ if (preg_match("/$pattern/", $email)) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
/**
* Send an email to a specified user
*
return true;
}
- if (!empty($CFG->divertallemailsto)) {
+ if (email_should_be_diverted($user->email)) {
$subject = "[DIVERTED {$user->email}] $subject";
$user = clone($user);
$user->email = $CFG->divertallemailsto;
$this->assertEventContextNotUsed($event);
}
+
+ public function diverted_emails_provider() {
+ return array(
+ 'nodiverts' => array(
+ 'divertallemailsto' => null,
+ 'divertallemailsexcept' => null,
+ array(
+ 'foo@example.com',
+ 'test@real.com',
+ 'fred.jones@example.com',
+ 'dev1@dev.com',
+ 'fred@example.com',
+ 'fred+verp@example.com',
+ ),
+ false,
+ ),
+ 'alldiverts' => array(
+ 'divertallemailsto' => 'somewhere@elsewhere.com',
+ 'divertallemailsexcept' => null,
+ array(
+ 'foo@example.com',
+ 'test@real.com',
+ 'fred.jones@example.com',
+ 'dev1@dev.com',
+ 'fred@example.com',
+ 'fred+verp@example.com',
+ ),
+ true,
+ ),
+ 'alsodiverts' => array(
+ 'divertallemailsto' => 'somewhere@elsewhere.com',
+ 'divertallemailsexcept' => '@dev.com, fred(\+.*)?@example.com',
+ array(
+ 'foo@example.com',
+ 'test@real.com',
+ 'fred.jones@example.com',
+ ),
+ true,
+ ),
+ 'divertsexceptions' => array(
+ 'divertallemailsto' => 'somewhere@elsewhere.com',
+ 'divertallemailsexcept' => '@dev.com, fred(\+.*)?@example.com',
+ array(
+ 'dev1@dev.com',
+ 'fred@example.com',
+ 'fred+verp@example.com',
+ ),
+ false,
+ ),
+ );
+ }
+
+ /**
+ * @dataProvider diverted_emails_provider
+ */
+ public function test_email_should_be_diverted($divertallemailsto, $divertallemailsexcept, $addresses, $expected) {
+ global $CFG;
+
+ $this->resetAfterTest();
+ $CFG->divertallemailsto = $divertallemailsto;
+ $CFG->divertallemailsexcept = $divertallemailsexcept;
+
+ foreach ($addresses as $address) {
+ $this->assertEquals($expected, email_should_be_diverted($address));
+ }
+ }
+
public function test_email_to_user() {
global $CFG;