diff --git src/wp-login.php src/wp-login.php
index 5266dd7..bf38c36 100644
--- src/wp-login.php
+++ src/wp-login.php
@@ -320,33 +320,41 @@ function retrieve_password() {
 		return $errors;
 	}
 
-	// Redefining user_login ensures we return the right case in the email.
-	$user_login = $user_data->user_login;
-	$user_email = $user_data->user_email;
 	$key = get_password_reset_key( $user_data );
 
 	if ( is_wp_error( $key ) ) {
 		return $key;
 	}
 
-	$message = __('Someone has requested a password reset for the following account:') . "\r\n\r\n";
-	$message .= network_home_url( '/' ) . "\r\n\r\n";
-	$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
-	$message .= __('If this was a mistake, just ignore this email and nothing will happen.') . "\r\n\r\n";
-	$message .= __('To reset your password, visit the following address:') . "\r\n\r\n";
-	$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . ">\r\n";
+	do_action( 'wp_mail_retrieve_password', $user_data, $key );
+	return true;
 
-	if ( is_multisite() ) {
-		$blogname = get_current_site()->site_name;
-	} else {
+}
+
+add_action( 'wp_mail_retrieve_password', 'send_retrieve_password_email', 10, 2 );
+
+function send_retrieve_password_email( $user_data, $key ) {
+
+	$user_login = $user_data->user_login;
+	$user_email = $user_data->user_email;
+
+	$message  = __('Someone has requested a password reset for the following account:') . "\r\n\r\n";
+	$message .= network_home_url( '/' ) . "\r\n\r\n";
+	$message .= sprintf( __( 'Username: %s' ), $user_login ) . "\r\n\r\n";
+	$message .= __( 'If this was a mistake, just ignore this email and nothing will happen.' ) . "\r\n\r\n";
+	$message .= __( 'To reset your password, visit the following address:') . "\r\n\r\n";
+	$message .= '<' . network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . ">\r\n";
+
+	if ( is_multisite() )
+		$blogname = $GLOBALS['current_site']->site_name;
+	else
 		/*
 		 * The blogname option is escaped with esc_html on the way into the database
 		 * in sanitize_option we want to reverse this for the plain text arena of emails.
 		 */
-		$blogname = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
-	}
+		$blogname = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
 
-	$title = sprintf( __('[%s] Password Reset'), $blogname );
+	$title = sprintf( __( '[%s] Password Reset' ), $blogname );
 
 	/**
 	 * Filters the subject of the password reset email.
@@ -376,7 +384,6 @@ function retrieve_password() {
 	if ( $message && !wp_mail( $user_email, wp_specialchars_decode( $title ), $message ) )
 		wp_die( __('The email could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function.') );
 
-	return true;
 }
 
 //
