| Conditions | 29 |
| Paths | 9520 |
| Total Lines | 224 |
| Code Lines | 121 |
| Lines | 21 |
| Ratio | 9.38 % |
| Changes | 0 | ||
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
| 1 | <?php |
||
| 208 | protected static function sendInternal( |
||
| 209 | array $to, |
||
| 210 | MailAddress $from, |
||
| 211 | $subject, |
||
| 212 | $body, |
||
| 213 | $options = [] |
||
| 214 | ) { |
||
| 215 | global $wgSMTP, $wgEnotifMaxRecips, $wgAdditionalMailParams; |
||
| 216 | $mime = null; |
||
| 217 | |||
| 218 | $replyto = isset( $options['replyTo'] ) ? $options['replyTo'] : null; |
||
| 219 | $contentType = isset( $options['contentType'] ) ? |
||
| 220 | $options['contentType'] : 'text/plain; charset=UTF-8'; |
||
| 221 | $headers = isset( $options['headers'] ) ? $options['headers'] : []; |
||
| 222 | |||
| 223 | // Allow transformation of content, such as encrypting/signing |
||
| 224 | $error = false; |
||
| 225 | View Code Duplication | if ( !Hooks::run( 'UserMailerTransformContent', [ $to, $from, &$body, &$error ] ) ) { |
|
| 226 | if ( $error ) { |
||
| 227 | return Status::newFatal( 'php-mail-error', $error ); |
||
| 228 | } else { |
||
| 229 | return Status::newFatal( 'php-mail-error-unknown' ); |
||
| 230 | } |
||
| 231 | } |
||
| 232 | |||
| 233 | /** |
||
| 234 | * Forge email headers |
||
| 235 | * ------------------- |
||
| 236 | * |
||
| 237 | * WARNING |
||
| 238 | * |
||
| 239 | * DO NOT add To: or Subject: headers at this step. They need to be |
||
| 240 | * handled differently depending upon the mailer we are going to use. |
||
| 241 | * |
||
| 242 | * To: |
||
| 243 | * PHP mail() first argument is the mail receiver. The argument is |
||
| 244 | * used as a recipient destination and as a To header. |
||
| 245 | * |
||
| 246 | * PEAR mailer has a recipient argument which is only used to |
||
| 247 | * send the mail. If no To header is given, PEAR will set it to |
||
| 248 | * to 'undisclosed-recipients:'. |
||
| 249 | * |
||
| 250 | * NOTE: To: is for presentation, the actual recipient is specified |
||
| 251 | * by the mailer using the Rcpt-To: header. |
||
| 252 | * |
||
| 253 | * Subject: |
||
| 254 | * PHP mail() second argument to pass the subject, passing a Subject |
||
| 255 | * as an additional header will result in a duplicate header. |
||
| 256 | * |
||
| 257 | * PEAR mailer should be passed a Subject header. |
||
| 258 | * |
||
| 259 | * -- hashar 20120218 |
||
| 260 | */ |
||
| 261 | |||
| 262 | $headers['From'] = $from->toString(); |
||
| 263 | $returnPath = $from->address; |
||
| 264 | $extraParams = $wgAdditionalMailParams; |
||
| 265 | |||
| 266 | // Hook to generate custom VERP address for 'Return-Path' |
||
| 267 | Hooks::run( 'UserMailerChangeReturnPath', [ $to, &$returnPath ] ); |
||
| 268 | // Add the envelope sender address using the -f command line option when PHP mail() is used. |
||
| 269 | // Will default to the $from->address when the UserMailerChangeReturnPath hook fails and the |
||
| 270 | // generated VERP address when the hook runs effectively. |
||
| 271 | $extraParams .= ' -f ' . $returnPath; |
||
| 272 | |||
| 273 | $headers['Return-Path'] = $returnPath; |
||
| 274 | |||
| 275 | if ( $replyto ) { |
||
| 276 | $headers['Reply-To'] = $replyto->toString(); |
||
| 277 | } |
||
| 278 | |||
| 279 | $headers['Date'] = MWTimestamp::getLocalInstance()->format( 'r' ); |
||
| 280 | $headers['Message-ID'] = self::makeMsgId(); |
||
| 281 | $headers['X-Mailer'] = 'MediaWiki mailer'; |
||
| 282 | $headers['List-Unsubscribe'] = '<' . SpecialPage::getTitleFor( 'Preferences' ) |
||
| 283 | ->getFullURL( '', false, PROTO_CANONICAL ) . '>'; |
||
| 284 | |||
| 285 | // Line endings need to be different on Unix and Windows due to |
||
| 286 | // the bug described at https://core.trac.wordpress.org/ticket/2603 |
||
| 287 | $endl = PHP_EOL; |
||
| 288 | |||
| 289 | if ( is_array( $body ) ) { |
||
| 290 | // we are sending a multipart message |
||
| 291 | wfDebug( "Assembling multipart mime email\n" ); |
||
| 292 | if ( !stream_resolve_include_path( 'Mail/mime.php' ) ) { |
||
| 293 | wfDebug( "PEAR Mail_Mime package is not installed. Falling back to text email.\n" ); |
||
| 294 | // remove the html body for text email fall back |
||
| 295 | $body = $body['text']; |
||
| 296 | } else { |
||
| 297 | // Check if pear/mail_mime is already loaded (via composer) |
||
| 298 | if ( !class_exists( 'Mail_mime' ) ) { |
||
| 299 | require_once 'Mail/mime.php'; |
||
| 300 | } |
||
| 301 | if ( wfIsWindows() ) { |
||
| 302 | $body['text'] = str_replace( "\n", "\r\n", $body['text'] ); |
||
| 303 | $body['html'] = str_replace( "\n", "\r\n", $body['html'] ); |
||
| 304 | } |
||
| 305 | $mime = new Mail_mime( [ |
||
| 306 | 'eol' => $endl, |
||
| 307 | 'text_charset' => 'UTF-8', |
||
| 308 | 'html_charset' => 'UTF-8' |
||
| 309 | ] ); |
||
| 310 | $mime->setTXTBody( $body['text'] ); |
||
| 311 | $mime->setHTMLBody( $body['html'] ); |
||
| 312 | $body = $mime->get(); // must call get() before headers() |
||
| 313 | $headers = $mime->headers( $headers ); |
||
| 314 | } |
||
| 315 | } |
||
| 316 | if ( $mime === null ) { |
||
| 317 | // sending text only, either deliberately or as a fallback |
||
| 318 | if ( wfIsWindows() ) { |
||
| 319 | $body = str_replace( "\n", "\r\n", $body ); |
||
| 320 | } |
||
| 321 | $headers['MIME-Version'] = '1.0'; |
||
| 322 | $headers['Content-type'] = $contentType; |
||
| 323 | $headers['Content-transfer-encoding'] = '8bit'; |
||
| 324 | } |
||
| 325 | |||
| 326 | // allow transformation of MIME-encoded message |
||
| 327 | View Code Duplication | if ( !Hooks::run( 'UserMailerTransformMessage', |
|
| 328 | [ $to, $from, &$subject, &$headers, &$body, &$error ] ) |
||
| 329 | ) { |
||
| 330 | if ( $error ) { |
||
| 331 | return Status::newFatal( 'php-mail-error', $error ); |
||
| 332 | } else { |
||
| 333 | return Status::newFatal( 'php-mail-error-unknown' ); |
||
| 334 | } |
||
| 335 | } |
||
| 336 | |||
| 337 | $ret = Hooks::run( 'AlternateUserMailer', [ $headers, $to, $from, $subject, $body ] ); |
||
| 338 | if ( $ret === false ) { |
||
| 339 | // the hook implementation will return false to skip regular mail sending |
||
| 340 | return Status::newGood(); |
||
| 341 | } elseif ( $ret !== true ) { |
||
| 342 | // the hook implementation will return a string to pass an error message |
||
| 343 | return Status::newFatal( 'php-mail-error', $ret ); |
||
| 344 | } |
||
| 345 | |||
| 346 | if ( is_array( $wgSMTP ) ) { |
||
| 347 | // Check if pear/mail is already loaded (via composer) |
||
| 348 | if ( !class_exists( 'Mail' ) ) { |
||
| 349 | // PEAR MAILER |
||
| 350 | if ( !stream_resolve_include_path( 'Mail.php' ) ) { |
||
| 351 | throw new MWException( 'PEAR mail package is not installed' ); |
||
| 352 | } |
||
| 353 | require_once 'Mail.php'; |
||
| 354 | } |
||
| 355 | |||
| 356 | MediaWiki\suppressWarnings(); |
||
| 357 | |||
| 358 | // Create the mail object using the Mail::factory method |
||
| 359 | $mail_object =& Mail::factory( 'smtp', $wgSMTP ); |
||
| 360 | View Code Duplication | if ( PEAR::isError( $mail_object ) ) { |
|
| 361 | wfDebug( "PEAR::Mail factory failed: " . $mail_object->getMessage() . "\n" ); |
||
| 362 | MediaWiki\restoreWarnings(); |
||
| 363 | return Status::newFatal( 'pear-mail-error', $mail_object->getMessage() ); |
||
| 364 | } |
||
| 365 | |||
| 366 | wfDebug( "Sending mail via PEAR::Mail\n" ); |
||
| 367 | |||
| 368 | $headers['Subject'] = self::quotedPrintable( $subject ); |
||
| 369 | |||
| 370 | // When sending only to one recipient, shows it its email using To: |
||
| 371 | if ( count( $to ) == 1 ) { |
||
| 372 | $headers['To'] = $to[0]->toString(); |
||
| 373 | } |
||
| 374 | |||
| 375 | // Split jobs since SMTP servers tends to limit the maximum |
||
| 376 | // number of possible recipients. |
||
| 377 | $chunks = array_chunk( $to, $wgEnotifMaxRecips ); |
||
| 378 | foreach ( $chunks as $chunk ) { |
||
| 379 | $status = self::sendWithPear( $mail_object, $chunk, $headers, $body ); |
||
| 380 | // FIXME : some chunks might be sent while others are not! |
||
| 381 | if ( !$status->isOK() ) { |
||
| 382 | MediaWiki\restoreWarnings(); |
||
| 383 | return $status; |
||
| 384 | } |
||
| 385 | } |
||
| 386 | MediaWiki\restoreWarnings(); |
||
| 387 | return Status::newGood(); |
||
| 388 | } else { |
||
| 389 | // PHP mail() |
||
| 390 | if ( count( $to ) > 1 ) { |
||
| 391 | $headers['To'] = 'undisclosed-recipients:;'; |
||
| 392 | } |
||
| 393 | $headers = self::arrayToHeaderString( $headers, $endl ); |
||
| 394 | |||
| 395 | wfDebug( "Sending mail via internal mail() function\n" ); |
||
| 396 | |||
| 397 | self::$mErrorString = ''; |
||
| 398 | $html_errors = ini_get( 'html_errors' ); |
||
| 399 | ini_set( 'html_errors', '0' ); |
||
| 400 | set_error_handler( 'UserMailer::errorHandler' ); |
||
| 401 | |||
| 402 | try { |
||
| 403 | foreach ( $to as $recip ) { |
||
| 404 | $sent = mail( |
||
| 405 | $recip, |
||
| 406 | self::quotedPrintable( $subject ), |
||
| 407 | $body, |
||
| 408 | $headers, |
||
| 409 | $extraParams |
||
| 410 | ); |
||
| 411 | } |
||
| 412 | } catch ( Exception $e ) { |
||
| 413 | restore_error_handler(); |
||
| 414 | throw $e; |
||
| 415 | } |
||
| 416 | |||
| 417 | restore_error_handler(); |
||
| 418 | ini_set( 'html_errors', $html_errors ); |
||
| 419 | |||
| 420 | if ( self::$mErrorString ) { |
||
| 421 | wfDebug( "Error sending mail: " . self::$mErrorString . "\n" ); |
||
| 422 | return Status::newFatal( 'php-mail-error', self::$mErrorString ); |
||
| 423 | } elseif ( !$sent ) { |
||
| 424 | // mail function only tells if there's an error |
||
| 425 | wfDebug( "Unknown error sending mail\n" ); |
||
| 426 | return Status::newFatal( 'php-mail-error-unknown' ); |
||
| 427 | } else { |
||
| 428 | return Status::newGood(); |
||
| 429 | } |
||
| 430 | } |
||
| 431 | } |
||
| 432 | |||
| 502 |
This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function. It has, however, found a similar but not annotated parameter which might be a good fit.
Consider the following example. The parameter
$irelandis not defined by the methodfinale(...).The most likely cause is that the parameter was changed, but the annotation was not.