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