<?php
	// Compact the input, apply the filters, and extract them back out
	extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) ) );

if ( ! is_array( $attachments ) ) {
	$attachments = explode( "\n", str_replace( "\r\n", "\n", $attachments ) );
}

	global $phpmailer;

	// (Re)create it, if it's gone missing
if ( ! is_object( $phpmailer ) || ! is_a( $phpmailer, 'PHPMailer' ) ) {
	require_once ABSPATH . WPINC . '/class-phpmailer.php';
	require_once ABSPATH . WPINC . '/class-smtp.php';
	$phpmailer = new PHPMailer( true );
}

	// Headers
if ( empty( $headers ) ) {
	$headers = array();
} else {
	if ( ! is_array( $headers ) ) {
		// Explode the headers out, so this function can take both
		// string headers and an array of headers.
		$tempheaders = explode( "\n", str_replace( "\r\n", "\n", $headers ) );
	} else {
		$tempheaders = $headers;
	}
	$headers = array();
	$cc = array();
	$bcc = array();

			// If it's actually got contents
	if ( ! empty( $tempheaders ) ) {
		// Iterate through the raw headers
		foreach ( (array) $tempheaders as $header ) {
			if ( strpos( $header, ':' ) === false ) {
				if ( false !== stripos( $header, 'boundary=' ) ) {
					$parts = preg_split( '/boundary=/i', trim( $header ) );
					$boundary = trim( str_replace( array( "'", '"' ), '', $parts[1] ) );
				}
				continue;
			}
			// Explode them out
			list( $name, $content ) = explode( ':', trim( $header ), 2 );

			// Cleanup crew
			$name    = trim( $name );
			$content = trim( $content );

			switch ( strtolower( $name ) ) {
				// Mainly for legacy -- process a From: header if it's there
				case 'from':
					if ( strpos( $content, '<' ) !== false ) {
						// So... making my life hard again?
						$from_name = substr( $content, 0, strpos( $content, '<' ) - 1 );
						$from_name = str_replace( '"', '', $from_name );
						$from_name = trim( $from_name );

						$from_email = substr( $content, strpos( $content, '<' ) + 1 );
						$from_email = str_replace( '>', '', $from_email );
						$from_email = trim( $from_email );
					} else {
						$from_email = trim( $content );
					}
					break;
				case 'content-type':
					if ( strpos( $content, ';' ) !== false ) {
						list( $type, $charset ) = explode( ';', $content );
						$content_type = trim( $type );
						if ( false !== stripos( $charset, 'charset=' ) ) {
							$charset = trim( str_replace( array( 'charset=', '"' ), '', $charset ) );
						} elseif ( false !== stripos( $charset, 'boundary=' ) ) {
							$boundary = trim( str_replace( array( 'BOUNDARY=', 'boundary=', '"' ), '', $charset ) );
							$charset = '';
						}
					} else {
						$content_type = trim( $content );
					}
					break;
				case 'cc':
					$cc = array_merge( (array) $cc, explode( ',', $content ) );
					break;
				case 'bcc':
					$bcc = array_merge( (array) $bcc, explode( ',', $content ) );
					break;
				default:
					// Add it to our grand headers array
					$headers[ trim( $name ) ] = trim( $content );
					break;
			}
		}
	}
}

	// Empty out the values that may be set
	$phpmailer->ClearAddresses();
	$phpmailer->ClearAllRecipients();
	$phpmailer->ClearAttachments();
	$phpmailer->ClearBCCs();/* $phpmailer->ClearCCs();	$phpmailer->ClearCustomHeaders(); 	$phpmailer->ClearReplyTos(); */

	// From email and name
	// If we don't have a name from the input headers
if ( ! isset( $from_name ) ) {
	$from_name = 'WordPress';
}

	/*
	 If we don't have an email from the input headers default to wordpress@$sitename
	 * Some hosts will block outgoing mail from this address if it doesn't exist but
	 * there's no easy alternative. Defaulting to admin_email might appear to be another
	 * option but some hosts may refuse to relay mail from an unknown domain. See
	 * http://trac.wordpress.org/ticket/5007.
	 */

if ( ! isset( $from_email ) ) {
	// Get the site domain and get rid of www.
	$sitename = strtolower( $_SERVER['SERVER_NAME'] );
	if ( substr( $sitename, 0, 4 ) == 'www.' ) {
		$sitename = substr( $sitename, 4 );
	}

	$from_email = 'wordpress@' . $sitename;
}

	// Plugin authors can override the potentially troublesome default
	$phpmailer->From     = apply_filters( 'wp_mail_from'     , $from_email );
	$phpmailer->FromName = apply_filters( 'wp_mail_from_name', $from_name );

	// Set destination addresses
if ( ! is_array( $to ) ) {
	$to = explode( ',', $to );
}

foreach ( (array) $to as $recipient ) {
	try {
		// Break $recipient into name and address parts if in the format "Foo <bar@baz.com>"
		$recipient_name = '';
		if ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) {
			if ( count( $matches ) == 3 ) {
				$recipient_name = $matches[1];
				$recipient = $matches[2];
			}
		}
		$phpmailer->AddAddress( $recipient, $recipient_name );
	} catch ( phpmailerException $e ) {
		continue;
	}
}

	// Set mail's subject and body
	$phpmailer->Subject = $subject;
	$phpmailer->Body    = $message;

	// Add any CC and BCC recipients
if ( ! empty( $cc ) ) {
	foreach ( (array) $cc as $recipient ) {
		try {
			// Break $recipient into name and address parts if in the format "Foo <bar@baz.com>"
			$recipient_name = '';
			if ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) {
				if ( count( $matches ) == 3 ) {
					$recipient_name = $matches[1];
					$recipient = $matches[2];
				}
			}
			$phpmailer->AddCc( $recipient, $recipient_name );
		} catch ( phpmailerException $e ) {
			continue;
		}
	}
}

if ( ! empty( $bcc ) ) {
	foreach ( (array) $bcc as $recipient ) {
		try {
			// Break $recipient into name and address parts if in the format "Foo <bar@baz.com>"
			$recipient_name = '';
			if ( preg_match( '/(.*)<(.+)>/', $recipient, $matches ) ) {
				if ( count( $matches ) == 3 ) {
					$recipient_name = $matches[1];
					$recipient = $matches[2];
				}
			}
			$phpmailer->AddBcc( $recipient, $recipient_name );
		} catch ( phpmailerException $e ) {
			continue;
		}
	}
}

	// Set to use PHP's mail()
	$phpmailer->IsMail();

	// Set Content-Type and charset
	// If we don't have a content-type from the input headers
if ( ! isset( $content_type ) ) {
	$content_type = 'text/plain';
}

	$content_type = apply_filters( 'wp_mail_content_type', $content_type );

	$phpmailer->ContentType = $content_type;

	// Set whether it's plaintext, depending on $content_type
if ( 'text/html' == $content_type ) {
	$phpmailer->IsHTML( true );
}

	// If we don't have a charset from the input headers
if ( ! isset( $charset ) ) {
	$charset = get_bloginfo( 'charset' );
}

	// Set the content-type and charset
	$phpmailer->CharSet = apply_filters( 'wp_mail_charset', $charset );

	// Set custom headers
if ( ! empty( $headers ) ) {
	foreach ( (array) $headers as $name => $content ) {
		$phpmailer->AddCustomHeader( sprintf( '%1$s: %2$s', $name, $content ) );
	}

	if ( false !== stripos( $content_type, 'multipart' ) && ! empty( $boundary ) ) {
		$phpmailer->AddCustomHeader( sprintf( "Content-Type: %s;\n\t boundary=\"%s\"", $content_type, $boundary ) );
	}
}

if ( ! empty( $attachments ) ) {
	foreach ( $attachments as $attachment ) {
		try {
			$phpmailer->AddAttachment( $attachment );
		} catch ( phpmailerException $e ) {
			continue;
		}
	}
}

	do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );

	// Send!
try {
	$phpmailer->Send();
} catch ( phpmailerException $e ) {
	return false;
}

	return true;

