Changeset 1652

Show
Ignore:
Timestamp:
08/19/08 00:41:28 (3 months ago)
Author:
sambauers
Message:

Use php-mailer for bb_mail()

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/bb-includes/pluggable.php

    r1648 r1652  
    505505 
    506506if ( !function_exists( 'bb_mail' ) ) : 
     507/** 
     508 * Send mail, similar to PHP's mail 
     509 * 
     510 * A true return value does not automatically mean that the user received the 
     511 * email successfully. It just only means that the method used was able to 
     512 * process the request without any errors. 
     513 * 
     514 * Using the two 'wp_mail_from' and 'wp_mail_from_name' hooks allow from 
     515 * creating a from address like 'Name <email@address.com>' when both are set. If 
     516 * just 'wp_mail_from' is set, then just the email address will be used with no 
     517 * name. 
     518 * 
     519 * The default content type is 'text/plain' which does not allow using HTML. 
     520 * However, you can set the content type of the email by using the 
     521 * 'wp_mail_content_type' filter. 
     522 * 
     523 * The default charset is based on the charset used on the blog. The charset can 
     524 * be set using the 'wp_mail_charset' filter. 
     525 * 
     526 * @since 1.2.1 
     527 * @uses apply_filters() Calls 'wp_mail' hook on an array of all of the parameters. 
     528 * @uses apply_filters() Calls 'wp_mail_from' hook to get the from email address. 
     529 * @uses apply_filters() Calls 'wp_mail_from_name' hook to get the from address name. 
     530 * @uses apply_filters() Calls 'wp_mail_content_type' hook to get the email content type. 
     531 * @uses apply_filters() Calls 'wp_mail_charset' hook to get the email charset 
     532 * @uses do_action_ref_array() Calls 'phpmailer_init' hook on the reference to 
     533 *              phpmailer object. 
     534 * @uses PHPMailer 
     535 * @ 
     536 * 
     537 * @param string $to Email address to send message 
     538 * @param string $subject Email subject 
     539 * @param string $message Message contents 
     540 * @param string|array $headers Optional. Additional headers. 
     541 * @return bool Whether the email contents were sent successfully. 
     542 */ 
    507543function bb_mail( $to, $subject, $message, $headers = '' ) { 
    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; 
    534700} 
    535701endif;