| 508 | | if (!is_array($headers)) { |
|---|
| 509 | | $headers = trim($headers); |
|---|
| 510 | | $headers = preg_split('@\r(?:\n{0,1})|\n@', $headers, -1, PREG_SPLIT_NO_EMPTY); |
|---|
| 511 | | } |
|---|
| 512 | | |
|---|
| 513 | | if (!count($headers) || !count(preg_grep('/^mime-version:\s/im', $headers))) |
|---|
| 514 | | $headers[] = "MIME-Version: 1.0"; |
|---|
| 515 | | |
|---|
| 516 | | if (!count(preg_grep('/^content-type:\s/im', $headers))) |
|---|
| 517 | | $headers[] = "Content-Type: text/plain; Charset=UTF-8"; |
|---|
| 518 | | |
|---|
| 519 | | if (!count(preg_grep('/^content-transfer-encoding:\s/im', $headers))) |
|---|
| 520 | | $headers[] = "Content-Transfer-Encoding: 8bit"; |
|---|
| 521 | | |
|---|
| 522 | | if (!count(preg_grep('/^from:\s/im', $headers))) { |
|---|
| 523 | | if (!$from = bb_get_option('from_email')) |
|---|
| 524 | | if ($uri_parsed = parse_url(bb_get_uri())) |
|---|
| 525 | | if ($uri_parsed['host']) |
|---|
| 526 | | $from = 'bbpress@' . trim(preg_replace('/^www./i', '', $uri_parsed['host'])); |
|---|
| 527 | | |
|---|
| 528 | | if ($from) |
|---|
| 529 | | $headers[] = 'From: "' . bb_get_option('name') . '" <' . $from . '>'; |
|---|
| 530 | | } |
|---|
| 531 | | $headers = trim(join(defined('BB_MAIL_EOL') ? BB_MAIL_EOL : "\n", $headers)); |
|---|
| 532 | | |
|---|
| 533 | | return @mail($to, $subject, $message, $headers); |
|---|
| | 544 | // Compact the input, apply the filters, and extract them back out |
|---|
| | 545 | extract( apply_filters( 'bb_mail', compact( 'to', 'subject', 'message', 'headers' ) ) ); |
|---|
| | 546 | |
|---|
| | 547 | global $phpmailer; |
|---|
| | 548 | |
|---|
| | 549 | // (Re)create it, if it's gone missing |
|---|
| | 550 | if ( !is_object( $phpmailer ) || !is_a( $phpmailer, 'PHPMailer' ) ) { |
|---|
| | 551 | require_once BACKPRESS_PATH . 'class.mailer.php'; |
|---|
| | 552 | require_once BACKPRESS_PATH . 'class.mailer-smtp.php'; |
|---|
| | 553 | $phpmailer = new PHPMailer(); |
|---|
| | 554 | } |
|---|
| | 555 | |
|---|
| | 556 | // Headers |
|---|
| | 557 | if ( empty( $headers ) ) { |
|---|
| | 558 | $headers = array(); |
|---|
| | 559 | } elseif ( !is_array( $headers ) ) { |
|---|
| | 560 | // Explode the headers out, so this function can take both |
|---|
| | 561 | // string headers and an array of headers. |
|---|
| | 562 | $tempheaders = (array) explode( "\n", $headers ); |
|---|
| | 563 | $headers = array(); |
|---|
| | 564 | |
|---|
| | 565 | // If it's actually got contents |
|---|
| | 566 | if ( !empty( $tempheaders ) ) { |
|---|
| | 567 | // Iterate through the raw headers |
|---|
| | 568 | foreach ( (array) $tempheaders as $header ) { |
|---|
| | 569 | if ( strpos($header, ':') === false ) |
|---|
| | 570 | continue; |
|---|
| | 571 | // Explode them out |
|---|
| | 572 | list( $name, $content ) = explode( ':', trim( $header ), 2 ); |
|---|
| | 573 | |
|---|
| | 574 | // Cleanup crew |
|---|
| | 575 | $name = trim( $name ); |
|---|
| | 576 | $content = trim( $content ); |
|---|
| | 577 | |
|---|
| | 578 | // Mainly for legacy -- process a From: header if it's there |
|---|
| | 579 | if ( 'from' == strtolower($name) ) { |
|---|
| | 580 | if ( strpos($content, '<' ) !== false ) { |
|---|
| | 581 | // So... making my life hard again? |
|---|
| | 582 | $from_name = substr( $content, 0, strpos( $content, '<' ) - 1 ); |
|---|
| | 583 | $from_name = str_replace( '"', '', $from_name ); |
|---|
| | 584 | $from_name = trim( $from_name ); |
|---|
| | 585 | |
|---|
| | 586 | $from_email = substr( $content, strpos( $content, '<' ) + 1 ); |
|---|
| | 587 | $from_email = str_replace( '>', '', $from_email ); |
|---|
| | 588 | $from_email = trim( $from_email ); |
|---|
| | 589 | } else { |
|---|
| | 590 | $from_name = trim( $content ); |
|---|
| | 591 | } |
|---|
| | 592 | } elseif ( 'content-type' == strtolower($name) ) { |
|---|
| | 593 | if ( strpos( $content,';' ) !== false ) { |
|---|
| | 594 | list( $type, $charset ) = explode( ';', $content ); |
|---|
| | 595 | $content_type = trim( $type ); |
|---|
| | 596 | $charset = trim( str_replace( array( 'charset=', '"' ), '', $charset ) ); |
|---|
| | 597 | } else { |
|---|
| | 598 | $content_type = trim( $content ); |
|---|
| | 599 | } |
|---|
| | 600 | } elseif ( 'cc' == strtolower($name) ) { |
|---|
| | 601 | $cc = explode(",", $content); |
|---|
| | 602 | } elseif ( 'bcc' == strtolower($name) ) { |
|---|
| | 603 | $bcc = explode(",", $content); |
|---|
| | 604 | } else { |
|---|
| | 605 | // Add it to our grand headers array |
|---|
| | 606 | $headers[trim( $name )] = trim( $content ); |
|---|
| | 607 | } |
|---|
| | 608 | } |
|---|
| | 609 | } |
|---|
| | 610 | } |
|---|
| | 611 | |
|---|
| | 612 | // Empty out the values that may be set |
|---|
| | 613 | $phpmailer->ClearAddresses(); |
|---|
| | 614 | $phpmailer->ClearAllRecipients(); |
|---|
| | 615 | $phpmailer->ClearAttachments(); |
|---|
| | 616 | $phpmailer->ClearBCCs(); |
|---|
| | 617 | $phpmailer->ClearCCs(); |
|---|
| | 618 | $phpmailer->ClearCustomHeaders(); |
|---|
| | 619 | $phpmailer->ClearReplyTos(); |
|---|
| | 620 | |
|---|
| | 621 | // From email and name |
|---|
| | 622 | // If we don't have a name from the input headers |
|---|
| | 623 | if ( !isset( $from_name ) ) { |
|---|
| | 624 | $from_name = bb_get_option('name'); |
|---|
| | 625 | } |
|---|
| | 626 | |
|---|
| | 627 | // If we don't have an email from the input headers |
|---|
| | 628 | if ( !isset( $from_email ) ) { |
|---|
| | 629 | // Get the site domain and get rid of www. |
|---|
| | 630 | $sitename = strtolower( $_SERVER['SERVER_NAME'] ); |
|---|
| | 631 | if ( substr( $sitename, 0, 4 ) == 'www.' ) { |
|---|
| | 632 | $sitename = substr( $sitename, 4 ); |
|---|
| | 633 | } |
|---|
| | 634 | |
|---|
| | 635 | $from_email = 'bbpress@' . $sitename; |
|---|
| | 636 | } |
|---|
| | 637 | |
|---|
| | 638 | // Set the from name and email |
|---|
| | 639 | $phpmailer->From = apply_filters( 'bb_mail_from', $from_email ); |
|---|
| | 640 | $phpmailer->FromName = apply_filters( 'bb_mail_from_name', $from_name ); |
|---|
| | 641 | |
|---|
| | 642 | // Set destination address |
|---|
| | 643 | $phpmailer->AddAddress( $to ); |
|---|
| | 644 | |
|---|
| | 645 | // Set mail's subject and body |
|---|
| | 646 | $phpmailer->Subject = $subject; |
|---|
| | 647 | $phpmailer->Body = $message; |
|---|
| | 648 | |
|---|
| | 649 | // Add any CC and BCC recipients |
|---|
| | 650 | if ( !empty($cc) ) { |
|---|
| | 651 | foreach ( (array) $cc as $recipient ) { |
|---|
| | 652 | $phpmailer->AddCc( trim($recipient) ); |
|---|
| | 653 | } |
|---|
| | 654 | } |
|---|
| | 655 | if ( !empty($bcc) ) { |
|---|
| | 656 | foreach ( (array) $bcc as $recipient) { |
|---|
| | 657 | $phpmailer->AddBcc( trim($recipient) ); |
|---|
| | 658 | } |
|---|
| | 659 | } |
|---|
| | 660 | |
|---|
| | 661 | // Set to use PHP's mail() |
|---|
| | 662 | $phpmailer->IsMail(); |
|---|
| | 663 | |
|---|
| | 664 | // Set Content-Type and charset |
|---|
| | 665 | // If we don't have a content-type from the input headers |
|---|
| | 666 | if ( !isset( $content_type ) ) { |
|---|
| | 667 | $content_type = 'text/plain'; |
|---|
| | 668 | } |
|---|
| | 669 | |
|---|
| | 670 | $content_type = apply_filters( 'bb_mail_content_type', $content_type ); |
|---|
| | 671 | |
|---|
| | 672 | // Set whether it's plaintext or not, depending on $content_type |
|---|
| | 673 | if ( $content_type == 'text/html' ) { |
|---|
| | 674 | $phpmailer->IsHTML( true ); |
|---|
| | 675 | } else { |
|---|
| | 676 | $phpmailer->IsHTML( false ); |
|---|
| | 677 | } |
|---|
| | 678 | |
|---|
| | 679 | // If we don't have a charset from the input headers |
|---|
| | 680 | if ( !isset( $charset ) ) { |
|---|
| | 681 | $charset = bb_get_option( 'charset' ); |
|---|
| | 682 | } |
|---|
| | 683 | |
|---|
| | 684 | // Set the content-type and charset |
|---|
| | 685 | $phpmailer->CharSet = apply_filters( 'bb_mail_charset', $charset ); |
|---|
| | 686 | |
|---|
| | 687 | // Set custom headers |
|---|
| | 688 | if ( !empty( $headers ) ) { |
|---|
| | 689 | foreach( (array) $headers as $name => $content ) { |
|---|
| | 690 | $phpmailer->AddCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) ); |
|---|
| | 691 | } |
|---|
| | 692 | } |
|---|
| | 693 | |
|---|
| | 694 | do_action_ref_array( 'bb_phpmailer_init', array( &$phpmailer ) ); |
|---|
| | 695 | |
|---|
| | 696 | // Send! |
|---|
| | 697 | $result = @$phpmailer->Send(); |
|---|
| | 698 | |
|---|
| | 699 | return $result; |
|---|