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,8 @@
 			'Ctrl + letter:' => __( 'Ctrl + letter:' ),
 			'Letter' => __( 'Letter' ),
 			'Action' => __( 'Action' ),
-			'Invalid host name.' => __( 'Invalid host name.' ),
+			/* translators: link URL */
+			'Error: %s cannot be reached.' => __( 'Error: %s 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,20 @@
 			});
 		}
 
+		function setLinkError( $link ) {
+			var href = $link.attr( 'href' );
+
+			$link.attr( 'data-wplink-url-error', 'true' );
+
+			if ( window.wp && window.wp.a11y && window.wp.a11y.speak ) {
+				window.wp.a11y.speak( editor.translate( 'Error: %s cannot be reached.' ).replace( '%s', href ) );
+			}
+
+			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 +170,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 +193,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 +284,7 @@
 					return;
 				}
 
-				if ( ! /^(?:[a-z]+:|#|\?|\.|\/)/.test( href ) ) {
+				if ( ! /^(?:[a-z]+:|#|\?|\.|\/)/.test( href ) && ! emailRegex.test( href ) ) {
 					href = 'http://' + href;
 				}
 
@@ -536,7 +546,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 +571,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 );
