Index: src/wp-includes/class-wp-recovery-mode-email-service.php
===================================================================
--- src/wp-includes/class-wp-recovery-mode-email-service.php	(revision 45266)
+++ src/wp-includes/class-wp-recovery-mode-email-service.php	(working copy)
@@ -93,8 +93,10 @@
 	 *
 	 * @param int   $rate_limit Number of seconds before another email can be sent.
 	 * @param array $error      Error details from {@see error_get_last()}
-	 * @param array $extension  Extension that caused the error.
-	 *
+	 * @param array $extension  The extension that caused the error. {
+	 *      @type string $slug The extension slug. The plugin or theme's directory.
+	 *      @type string $type The extension type. Either 'plugin' or 'theme'.
+	 * }
 	 * @return bool Whether the email was sent successfully.
 	 */
 	private function send_recovery_mode_email( $rate_limit, $error, $extension ) {
@@ -110,29 +112,66 @@
 		}
 
 		if ( $extension ) {
-			$cause   = $this->get_cause( $extension );
-			$details = wp_strip_all_tags( wp_get_extension_error_description( $error ) );
+			$extension_name = $this->get_extension_name( $extension );
+			$details        = wp_strip_all_tags( wp_get_extension_error_description( $error ) );
 
 			if ( $details ) {
 				$header  = __( 'Error Details' );
 				$details = "\n\n" . $header . "\n" . str_pad( '', strlen( $header ), '=' ) . "\n" . $details;
 			}
+
+			if ( 'plugin' === $extension['type'] ) {
+				/* translators: %s: plugin name */
+				$cause   = sprintf( __( 'In this case, WordPress caught an error with one of your plugins: %s.' ), $extension_name );
+				$support = sprintf(
+					/* translators: 1: plugin name, 2: plugin slug */
+					__(
+						'If nothing looks broken, the author of %1$s would greatly appreciate if you could post more information about this error in the support forums. You can find the error details at the end of this email.
+
+https://wordpress.org/support/plugin/%2$s/
+
+If your site appears broken and you can\'t access your dashboard normally, WordPress now has a special "recovery mode". This lets you safely log in to your dashboard and disable the %1$s plugin.'
+					),
+					$extension_name,
+					$extension['slug']
+				);
+			} else {
+				/* translators: %s: theme name */
+				$cause   = sprintf( __( 'In this case, WordPress caught an error with your active theme: %s.' ), $extension_name );
+				$support = sprintf(
+					/* translators: 1: theme name, 2: theme slug */
+					__(
+						'If nothing looks broken, the author of %1$s would greatly appreciate if you could post more information about this error in the support forums. You can find the error details at the end of this email.
+
+https://wordpress.org/support/theme/%2$s/
+
+If your site appears broken and you can\'t access your dashboard normally, WordPress now has a special "recovery mode". This lets you safely log in to your dashboard and switch to another theme.'
+					),
+					$extension_name,
+					$extension['slug']
+				);
+			}
 		} else {
 			$cause   = '';
+			$support = __( 'If your site appears broken and you can\'t access your dashboard normally, WordPress now has a special "recovery mode". This lets you safely log in to your dashboard.' );
 			$details = '';
 		}
 
+		/* translators: Do not translate CAUSE, SITEURL, ERROR_PAGE, SUPPORT, RECOVERY_LINK, EXPIRES, DETAILS: those are placeholders. */
 		$message = __(
-			'Howdy,
+			'Howdy!
 
-Your site recently crashed and may not be working as expected.
+Since WordPress 5.2 there is a built-in feature that detects when a plugin or theme causes a fatal error on your site, and sends you this automated email.
 ###CAUSE###
-Please click the link below to initiate recovery mode and fix the problem.
+First, visit your website (###SITEURL###) and check for any visible issues. Next, visit the page where the error was caught (###ERROR_PAGE###) and check for any visible issues.
 
-This link expires in ###EXPIRES###.
+###SUPPORT###
 
-###LINK### ###DETAILS###
+###RECOVERY_LINK###
 
+To keep your site safe, this link will expire in ###EXPIRES###. Don\'t worry about that, though: a new link will be emailed to you if you click on it after it expires.
+###DETAILS###
+
 --The WordPress Team
 https://wordpress.org/
 '
@@ -139,15 +178,21 @@
 		);
 		$message = str_replace(
 			array(
-				'###LINK###',
+				'###CAUSE###',
+				'###SITEURL###',
+				'###ERROR_PAGE###',
+				'###SUPPORT###',
+				'###RECOVERY_LINK###',
 				'###EXPIRES###',
-				'###CAUSE###',
 				'###DETAILS###',
 			),
 			array(
+				$cause ? "\n{$cause}\n" : "\n",
+				home_url(),
+				home_url( $_SERVER['REQUEST_URI'] ),
+				$support,
 				$url,
 				human_time_diff( time() + $rate_limit ),
-				$cause ? "\n{$cause}\n" : "\n",
 				$details,
 			),
 			$message
@@ -201,14 +246,17 @@
 	}
 
 	/**
-	 * Gets the description indicating the possible cause for the error.
+	 * Gets the name of the extension that caused the error.
 	 *
 	 * @since 5.2.0
 	 *
-	 * @param array $extension The extension that caused the error.
-	 * @return string Message about which extension caused the error.
+	 * @param array $extension The extension that caused the error. {
+	 *      @type string $slug The extension slug. The plugin or theme's directory.
+	 *      @type string $type The extension type. Either 'plugin' or 'theme'.
+	 * }
+	 * @return string Name of extension that caused the error.
 	 */
-	private function get_cause( $extension ) {
+	private function get_extension_name( $extension ) {
 
 		if ( 'plugin' === $extension['type'] ) {
 			if ( ! function_exists( 'get_plugins' ) ) {
@@ -222,6 +270,9 @@
 			// Assume plugin main file name first since it is a common convention.
 			if ( isset( $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ] ) ) {
 				$name = $plugins[ "{$extension['slug']}/{$extension['slug']}.php" ]['Name'];
+			} elseif ( isset( $plugins[ $extension['slug'] ] ) ) {
+				// Plugin does not have a parent directory.
+				$name = $plugins[ $extension['slug'] ]['Name'];
 			} else {
 				foreach ( $plugins as $file => $plugin_data ) {
 					if ( 0 === strpos( $file, "{$extension['slug']}/" ) ) {
@@ -234,17 +285,10 @@
 			if ( empty( $name ) ) {
 				$name = $extension['slug'];
 			}
-
-			/* translators: %s: plugin name */
-			$cause = sprintf( __( 'This was caused by the following plugin: %s.' ), $name );
 		} else {
-			$theme = wp_get_theme( $extension['slug'] );
-			$name  = $theme->exists() ? $theme->display( 'Name' ) : $extension['slug'];
-
-			/* translators: %s: theme name */
-			$cause = sprintf( __( 'This was caused by the following theme: %s.' ), $name );
+			$name = $theme->exists() ? $theme->display( 'Name' ) : $extension['slug'];
 		}
 
-		return $cause;
+		return $name;
 	}
 }
