diff --git a/src/sbbs3/netmail.cpp b/src/sbbs3/netmail.cpp
index edd1cdaa99775d25cdee232626c23a2067f1822e..7436a178ac9c3a021be5d3a754b318603eb00cdd 100644
--- a/src/sbbs3/netmail.cpp
+++ b/src/sbbs3/netmail.cpp
@@ -170,16 +170,7 @@ bool sbbs_t::netmail(const char *into, const char *title, long mode, smb_t* resm
 			return(false); 
 	}
 
-	for(i=0;i<cfg.total_faddrs;i++)
-		if(dest_addr.zone==cfg.faddr[i].zone && dest_addr.net==cfg.faddr[i].net)
-			break;
-	if(i==cfg.total_faddrs) {
-		for(i=0;i<cfg.total_faddrs;i++)
-			if(dest_addr.zone==cfg.faddr[i].zone)
-				break; 
-	}
-	if(i >= cfg.total_faddrs)
-		i=0;
+	i = nearest_sysfaddr_index(&cfg, &dest_addr);
 
 	if((cfg.netmail_misc&NMAIL_CHSRCADDR) && cfg.total_faddrs > 1) {
 		for(uint j=0; j < cfg.total_faddrs; j++)
diff --git a/src/sbbs3/scfglib.h b/src/sbbs3/scfglib.h
index 1c70181c1dc46395a764f189095fb527c5c3ea7c..afd0a58a50141a89c098a5f0d5041df168081ed4 100644
--- a/src/sbbs3/scfglib.h
+++ b/src/sbbs3/scfglib.h
@@ -80,6 +80,7 @@ DLLEXPORT char *	sub_newsgroup_name(scfg_t*, sub_t*, char*, size_t);
 DLLEXPORT char *	sub_area_tag(scfg_t*, sub_t*, char*, size_t);
 DLLEXPORT char *	dir_area_tag(scfg_t*, dir_t*, char*, size_t);
 
+uint nearest_sysfaddr_index(scfg_t*, faddr_t*);
 faddr_t* nearest_sysfaddr(scfg_t*, faddr_t*);
 
 #ifdef __cplusplus
diff --git a/src/sbbs3/scfglib1.c b/src/sbbs3/scfglib1.c
index 1a7a8c4fc1d077724e9551a832e3802937ce4e88..fcb74e5bbf58e1c5b61be9fcebd7d7f691330c5b 100644
--- a/src/sbbs3/scfglib1.c
+++ b/src/sbbs3/scfglib1.c
@@ -851,29 +851,40 @@ BOOL is_valid_grpnum(scfg_t* cfg, int grpnum)
 	return (grpnum >= 0) && (cfg != NULL) && (grpnum < cfg->total_grps);
 }
 
-faddr_t* nearest_sysfaddr(scfg_t* cfg, faddr_t* addr)
+uint nearest_sysfaddr_index(scfg_t* cfg, faddr_t* addr)
 {
 	uint i;
-
-	if(cfg->total_faddrs <= 0)
-		return addr;
+	uint nearest = 0;
+	int min = INT_MAX;
 
 	for(i=0; i < cfg->total_faddrs; i++)
 		if(memcmp(addr, &cfg->faddr[i], sizeof(*addr)) == 0)
-			return &cfg->faddr[i];
+			return i;
 	for(i=0; i < cfg->total_faddrs; i++)
 		if(addr->zone == cfg->faddr[i].zone
 			&& addr->net == cfg->faddr[i].net
 			&& addr->node == cfg->faddr[i].node)
-			return &cfg->faddr[i];
+			return i;
 	for(i=0; i < cfg->total_faddrs; i++)
 		if(addr->zone == cfg->faddr[i].zone
 			&& addr->net == cfg->faddr[i].net)
-			return &cfg->faddr[i];
-	for(i=0; i < cfg->total_faddrs; i++)
-		if(addr->zone == cfg->faddr[i].zone)
-			return &cfg->faddr[i];
-	return &cfg->faddr[0];
+			return i;
+	for(i=0; i < cfg->total_faddrs; i++) {
+		int diff = abs((int)addr->zone - (int)cfg->faddr[i].zone);
+		if(diff < min) {
+			min = diff;
+			nearest = i;
+		}
+	}
+	return nearest;
+}
+
+faddr_t* nearest_sysfaddr(scfg_t* cfg, faddr_t* addr)
+{
+	uint i = nearest_sysfaddr_index(cfg, addr);
+	if(i >= cfg->total_faddrs)
+		return addr;
+	return &cfg->faddr[i];
 }
 
 /****************************************************************************/