diff --git a/src/camel/camel-mapi-folder.c b/src/camel/camel-mapi-folder.c
index b8498fb..e8015d4 100644
--- a/src/camel/camel-mapi-folder.c
+++ b/src/camel/camel-mapi-folder.c
@@ -406,10 +406,6 @@ mapi_update_cache (CamelFolder *folder, GSList *list, CamelFolderChangeInfo **ch
 				struct SRow *aRow;
 				ExchangeMAPIRecipient *recip = (ExchangeMAPIRecipient *)(l->data);
 
-				/*Can't continue when there is no email-id*/
-				if (!recip->email_id)
-					continue;
-
 				/* Build a SRow structure */
 				aRow = &recip->out_SRow;
 
@@ -421,7 +417,7 @@ mapi_update_cache (CamelFolder *folder, GSList *list, CamelFolderChangeInfo **ch
 					name = name ? name : (const gchar *) exchange_mapi_util_find_row_propval (aRow,
 												 PR_7BIT_DISPLAY_NAME_UNICODE);
 					display_name = name ? name : recip->email_id;
-					formatted_id = camel_internet_address_format_address(display_name, recip->email_id);
+					formatted_id = camel_internet_address_format_address(display_name, recip->email_id ? recip->email_id : "");
 
 					switch (*type) {
 					case MAPI_TO:
diff --git a/src/libexchangemapi/exchange-mapi-connection.c b/src/libexchangemapi/exchange-mapi-connection.c
index d91b876..152e073 100644
--- a/src/libexchangemapi/exchange-mapi-connection.c
+++ b/src/libexchangemapi/exchange-mapi-connection.c
@@ -1438,7 +1438,7 @@ exchange_mapi_connection_get_public_folder (ExchangeMapiConnection *conn, mapi_o
 
 /* Returns TRUE if all recipients were read succcesfully, else returns FALSE */
 static gboolean
-exchange_mapi_util_get_recipients (mapi_object_t *obj_message, GSList **recip_list, GError **perror)
+exchange_mapi_util_get_recipients (ExchangeMapiConnection *conn, mapi_object_t *obj_message, GSList **recip_list, GError **perror)
 {
 	enum MAPISTATUS		ms;
 	struct SPropTagArray	proptags;
@@ -1463,9 +1463,26 @@ exchange_mapi_util_get_recipients (mapi_object_t *obj_message, GSList **recip_li
 		recipient->email_id = talloc_steal (recipient->mem_ctx, (const gchar *) exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_SMTP_ADDRESS_UNICODE));
 		/* fallback */
 		if (!recipient->email_id) {
-			const gchar *addrtype = talloc_steal (recipient->mem_ctx, (const gchar *) exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_ADDRTYPE_UNICODE));
-			if (addrtype && !g_ascii_strcasecmp(addrtype, "SMTP"))
+			uint32_t fallback_props[] = {
+				PROP_TAG (PT_UNICODE, 0x6001), /* PigTagNickname for Recipients table */
+				PR_RECIPIENT_DISPLAY_NAME_UNICODE
+			};
+			gint ii;
+			const gchar *addrtype = exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_ADDRTYPE_UNICODE);
+
+			if (addrtype && !g_ascii_strcasecmp (addrtype, "SMTP"))
 				recipient->email_id = talloc_steal (recipient->mem_ctx, (const gchar *) exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_EMAIL_ADDRESS_UNICODE));
+
+			for (ii = 0; !recipient->email_id && ii < G_N_ELEMENTS (fallback_props); ii++) {
+				recipient->email_id = talloc_steal (recipient->mem_ctx, (const gchar *) exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), fallback_props[ii]));
+			}
+		}
+
+		if (recipient->email_id) {
+			const gchar *addrtype = exchange_mapi_util_find_row_propval (&(rows_recip.aRow[i_row_recip]), PR_ADDRTYPE_UNICODE);
+
+			if (addrtype && g_ascii_strcasecmp (addrtype, "EX") == 0)
+				recipient->email_id = exchange_mapi_connection_ex_to_smtp (conn, recipient->email_id, NULL, NULL);
 		}
 
 		recipient->out_SRow.ulAdrEntryPad = rows_recip.aRow[i_row_recip].ulAdrEntryPad;
@@ -1792,7 +1809,7 @@ exchange_mapi_connection_fetch_items   (ExchangeMapiConnection *conn, mapi_id_t
 			}
 
 			if (options & MAPI_OPTIONS_FETCH_RECIPIENTS) {
-				exchange_mapi_util_get_recipients (&obj_message, &recip_list, perror);
+				exchange_mapi_util_get_recipients (conn, &obj_message, &recip_list, perror);
 			}
 
 			/* get the main body stream no matter what */
@@ -1948,7 +1965,7 @@ exchange_mapi_connection_fetch_object_props (ExchangeMapiConnection *conn, mapi_
 
 	/* Fetch recipients */
 	if (options & MAPI_OPTIONS_FETCH_RECIPIENTS) {
-		exchange_mapi_util_get_recipients (obj_message, &recip_list, NULL);
+		exchange_mapi_util_get_recipients (conn, obj_message, &recip_list, NULL);
 	}
 
 	/* get the main body stream no matter what */
diff --git a/src/libexchangemapi/exchange-mapi-mail-utils.c b/src/libexchangemapi/exchange-mapi-mail-utils.c
index 9f0fd2c..1d27bae 100644
--- a/src/libexchangemapi/exchange-mapi-mail-utils.c
+++ b/src/libexchangemapi/exchange-mapi-mail-utils.c
@@ -355,10 +355,6 @@ mapi_mime_set_recipient_list (ExchangeMapiConnection *conn, CamelMimeMessage *ms
 		struct SRow *aRow;
 		ExchangeMAPIRecipient *recip = (ExchangeMAPIRecipient *)(l->data);
 
-		/*Can't continue when there is no email-id*/
-		if (!recip->email_id)
-			continue;
-
 		/* Build a SRow structure */
 		aRow = &recip->out_SRow;
 
@@ -377,19 +373,19 @@ mapi_mime_set_recipient_list (ExchangeMapiConnection *conn, CamelMimeMessage *ms
 
 		type = (uint32_t *) exchange_mapi_util_find_row_propval (aRow, PR_RECIPIENT_TYPE);
 
-		if (!display_name && name && recip->email_id && !name_is_email_user (name, recip->email_id))
+		if (!display_name && name && (!recip->email_id || !name_is_email_user (name, recip->email_id)))
 			display_name = g_strdup (name);
 		rcpt_type = (type ? *type : MAPI_TO);
 
 		switch (rcpt_type) {
 		case MAPI_TO:
-			camel_internet_address_add (to_addr, display_name, recip->email_id);
+			camel_internet_address_add (to_addr, display_name, recip->email_id ? recip->email_id : "");
 			break;
 		case MAPI_CC:
-			camel_internet_address_add (cc_addr, display_name, recip->email_id);
+			camel_internet_address_add (cc_addr, display_name, recip->email_id ? recip->email_id : "");
 			break;
 		case MAPI_BCC:
-			camel_internet_address_add (bcc_addr, display_name, recip->email_id);
+			camel_internet_address_add (bcc_addr, display_name, recip->email_id ? recip->email_id : "");
 			break;
 		}
 
