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
$ireland
is not defined by the methodfinale(...)
.The most likely cause is that the parameter was changed, but the annotation was not.