Index: src/wp-admin/includes/ajax-actions.php
===================================================================
--- src/wp-admin/includes/ajax-actions.php	(revision 38110)
+++ src/wp-admin/includes/ajax-actions.php	(working copy)
@@ -3880,26 +3880,24 @@
 		$href = get_bloginfo( 'url' ) . $href;
 	}
 
-	$response = wp_safe_remote_get( $href, array(
+	$response = wp_remote_get( $href, array(
 		'timeout' => 15,
 		// Use an explicit user-agent
 		'user-agent' => 'WordPress URL Test',
 	) );
 
-	$message = null;
+	$error = false;
 
 	if ( is_wp_error( $response ) ) {
-		$error = $response->get_error_message();
-
-		if ( strpos( $message, 'resolve host' ) !== false ) {
-			$message = array( 'error' => __( 'Invalid host name.' ) );
+		if ( strpos( $response->get_error_message(), 'resolve host' ) !== false ) {
+			$error = true;
 		}
-
-		wp_send_json_error( $message );
+	} elseif ( wp_remote_retrieve_response_code( $response ) === 404 ) {
+		$error = true;
 	}
 
-	if ( wp_remote_retrieve_response_code( $response ) === 404 ) {
-		wp_send_json_error( array( 'error' => __( 'Not found, HTTP error 404.' ) ) );
+	if ( $error ) {
+		wp_send_json_error( array( 'httpError' => true ) );
 	}
 
 	wp_send_json_success();
Index: src/wp-includes/class-wp-editor.php
===================================================================
--- src/wp-includes/class-wp-editor.php	(revision 38110)
+++ src/wp-includes/class-wp-editor.php	(working copy)
@@ -1065,7 +1065,7 @@
 			'Ctrl + letter:' => __( 'Ctrl + letter:' ),
 			'Letter' => __( 'Letter' ),
 			'Action' => __( 'Action' ),
-			'Invalid host name.' => __( 'Invalid host name.' ),
+			'Error: the link cannot be reached.' => __( 'Error: the link cannot be reached.' ),
 			'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' =>
 				__( 'To move focus to other buttons use Tab or the arrow keys. To return focus to the editor press Escape or use one of the buttons.' ),
 			'When starting a new paragraph with one of these formatting shortcuts followed by a space, the formatting will be applied automatically. Press Backspace or Escape to undo.' =>
Index: src/wp-includes/js/tinymce/plugins/wplink/plugin.js
===================================================================
--- src/wp-includes/js/tinymce/plugins/wplink/plugin.js	(revision 38110)
+++ src/wp-includes/js/tinymce/plugins/wplink/plugin.js	(working copy)
@@ -94,6 +94,7 @@
 		var doingUndoRedoTimer;
 		var $ = window.jQuery;
 		var urlErrors = {};
+		var emailRegex = /^(mailto:)?[a-z0-9._%+-]+@[a-z0-9][a-z0-9.-]*\.[a-z]{2,63}$/i;
 
 		function getSelectedLink() {
 			var href, html,
@@ -147,6 +148,18 @@
 			});
 		}
 
+		function setLinkError( $link ) {
+			$link.attr( 'data-wplink-url-error', 'true' );
+
+			if ( window.wp && window.wp.a11y && window.wp.a11y.speak ) {
+				window.wp.a11y.speak( editor.translate( 'Error: the link cannot be reached.' ) );
+			}
+
+			if ( toolbar && toolbar.visible() ) {
+				toolbar.$el.find( '.wp-link-preview a' ).addClass( 'wplink-url-error' );
+			}
+		}
+
 		function checkLink( node ) {
 			var $link = editor.$( node );
 			var href = $link.attr( 'href' );
@@ -155,13 +168,12 @@
 				return;
 			}
 
-			// Early check
-			if ( /^http/i.test( href ) && ! /\.[a-z]{2,63}(\/|$)/i.test( href ) ) {
-				urlErrors[href] = tinymce.translate( 'Invalid host name.' );
+			if ( /^http/i.test( href ) && ! /^https?:\/\/[a-z0-9][a-z0-9.-]*\.[a-z]{2,63}(\/|$)/i.test( href ) ) {
+				urlErrors[href] = true;
 			}
 
 			if ( urlErrors.hasOwnProperty( href ) ) {
-				$link.attr( 'data-wplink-url-error', 'true' );
+				setLinkError( $link );
 				return;
 			} else {
 				$link.removeAttr( 'data-wplink-url-error' );
@@ -179,13 +191,9 @@
 					return;
 				}
 
-				if ( response.data && response.data.error ) {
-					urlErrors[href] = response.data.error;
-					$link.attr( 'data-wplink-url-error', 'true' );
-
-					if ( toolbar && toolbar.visible() ) {
-						toolbar.$el.find( '.wp-link-preview a' ).addClass( 'wplink-url-error' ).attr( 'title', editor.dom.encode( response.data.error ) );
-					}
+				if ( response.data && response.data.httpError ) {
+					urlErrors[href] = true;
+					setLinkError( $link );
 				}
 			});
 		}
@@ -274,7 +282,7 @@
 					return;
 				}
 
-				if ( ! /^(?:[a-z]+:|#|\?|\.|\/)/.test( href ) ) {
+				if ( ! /^(?:[a-z]+:|#|\?|\.|\/)/.test( href ) && ! emailRegex.test( href ) ) {
 					href = 'http://' + href;
 				}
 
@@ -536,7 +544,7 @@
 
 		editor.on( 'wptoolbar', function( event ) {
 			var linkNode = editor.dom.getParent( event.element, 'a' ),
-				$linkNode, href, edit, title;
+				$linkNode, href, edit;
 
 			if ( typeof window.wpLink !== 'undefined' && window.wpLink.modalOpen ) {
 				editToolbar.tempHide = true;
@@ -561,12 +569,11 @@
 					previewInstance.setURL( href );
 					event.element = linkNode;
 					event.toolbar = toolbar;
-					title = urlErrors.hasOwnProperty( href ) ? editor.dom.encode( urlErrors[ href ] ) : null;
 
 					if ( $linkNode.attr( 'data-wplink-url-error' ) === 'true' ) {
-						toolbar.$el.find( '.wp-link-preview a' ).addClass( 'wplink-url-error' ).attr( 'title', title );
+						toolbar.$el.find( '.wp-link-preview a' ).addClass( 'wplink-url-error' );
 					} else {
-						toolbar.$el.find( '.wp-link-preview a' ).removeClass( 'wplink-url-error' ).attr( 'title', null );
+						toolbar.$el.find( '.wp-link-preview a' ).removeClass( 'wplink-url-error' );
 					}
 				}
 			} else if ( editToolbar.visible() ) {
Index: src/wp-includes/js/wplink.js
===================================================================
--- src/wp-includes/js/wplink.js	(revision 38110)
+++ src/wp-includes/js/wplink.js	(working copy)
@@ -2,8 +2,8 @@
 
 ( function( $, wpLinkL10n, wp ) {
 	var editor, searchTimer, River, Query, correctedURL, linkNode,
-		emailRegexp = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i,
-		urlRegexp = /^(https?|ftp):\/\/[A-Z0-9.-]+\.[A-Z]{2,4}[^ "]*$/i,
+		emailRegexp = /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,63}$/i,
+		urlRegexp = /^(https?|ftp):\/\/[A-Z0-9.-]+\.[A-Z]{2,63}[^ "]*$/i,
 		inputs = {},
 		rivers = {},
 		isTouch = ( 'ontouchend' in document );
