wp_mail

Definition:
function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() {}

Send mail, similar to PHP’s mail
A true return value does not automatically mean that the user received the email successfully. It just only means that the method used was able to process the request without any errors.

Parameters

  • string|array $to: Array or comma-separated list of email addresses to send message.
  • string $subject: Email subject
  • string $message: Message contents
  • string|array $headers: Optional. Additional headers.
  • string|array $attachments: Optional. Files to attach.

Return values

returns:Whether the email contents were sent successfully.

Defined filters

  • wp_mail
    apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' )
  • wp_mail_from
    apply_filters( 'wp_mail_from' , $from_email )
  • wp_mail_from_name
    apply_filters( 'wp_mail_from_name', $from_name )
  • wp_mail_content_type
    apply_filters( 'wp_mail_content_type', $content_type )
  • wp_mail_charset
    apply_filters( 'wp_mail_charset', $charset )

Defined actions

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

Source code

function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) {

	// 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;

}

3893

No comments yet... Be the first to leave a reply!

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: