http://www.mediawiki.org/wiki/Special:Code/MediaWiki/81021

Revision: 81021
Author:   liangent
Date:     2011-01-26 13:46:45 +0000 (Wed, 26 Jan 2011)
Log Message:
-----------
New extension: EmailUsers

Added Paths:
-----------
    trunk/extensions/EmailUsers/EmailUsers.alias.php
    trunk/extensions/EmailUsers/EmailUsers.i18n.php
    trunk/extensions/EmailUsers/EmailUsers.php
    trunk/extensions/EmailUsers/SpecialEmailUsers.php

Added: trunk/extensions/EmailUsers/EmailUsers.alias.php
===================================================================
--- trunk/extensions/EmailUsers/EmailUsers.alias.php                            
(rev 0)
+++ trunk/extensions/EmailUsers/EmailUsers.alias.php    2011-01-26 13:46:45 UTC 
(rev 81021)
@@ -0,0 +1,11 @@
+<?php
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+    die();
+}
+
+$aliases = array();
+ 
+$aliases['en'] = array(
+    'EmailUsers' => array( 'EmailUsers' ),
+);

Added: trunk/extensions/EmailUsers/EmailUsers.i18n.php
===================================================================
--- trunk/extensions/EmailUsers/EmailUsers.i18n.php                             
(rev 0)
+++ trunk/extensions/EmailUsers/EmailUsers.i18n.php     2011-01-26 13:46:45 UTC 
(rev 81021)
@@ -0,0 +1,18 @@
+<?php
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+    die();
+}
+
+$messages = array();
+
+$messages['en'] = array(
+    'emailusers-desc' => 'Allowing users to send mails to multiple recipients',
+    
+    'emailusers' => 'E-mail users',
+    'emailusers-target-reverse' => 'Send to all users except for selected 
ones',
+    
+    'emailusers-norecipient' => 'There is no one you can send mail to.',
+    'emailusers-norecipientselected' => 'No recipient is selected.',
+    'emailusers-toomanyrecipientsselected' => 'Too many recipients are 
selected.',
+);

Added: trunk/extensions/EmailUsers/EmailUsers.php
===================================================================
--- trunk/extensions/EmailUsers/EmailUsers.php                          (rev 0)
+++ trunk/extensions/EmailUsers/EmailUsers.php  2011-01-26 13:46:45 UTC (rev 
81021)
@@ -0,0 +1,32 @@
+<?php
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+    die();
+}
+
+$wgExtensionCredits['specialpage'][] = array(
+    'path' => __FILE__,
+    'name' => 'E-mail users',
+    'author' => 'Liangent',
+    'descriptionmsg' => 'emailusers-desc',
+    'url' => 'http://www.mediawiki.org/wiki/Extension:EmailUsers',
+);
+
+$dir = dirname( __FILE__ ) . '/';
+
+$wgAutoloadClasses['SpecialEmailUsers'] = $dir . 'SpecialEmailUsers.php';
+
+$wgExtensionMessagesFiles['EmailUsers'] = $dir . 'EmailUsers.i18n.php';
+
+$wgExtensionAliasesFiles['EmailUsers'] = $dir . 'EmailUsers.alias.php';
+
+$wgSpecialPages['EmailUsers'] = 'SpecialEmailUsers';
+
+$wgSpecialPageGroups['EmailUsers'] = 'users';
+
+$wgAvailableRights[] = 'sendbatchemail';
+
+$wgGroupPermissions['sysop']['sendbatchemail'] = true;
+
+$wgEmailUsersMaxRecipients = 0;
+$wgEmailUsersUseJobQueue = true;

Added: trunk/extensions/EmailUsers/SpecialEmailUsers.php
===================================================================
--- trunk/extensions/EmailUsers/SpecialEmailUsers.php                           
(rev 0)
+++ trunk/extensions/EmailUsers/SpecialEmailUsers.php   2011-01-26 13:46:45 UTC 
(rev 81021)
@@ -0,0 +1,172 @@
+<?php
+
+if ( !defined( 'MEDIAWIKI' ) ) {
+    die();
+}
+
+class SpecialEmailUsers extends SpecialPage {
+    function __construct() {
+        parent::__construct( 'EmailUsers', 'sendbatchemail' );
+    }
+    
+    function execute( $par ) {
+        global $wgOut, $wgUser, $wgTitle, $wgEmailAuthentication;
+        
+        $this->setHeaders();
+        
+        if ( !$this->userCanExecute( $wgUser ) ) {
+            $this->displayRestrictionError();
+            return;
+        }
+        
+        $error = EmailUserForm::getPermissionsError( $wgUser, 
$wgUser->editToken() );
+        
+        if ( $error ) {
+            switch ( $error ) {
+            case 'blockedemailuser':
+                $wgOut->blockedPage();
+                return;
+            case 'actionthrottledtext':
+                $wgOut->rateLimited();
+                return;
+            case 'mailnologin':
+                $wgOut->showErrorPage( 'mailnologin', 'mailnologintext' );
+                return;
+            default:
+                list( $title, $msg, $params ) = $error;
+                $wgOut->showErrorPage( $title, $msg, $params );
+                return;
+            }
+        }
+        
+        $dbr = wfGetDB( DB_SLAVE );
+        
+        # $conds can be not that strict but cannot be too strict.
+        $conds = array( "user_email <> ''" );
+        if ( $wgEmailAuthentication ) {
+            $conds[] = 'user_email_authenticated IS NOT NULL';
+        }
+        
+        $res = $dbr->select( 'user', '*', $conds );
+        $users = UserArray::newFromResult( $res );
+        
+        $usernames = array();
+        
+        foreach ( $users as $user ) {
+            if ( $user->canReceiveEmail() && $user->getId() != 
$wgUser->getId() ) {
+                $usernames[$user->getName()] = $user->getId();
+            }
+        }
+        
+        $this->userIds = array_values( $usernames );
+        
+        if ( empty( $usernames ) ) {
+            # No one to send mail to
+            $wgOut->addWikiMsg( 'emailusers-norecipient' );
+            $wgOut->returnToMain();
+            return;
+        }
+        
+        $form = array(
+            'target' => array(
+                'type' => 'multiselect',
+                'label-message' => 'emailto',
+                'options' => $usernames,
+                'validation-callback' => array( $this, 'validateTarget' ),
+            ),
+            'target-reverse' => array(
+                'type' => 'check',
+                'default' => true,
+                'label-message' => 'emailusers-target-reverse',
+            ),
+            'subject' => array(
+                'type' => 'text',
+                'default' => wfMsg( 'defemailsubject' ),
+                'label-message' => 'emailsubject',
+            ),
+            'text' => array(
+                'type' => 'textarea',
+                'label-message' => 'emailmessage',
+            ),
+            'ccme' => array(
+                'type' => 'check',
+                'default' => $wgUser->getOption( 'ccmeonemails' ),
+                'label-message' => 'emailccme',
+            ),
+        );
+        
+        $htmlForm = new HTMLForm( $form );
+        $htmlForm->setTitle( $wgTitle );
+        $htmlForm->setSubmitCallback( array( $this, 'submit' ) );
+        
+        if ( $htmlForm->show() ) {
+            $wgOut->addWikiMsg( 'emailsenttext' );
+            $htmlForm->displayForm( false );
+        }
+    }
+    
+    function validateTarget( $value, $alldata ) {
+        global $wgEmailUsersMaxRecipients;
+        
+        if ( $alldata['target-reverse'] ) {
+            $recipients = count( $this->userIds ) - count( $value );
+        } else {
+            $recipients = count( $value );
+        }
+        
+        if ( $recipients <= 0 ) {
+            return wfMsgExt( 'emailusers-norecipientselected', 'parse' );
+        } else if ( $wgEmailUsersMaxRecipients > 0 && $recipients > 
$wgEmailUsersMaxRecipients ) {
+            return wfMsgExt( 'emailusers-toomanyrecipientsselected', 'parse' );
+        }
+        
+        return true;
+    }
+    
+    function submit( $data ) {
+        global $wgUserEmailUseReplyTo, $wgEmailUsersUseJobQueue, 
$wgPasswordSender, $wgUser;
+        
+        if ( $data['target-reverse'] ) {
+            $targets = array_diff( $this->userIds, $data['target'] );
+        } else {
+            $targets = $data['target'];
+        }
+        
+        if ( $data['ccme'] ) {
+            $targets[] = $wgUser->getId();
+        }
+        
+        $text = rtrim( $data['text'] ) . "\n\n-- \n";
+        
+        $params = array(
+            'subj' => $data['subject'],
+            'replyto' => new MailAddress( $wgUser ),
+        );
+        
+        if ( $wgUserEmailUseReplyTo ) {
+            $params['from'] = new MailAddress( $wgPasswordSender );
+        } else {
+            $params['from'] = new MailAddress( $wgUser );
+        }
+        
+        foreach ( $targets as $userId ) {
+            $user = User::newFromId( $userId );
+            
+            $params['to'] = new MailAddress( $user );
+            
+            # Or use the recipient's language instead of content?
+            $params['body'] = $text . wfMsgExt( 'emailuserfooter',
+                array( 'content', 'parsemag' ), array( $wgUser->getName(), 
$user->getName() )
+            );
+            
+            $job = new EmaillingJob( $this->getTitle(), $params );
+            if ( $wgEmailUsersUseJobQueue ) {
+                $job->insert();
+            } else {
+                $job->run();
+            }
+        }
+        
+        return true;
+    }
+}


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

Reply via email to