Index: src/wp-admin/includes/admin-filters.php
===================================================================
--- src/wp-admin/includes/admin-filters.php	(revision 44929)
+++ src/wp-admin/includes/admin-filters.php	(working copy)
@@ -133,7 +133,7 @@
 // Privacy hooks
 add_filter( 'wp_privacy_personal_data_erasure_page', 'wp_privacy_process_personal_data_erasure_page', 10, 5 );
 add_filter( 'wp_privacy_personal_data_export_page', 'wp_privacy_process_personal_data_export_page', 10, 7 );
-add_action( 'wp_privacy_personal_data_export_file', 'wp_privacy_generate_personal_data_export_file', 10 );
+add_action( 'wp_privacy_personal_data_export_file', 'wp_privacy_generate_personal_data_export_file', 10, 3 );
 add_action( 'wp_privacy_personal_data_erased', '_wp_privacy_send_erasure_fulfillment_notification', 10 );
 
 // Privacy policy text changes check.
Index: src/wp-admin/includes/file.php
===================================================================
--- src/wp-admin/includes/file.php	(revision 44929)
+++ src/wp-admin/includes/file.php	(working copy)
@@ -1992,7 +1992,7 @@
  *
  * @param int $request_id The export request ID.
  */
-function wp_privacy_generate_personal_data_export_file( $request_id ) {
+function wp_privacy_generate_personal_data_export_file( $request_id, $request, $has_export_data ) {
 	if ( ! class_exists( 'ZipArchive' ) ) {
 		wp_send_json_error( __( 'Unable to generate export file. ZipArchive not available.' ) );
 	}
@@ -2108,6 +2108,10 @@
 		fwrite( $file, wp_privacy_generate_personal_data_export_group_html( $group_data ) );
 	}
 
+	if ( ! $has_export_data ) {
+		fwrite( $file, '<strong>' . esc_html__( 'No personal data found.' ) . '</strong>' );
+	}
+
 	fwrite( $file, "</body>\n" );
 
 	// Close HTML.
@@ -2174,12 +2178,18 @@
 /**
  * Send an email to the user with a link to the personal data export file
  *
+ * The link to the export file is only included in the email content when there
+ * is personal data to export.
+ *
  * @since 4.9.6
+ * @since 5.2 Added the $has_export_data parameter.
  *
- * @param int $request_id The request ID for this personal data export.
+ * @param int  $request_id      The request ID for this personal data export.
+ * @param bool $has_export_data Whether personal data exists to export.
+ *
  * @return true|WP_Error True on success or `WP_Error` on failure.
  */
-function wp_privacy_send_personal_data_export_email( $request_id ) {
+function wp_privacy_send_personal_data_export_email( $request_id, $has_export_data = true ) {
 	// Get the request data.
 	$request = wp_get_user_request_data( $request_id );
 
@@ -2192,8 +2202,8 @@
 	$expiration_date = date_i18n( get_option( 'date_format' ), time() + $expiration );
 
 	/* translators: Do not translate EXPIRATION, LINK, SITENAME, SITEURL: those are placeholders. */
-	$email_text = __(
-		'Howdy,
+	if ( $has_export_data ) {
+		$email_text = __( 'Howdy,
 
 Your request for an export of personal data has been completed. You may
 download your personal data by clicking on the link below. For privacy
@@ -2204,25 +2214,59 @@
 
 Regards,
 All at ###SITENAME###
-###SITEURL###'
-	);
+###SITEURL###' );
 
-	/**
-	 * Filters the text of the email sent with a personal data export file.
-	 *
-	 * The following strings have a special meaning and will get replaced dynamically:
-	 * ###EXPIRATION###         The date when the URL will be automatically deleted.
-	 * ###LINK###               URL of the personal data export file for the user.
-	 * ###SITENAME###           The name of the site.
-	 * ###SITEURL###            The URL to the site.
-	 *
-	 * @since 4.9.6
-	 *
-	 * @param string $email_text     Text in the email.
-	 * @param int    $request_id     The request ID for this personal data export.
-	 */
-	$content = apply_filters( 'wp_privacy_personal_data_email_content', $email_text, $request_id );
+		/**
+		 * Filters the text of the email sent with a personal data export file.
+		 *
+		 * The following strings have a special meaning and will get replaced dynamically:
+		 * ###EXPIRATION###         The date when the URL will be automatically deleted.
+		 * ###LINK###               URL of the personal data export file for the user.
+		 * ###SITENAME###           The name of the site.
+		 * ###SITEURL###            The URL to the site.
+		 *
+		 * @since 4.9.6
+		 * @since 5.2 $has_export_data argument added.
+		 *
+		 * @param string $email_text      Text in the email.
+		 * @param int    $request_id      The request ID for this personal data export.
+		 * @param bool   $has_export_data Whether personal data exists to export.
+		 */
+		$content = apply_filters( 'wp_privacy_personal_data_email_content', $email_text, $request_id, $has_export_data );
+	} else {
+		/* translators: Do not translate EXPIRATION, LINK, SITENAME, SITEURL: those are placeholders. */
+		$email_text = __( 'Howdy,
+Your request for an export of personal data has been completed.
 
+###SITENAME### has identified no personal data associated with this email address.
+
+You may download your personal data by clicking on the link below. For privacy
+and security, we will automatically delete the file on ###EXPIRATION###,
+so please download it before then.
+
+###LINK###
+
+Regards,
+All at ###SITENAME###
+###SITEURL###' );
+
+		/**
+		 * Filters the text of the email sent when no personal data exists to export.
+		 *
+		 * The following strings have a special meaning and will get replaced dynamically:
+		 * ###EXPIRATION###         The date when the URL will be automatically deleted.
+		 * ###SITENAME###           The name of the site.
+		 * ###SITEURL###            The URL to the site.
+		 *
+		 * @since 5.2
+		 *
+		 * @param string $email_text      Text in the email.
+		 * @param int    $request_id      The request ID for this personal data export.
+		 * @param bool   $has_export_data Whether personal data exists to export.
+		 */
+		$content = apply_filters( 'wp_privacy_personal_data_email_content_no_data', $email_text, $request_id, $has_export_data );
+	}
+
 	$email_address   = $request->email;
 	$export_file_url = get_post_meta( $request_id, '_export_file_url', true );
 	$site_name       = wp_specialchars_decode( get_option( 'blogname' ), ENT_QUOTES );
@@ -2230,7 +2274,6 @@
 
 	$content = str_replace( '###EXPIRATION###', $expiration_date, $content );
 	$content = str_replace( '###LINK###', esc_url_raw( $export_file_url ), $content );
-	$content = str_replace( '###EMAIL###', $email_address, $content );
 	$content = str_replace( '###SITENAME###', $site_name, $content );
 	$content = str_replace( '###SITEURL###', esc_url_raw( $site_url ), $content );
 
@@ -2342,14 +2385,20 @@
 	delete_post_meta( $request_id, '_export_data_raw' );
 	update_post_meta( $request_id, '_export_data_grouped', $groups );
 
+	$has_export_data = ! empty( $groups );
+
 	/**
 	 * Generate the export file from the collected, grouped personal data.
 	 *
 	 * @since 4.9.6
+	 * @since 5.2 Added the $request parameter.
+	 * @since 5.2 Added the $has_export_data parameter.
 	 *
-	 * @param int $request_id The export request ID.
+	 * @param int             $request_id      The export request ID.
+	 * @param WP_User_Request $request         The export request.
+	 * @param bool            $has_export_data Wether there are personal data to export.
 	 */
-	do_action( 'wp_privacy_personal_data_export_file', $request_id );
+	do_action( 'wp_privacy_personal_data_export_file', $request_id, $request, $has_export_data );
 
 	// Clear the grouped data now that it is no longer needed.
 	delete_post_meta( $request_id, '_export_data_grouped' );
@@ -2356,7 +2405,7 @@
 
 	// If the destination is email, send it now.
 	if ( $send_as_email ) {
-		$mail_success = wp_privacy_send_personal_data_export_email( $request_id );
+		$mail_success = wp_privacy_send_personal_data_export_email( $request_id, $has_export_data );
 		if ( is_wp_error( $mail_success ) ) {
 			wp_send_json_error( $mail_success->get_error_message() );
 		}
