Gergő Tisza has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/242791

Change subject: Add UserMailerTransformContent and UserMailerSplitTo hooks
......................................................................

Add UserMailerTransformContent and UserMailerSplitTo hooks

UserMailerTransformContent allows extensions to change the body of
an email sent via UserMailer::send(). This is applied before
low-level transformations such as multipart or content encoding.

UserMailerSplitTo allows extensions to request that a certain
user should always be emailed separately (so when UserMailer::send()
is called with an array of target addresses, that user will be split
out into a separate call). This is intended for content
transformations which need to be different per user, such as
encryption.

Bug: T12453
Change-Id: I4c3a018110173c3b5d52a753fdcbec397b590ced
---
M RELEASE-NOTES-1.27
M docs/hooks.txt
M includes/mail/UserMailer.php
3 files changed, 47 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/91/242791/1

diff --git a/RELEASE-NOTES-1.27 b/RELEASE-NOTES-1.27
index bf50a47..bc53e49 100644
--- a/RELEASE-NOTES-1.27
+++ b/RELEASE-NOTES-1.27
@@ -12,6 +12,12 @@
 * Removed $wgUseLinkNamespaceDBFields
 
 === New features in 1.27 ===
+* Added a new hook, 'UserMailerTransformContent', to transform the contents
+  of an email. This is similar to the EmailUser hook but applies to all mail
+  sent via UserMailer.
+* Added a new hook, 'UserMailerSplitTo', to control which users have to be
+  emailed separately (ie. there is a single address in the To: field) so
+  user-specific changes to the email can be applied safely.
 
 ==== External libraries ====
 
diff --git a/docs/hooks.txt b/docs/hooks.txt
index 2d268b8..2840457 100644
--- a/docs/hooks.txt
+++ b/docs/hooks.txt
@@ -3292,6 +3292,17 @@
 $to: Array of MailAddress objects for the recipients
 &$returnPath: The return address string
 
+'UserMailerSplitTo': Called in UserMailer::send() to give extensions a chance
+to split up an email with multiple the To: field into separate emails.
+$to: array of MailAddress objects; unset the ones which should be mailed 
separately
+
+'UserMailerTransformContent': Called in UserMailer::send() to change email 
contents.
+Extensions can block sending the email by returning false and setting $error.
+$to: array of MailAdresses of the targets
+$from: MailAddress of the sender
+&$body: email body, either a string (for plaintext emails) or an array with 
'text' and 'html' keys
+&$error: should be set to an error message string
+
 'UserRemoveGroup': Called when removing a group; return false to override stock
 group removal.
 $user: the user object that is to have a group removed
diff --git a/includes/mail/UserMailer.php b/includes/mail/UserMailer.php
index 3c28c5f..fdd32b2 100644
--- a/includes/mail/UserMailer.php
+++ b/includes/mail/UserMailer.php
@@ -178,6 +178,36 @@
                        return Status::newFatal( 'user-mail-no-addy' );
                }
 
+               // give a chance to UserMailerTransformContents subscribers who 
need to deal with each
+               // target differently to split up the address list
+               if ( count( $to ) > 1 ) {
+                       $oldTo = $to;
+                       Hooks::run( 'UserMailerSplitTo', array( &$to ) );
+                       if ( $oldTo != $to ) {
+                               $splitTo = array_diff( $oldTo, $to );
+                               $to = array_diff( $oldTo, $splitTo ); // ignore 
new addresses added in the hook
+                               // first send to non-split address list, then 
to split addresses one by one
+                               $status = Status::newGood();
+                               if ( $to ) {
+                                       $status->merge( UserMailer::send( $to, 
$from, $subject, $body, $options ) );
+                               }
+                               foreach ( $splitTo as $newTo ) {
+                                       $status->merge( UserMailer::send( 
$newTo, $from, $subject, $body, $options ) );
+                               }
+                               return $status;
+                       }
+               }
+
+               // Allow transformation of content, such as encrypting/signing
+               $error = false;
+               if ( !Hooks::run( 'UserMailerTransformContent', array( $to, 
$from, &$body, &$error ) ) ) {
+                       if ( $error ) {
+                               return Status::newFatal( 'php-mail-error', 
$error );
+                       } else {
+                               return Status::newFatal( 
'php-mail-error-unknown' );
+                       }
+               }
+
                /**
                 * Forge email headers
                 * -------------------

-- 
To view, visit https://gerrit.wikimedia.org/r/242791
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I4c3a018110173c3b5d52a753fdcbec397b590ced
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Gergő Tisza <gti...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to