$version ) {
			$text .= "- ".sprintf( esc_html__( "%s tested up to: %s", "companion-auto-update" ), $plugin, $version )."\n";
		}
	}
	return $text;
}
// Set the content for the emails about pending updates
function cau_pending_message( $single, $plural, $list ) {
	// What markup to use
	if( cau_is_html() ) $break = '
';
	else $break = "\n";
	// Base text
	$text = sprintf( esc_html__( 'You have pending %1$s updates on your WordPress site at %2$s.', 'companion-auto-update' ), $single, get_site_url() );
	$text .= $break;
	if( !empty( $list ) ) {
		
		$text .= $break;
		$text .= sprintf( esc_html__( 'The following %1$s have new versions available.', 'companion-auto-update' ), $plural );
		$text .= $break;
		if( cau_is_html() ) $text .= "
";
		foreach ( $list as $key => $value ) {
			if( cau_is_html() ) {
				$text .= "- $value";
			} else {
				$text .= "-$value\n";
			}
		}
		if( cau_is_html() ) $text .= "
";
		
		$text .= $break;
	}
	$text .= __( 'Leaving your site outdated is a security risk so please consider manually updating them.', 'companion-auto-update' );
	$text .= $break;
	// End
	$text .= sprintf( esc_html__( 'Head over to %1$s and check the ones you want to update.', 'companion-auto-update' ), get_admin_url().'update-core.php' );
	return $text;
}
// Set the content for the emails about recent updates
function cau_updated_message( $type, $updatedList ) {
	// What markup to use
	if( cau_is_html() ) $break = '
';
	else $break = "\n";
	// The message
	$text = sprintf( esc_html__( 
		'One or more %1$s on your WordPress site at %2$s have been updated by Companion Auto Update. No further action is needed on your part. 
For more info on what is new visit your dashboard and check the changelog.', 'companion-auto-update'
	), $type, get_site_url() );
	$text .= $break;
	$text .= $break;
	$text .= sprintf( esc_html__( 
		'The following %1$s have been updated:', 'companion-auto-update'
	), $type );
	$text .= $break;
	$text .= $updatedList;
	$text .= $break;
	$text .= __( "(You'll also receive this email if you manually updated a plugin or theme)", "companion-auto-update"  );
	return $text;
}
// Checks if plugins are out of date
function cau_list_outdated_software() {
	// Check if cau_get_db_value() function exists.
	if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
	// Set up mail
	$subject 		= '['.get_bloginfo( 'name' ).'] ' . __( 'You have outdated plugins on your site.', 'companion-auto-update' );
	$type 			= __( 'plugin', 'companion-auto-update' );
	$type_plural	= __( 'plugins', 'companion-auto-update' );
	$message 		= cau_outdated_message( $type, $type_plural, cau_list_outdated() );
	// Send to all addresses
	foreach ( cau_set_email() as $key => $value ) {
		foreach ( $value as $k => $v ) {
			wp_mail( $v, $subject, $message );
		}
		break;
	}
}
// Checks if theme updates are available
function cau_list_theme_updates() {
	global $wpdb;
	$table_name = $wpdb->prefix . "auto_updates"; 
	$configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'themes'");
	foreach ( $configs as $config ) {
		if( $config->onoroff != 'on' ) {
			require_once ABSPATH . '/wp-admin/includes/update.php';
			$themes = get_theme_updates();
			$list 	= array();
			if ( !empty( $themes ) ) {
				
				foreach ( $themes as $stylesheet => $theme ) {
					array_push( $list, $theme->get( 'Name' ) );
				}
				$subject 		= '[' . get_bloginfo( 'name' ) . '] ' . __( 'Theme update available.', 'companion-auto-update' );
				$type 			= __('theme', 'companion-auto-update');
				$type_plural	= __('themes', 'companion-auto-update');
				$message 		= cau_pending_message( $type, $type_plural, $list );
				
				foreach ( cau_set_email() as $key => $value) {
					foreach ($value as $k => $v) {
						wp_mail( $v, $subject, $message );
					}
					break;
				}
			}
		}
	}
}
// Checks if plugin updates are available
function cau_list_plugin_updates() {
	
	global $wpdb;
	$table_name = $wpdb->prefix . "auto_updates"; 
	$configs = $wpdb->get_results( "SELECT * FROM $table_name WHERE name = 'plugins'");
	foreach ( $configs as $config ) {
		if( $config->onoroff != 'on' ) {
			require_once(ABSPATH . 'wp-admin/includes/plugin-install.php');
			$plugins = get_plugin_updates();
			if ( !empty( $plugins ) ) {
				$list = array();
				foreach ( (array) $plugins as $plugin_file => $plugin_data ) {
					$plugin_data 	= (object) _get_plugin_data_markup_translate( $plugin_file, (array) $plugin_data, false, true );
					$name 			= $plugin_data->Name;
					array_push( $list, $name );
				}
				$subject 		= '[' . get_bloginfo( 'name' ) . '] ' . __( 'Plugin update available.', 'companion-auto-update' );
				$type 			= __( 'plugin', 'companion-auto-update' );
				$type_plural	= __( 'plugins', 'companion-auto-update' );
				$message 		= cau_pending_message( $type, $type_plural, $list );
				foreach ( cau_set_email() as $key => $value) {
					foreach ($value as $k => $v) {
						wp_mail( $v, $subject, $message );
					}
					break;
				}
			}
		}
	}
}
// Alerts when plugin has been updated
function cau_plugin_updated() {
	// Check if cau_get_db_value() function exists.
	if ( !function_exists( 'cau_get_db_value' ) ) require_once( plugin_dir_path( __FILE__ ) . 'cau_function.php' );
	// Set the correct timezone for emails
	date_default_timezone_set( cau_get_proper_timezone() );
	// Create arrays
	$pluginNames 	= array();
	$pluginDates 	= array();
	$pluginVersion 	= array();
	$pluginSlug  	= array();
	$pluginTimes 	= array();
	$themeNames 	= array();
	$themeDates 	= array();
	$themeTimes		= array();
	// Where to look for plugins
	$plugdir    	= plugin_dir_path( __DIR__ );
	if ( !function_exists( 'get_plugins' ) ) require_once( ABSPATH . 'wp-admin/includes/plugin.php' );  // Check if get_plugins() function exists.
	$allPlugins 	= get_plugins();
	// Where to look for themes
	$themedir   	= get_theme_root();
	$allThemes 		= wp_get_themes();
	// Mail schedule
	$schedule_mail 	= wp_get_schedule( 'cau_set_schedule_mail' );
	// Loop trough all plugins
	foreach ( $allPlugins as $key => $value ) {
		// Get plugin data
		$fullPath 	= $plugdir.'/'.$key;
		$getFile 	= $path_parts = pathinfo( $fullPath );
		$pluginData = get_plugin_data( $fullPath );
		// Get the slug
		$explosion 		= explode( '/', $key );
		$actualSlug 	= array_shift( $explosion );
		// Get last update date
		$fileDate 	= date ( 'YmdHi', filemtime( $fullPath ) );
		switch ( $schedule_mail ) {
			case 'hourly':
				$lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
				break;
			case 'twicedaily':
				$lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
				break;
			default:
				$lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
				break;
		}
		$dateFormat = get_option( 'date_format' );
		$timestamp 	= date_i18n( $dateFormat, filemtime( $fullPath ) );
		$timestamp .= ' ‐ '.date( 'H:i', filemtime( $fullPath ) );
		if( $fileDate >= $lastday ) {
			// Get plugin name
			foreach ( $pluginData as $dataKey => $dataValue ) {
				if( $dataKey == 'Name') {
					array_push( $pluginNames , $dataValue );
				}
				if( $dataKey == 'Version') {
					array_push( $pluginVersion , $dataValue );
				}
			}
			array_push( $pluginDates, $fileDate );
			array_push( $pluginSlug, $actualSlug );
			array_push( $pluginTimes, $timestamp );
		}
	}
	// Loop trough all themes
	foreach ( $allThemes as $key => $value ) {
		// Get theme data
		$fullPath 	= $themedir.'/'.$key;
		$getFile 	= $path_parts = pathinfo( $fullPath );
		// Get last update date
		$dateFormat = get_option( 'date_format' );
		$fileDate 	= date ( 'YmdHi', filemtime( $fullPath ) );
		if( $schedule_mail == 'hourly' ) {
			$lastday = date( 'YmdHi', strtotime( '-1 hour', time() ) );
		} elseif( $schedule_mail == 'twicedaily' ) {
			$lastday = date( 'YmdHi', strtotime( '-12 hours', time() ) );
		} elseif( $schedule_mail == 'daily' ) {
			$lastday = date( 'YmdHi', strtotime( '-1 day', time() ) );
		}
		$dateFormat = get_option( 'date_format' );
		$timestamp 	= date_i18n( $dateFormat, filemtime( $fullPath ) );
		$timestamp .= ' ‐ '.date( 'H:i', filemtime( $fullPath ) );
		if( $fileDate >= $lastday ) {
			array_push( $themeNames, $path_parts['filename'] );
			array_push( $themeDates, $fileDate );
			array_push( $themeTimes, $timestamp );
		}
	}
	
	$totalNumP 		= 0;
	$totalNumT		= 0;
	$updatedListP 	= '';
	$updatedListT 	= '';
	
	if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
		$updatedListP 	.= '';
		$updatedListT 	.= '';
	}
	foreach ( $pluginDates as $key => $value ) {
		
		if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
			$more_info = '';
			if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) $more_info = "
".__( "Time of update", "companion-auto-update" ).": ".$pluginTimes[$key].""; 
			$updatedListP .= "- 
				".$pluginNames[$key]." 
 ".__( "to version", "companion-auto-update" )." ".$pluginVersion[$key]." ".__( "Release notes", "companion-auto-update" )."
				".$more_info."
";
		} else {
			$updatedListP .= "- ".$pluginNames[$key]." ".__( "to version", "companion-auto-update" )." ".$pluginVersion[$key]."\n";
			$updatedListP .= "  ".__( "Release notes", "companion-auto-update" ).": https://wordpress.org/plugins/".$pluginSlug[$key]."/#developers\n";
		}
		$totalNumP++;
	}
	foreach ( $themeNames as $key => $value ) {
		if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
			$more_info = '';
			if( cau_get_db_value( 'advanced_info_emails' ) == 'on' ) $more_info = "
".__( "Time of update", "companion-auto-update" ).": ".$themeTimes[$key].""; 
			$updatedListT .= "- ".$themeNames[$key]."".$more_info."";
		} else {
			$updatedListT .= "- ".$themeNames[$key]."\n";
		}
		$totalNumT++;
	}
	if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
		$updatedListP 	.= '
';
		$updatedListT 	.= '
';
	}
	// Set the email content type
	if( cau_get_db_value( 'html_or_text' ) == 'html' ) {
		function cau_mail_content_type() {
		    return 'text/html';
		}
		add_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
	}
	// If plugins have been updated, send email
	if( $totalNumP > 0 ) {
		// E-mail content
		$subject 		= '[' . get_bloginfo( 'name' ) . '] ' . __('One or more plugins have been updated.', 'companion-auto-update');
		$type 			= __('plugins', 'companion-auto-update');
		$message 		= cau_updated_message( $type, $updatedListP );
		// Send to all addresses
		foreach ( cau_set_email() as $key => $value) {
			foreach ($value as $k => $v) {
				wp_mail( $v, $subject, $message );
			}
			break;
		}
	}
	// If themes have been updated, send email
	if( $totalNumT > 0 ) {
		// E-mail content
		$subject 		= '[' . get_bloginfo( 'name' ) . '] ' . __('One or more themes have been updated.', 'companion-auto-update');
		$type 			= __('themes', 'companion-auto-update');
		$message 		= cau_updated_message( $type, $updatedListT );
		// Send to all addresses
		foreach ( cau_set_email() as $key => $value) {
			foreach ($value as $k => $v) {
				wp_mail( $v, $subject, $message );
			}
			break;
		}
	}
	if( cau_get_db_value( 'html_or_text' ) == 'html' ) remove_filter( 'wp_mail_content_type', 'cau_mail_content_type' );
	
	// Prevent duplicate emails by setting the event again
	if( $totalNumT > 0 OR $totalNumP > 0 ) {
		if( $schedule_mail == 'hourly' ) {
			wp_clear_scheduled_hook('cau_set_schedule_mail');
			wp_schedule_event( strtotime( '+1 hour', time() ) , 'hourly', 'cau_set_schedule_mail' );
		}
	}
}