Index: wp-admin/includes/upgrade.php
===================================================================
--- wp-admin/includes/upgrade.php	(revision 23362)
+++ wp-admin/includes/upgrade.php	(working copy)
@@ -276,7 +276,7 @@
 http://wordpress.org/
 "), $blog_url, $name, $password);
 
-	@wp_mail($email, __('New WordPress Site'), $message);
+	wp_mail( $email, __( 'New WordPress Site' ), $message );
 }
 endif;
 
Index: wp-includes/pluggable.php
===================================================================
--- wp-includes/pluggable.php	(revision 23362)
+++ wp-includes/pluggable.php	(working copy)
@@ -209,9 +209,12 @@
  * @param string $message Message contents
  * @param string|array $headers Optional. Additional headers.
  * @param string|array $attachments Optional. Files to attach.
- * @return bool Whether the email contents were sent successfully.
+ * @param string $return Optional. 'bool' to return boolean false on error, 'wp_error' to return a WP_Error object. Defaults to 'bool'
+ * @return bool|WP_Error Boolean true if the email was sent successfully. Boolean false or WP_Error if sending failed. WP_Error if email was sent, but with errors.
  */
-function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() ) {
+function wp_mail( $to, $subject, $message, $headers = '', $attachments = array(), $return = 'bool' ) {
+	$errors = new WP_Error();
+	
 	// Compact the input, apply the filters, and extract them back out
 	extract( apply_filters( 'wp_mail', compact( 'to', 'subject', 'message', 'headers', 'attachments' ) ) );
 
@@ -356,6 +359,7 @@
 			}
 			$phpmailer->AddAddress( $recipient, $recipient_name);
 		} catch ( phpmailerException $e ) {
+			$errors->add( 'mailer_add_address', $e->getMessage() );
 			continue;
 		}
 	}
@@ -378,6 +382,7 @@
 				}
 				$phpmailer->AddCc( $recipient, $recipient_name );
 			} catch ( phpmailerException $e ) {
+				$errors->add( 'mailer_add_cc', $e->getMessage() );
 				continue;
 			}
 		}
@@ -396,6 +401,7 @@
 				}
 				$phpmailer->AddBcc( $recipient, $recipient_name );
 			} catch ( phpmailerException $e ) {
+				$errors->add( 'mailer_add_bcc', $e->getMessage() );
 				continue;
 			}
 		}
@@ -439,6 +445,7 @@
 			try {
 				$phpmailer->AddAttachment($attachment);
 			} catch ( phpmailerException $e ) {
+				$errors->add( 'mailer_add_attachment', $e->getMessage() );
 				continue;
 			}
 		}
@@ -450,10 +457,18 @@
 	try {
 		$phpmailer->Send();
 	} catch ( phpmailerException $e ) {
-		return false;
+		$errors->add( 'mailer_send', $e->getMessage() );
+		
+		if ( 'wp_error' == $return )
+			return $errors;
+		else
+			return false;
 	}
 
-	return true;
+	if ( 'wp_error' == $return && count( $errors->get_error_codes() > 0 ) )
+		return $errors;
+	else
+		return true;
 }
 endif;
 
@@ -1075,7 +1090,7 @@
 	$subject = apply_filters('comment_notification_subject', $subject, $comment_id);
 	$message_headers = apply_filters('comment_notification_headers', $message_headers, $comment_id);
 
-	@wp_mail( $author->user_email, $subject, $notify_message, $message_headers );
+	wp_mail( $author->user_email, $subject, $notify_message, $message_headers );
 
 	return true;
 }
@@ -1158,7 +1173,7 @@
 	$message_headers = apply_filters('comment_moderation_headers', $message_headers);
 
 	foreach ( $email_to as $email )
-		@wp_mail($email, $subject, $notify_message, $message_headers);
+		wp_mail( $email, $subject, $notify_message, $message_headers );
 
 	return true;
 }
@@ -1208,7 +1223,7 @@
 	$message .= sprintf(__('Username: %s'), $user_login) . "\r\n\r\n";
 	$message .= sprintf(__('E-mail: %s'), $user_email) . "\r\n";
 
-	@wp_mail(get_option('admin_email'), sprintf(__('[%s] New User Registration'), $blogname), $message);
+	wp_mail( get_option( 'admin_email' ), sprintf( __( '[%s] New User Registration' ), $blogname ), $message );
 
 	if ( empty($plaintext_pass) )
 		return;
Index: wp-login.php
===================================================================
--- wp-login.php	(revision 23362)
+++ wp-login.php	(working copy)
@@ -247,8 +247,19 @@
 	$title = apply_filters('retrieve_password_title', $title);
 	$message = apply_filters('retrieve_password_message', $message, $key);
 
-	if ( $message && !wp_mail($user_email, $title, $message) )
-		wp_die( __('The e-mail could not be sent.') . "<br />\n" . __('Possible reason: your host may have disabled the mail() function...') );
+	if ( $message ) {
+		$mail_status = wp_mail( $user_email, $title, $message, '', array(), 'wp_error' );
+		
+		// mailer_send indicates the messages wasn't sent. Other error codes indicate the message was sent even though errors occurred. 
+		if ( is_wp_error( $mail_status ) && in_array( 'mailer_send', $mail_status->get_error_codes() ) ) {
+			$mail_error_messages = implode( ". ", $mail_status->get_error_messages() );
+			wp_die( __( 'The e-mail could not be sent.' ) . "<br />\n" . sprintf( __( '<strong>ERROR</strong>: %s' ), $mail_error_messages ) );
+		}
+	}
+	else {
+		$errors->add( 'message_empty', __( '<strong>ERROR</strong>: Message was empty.' ) );
+		return $errors;
+	}
 
 	return true;
 }
