diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c
index 90fbb8ae3f1ba61828af54740eded516379336a8..b7d15523a225bcef9b36eeff2fd0a436a2575c36 100644
--- a/src/sbbs3/mailsrvr.c
+++ b/src/sbbs3/mailsrvr.c
@@ -2971,6 +2971,7 @@ static void smtp_thread(void* arg)
 	if(startup->inbound_sound[0] && !(startup->options&MAIL_OPT_MUTE)) 
 		PlaySound(startup->inbound_sound, NULL, SND_ASYNC|SND_FILENAME);
 #endif
+	SAFEPRINTF(domain_list,"%sdomains.cfg",scfg.ctrl_dir);
 
 	addr_len=sizeof(server_addr);
 
@@ -4664,7 +4665,6 @@ static void smtp_thread(void* arg)
 					*cp=0;
 					dest_port=atoi(cp+1);
 				}
-				SAFEPRINTF(domain_list,"%sdomains.cfg",scfg.ctrl_dir);
 				if((stricmp(dest_host,scfg.sys_inetaddr)!=0
 						&& stricmp(dest_host,startup->host_name)!=0
 						&& findstr(dest_host,domain_list)==FALSE)
@@ -4927,7 +4927,10 @@ static void smtp_thread(void* arg)
 				&& scfg.sys_misc&SM_FWDTONET 
 				&& (user.misc&NETMAIL || forward)
 				&& tp!=NULL && smb_netaddr_type(user.netmail)==NET_INTERNET 
-				&& !strstr(tp,scfg.sys_inetaddr)) {
+				&& stricmp(tp + 1, scfg.sys_inetaddr) != 0
+				&& stricmp(tp + 1, startup->host_name) != 0
+				&& findstr(tp + 1, domain_list)==FALSE
+				) {
 				lprintf(LOG_INFO,"%04d %s %s Forwarding to: %s"
 					,socket, client.protocol, client_id, user.netmail);
 				fprintf(rcptlst,"%s=%u\n",smb_hfieldtype(RECIPIENTNETTYPE),NET_INTERNET);
diff --git a/src/sbbs3/netmail.cpp b/src/sbbs3/netmail.cpp
index 457ca30eaa02980ff84a712be10c3b0bf248d2c4..9c299cec8644c92fa161c86320fef0b044483eaa 100644
--- a/src/sbbs3/netmail.cpp
+++ b/src/sbbs3/netmail.cpp
@@ -1431,18 +1431,35 @@ bool sbbs_t::qnetmail(const char *into, const char *subj, long mode, smb_t* resm
 
 extern "C" BOOL is_supported_netmail_addr(scfg_t* cfg, const char* addr)
 {
+	const char* p;
+	fidoaddr_t faddr;
+
+	if((p = strchr(addr, '@')) == NULL)
+		return FALSE;
+	p++;
 	switch (smb_netaddr_type(addr)) {
 		case NET_FIDO:
-			return INT_TO_BOOL(cfg->total_faddrs && (cfg->netmail_misc&NMAIL_ALLOW));
+			if(!(cfg->netmail_misc&NMAIL_ALLOW))
+				return FALSE;
+			if(cfg->total_faddrs < 1)
+				return FALSE;
+			faddr = atofaddr(cfg, (char*)p);
+			for(int i = 0; i < cfg->total_faddrs; i++)
+				if(memcmp(&cfg->faddr[i], &faddr, sizeof(faddr)) == 0)
+					return FALSE;
+			return TRUE;
 		case NET_INTERNET:
-			return INT_TO_BOOL(cfg->inetmail_misc&NMAIL_ALLOW);
+			if(!(cfg->inetmail_misc&NMAIL_ALLOW))
+				return FALSE;
+			if(stricmp(p, cfg->sys_inetaddr) == 0)
+				return FALSE;
+			char domain_list[MAX_PATH + 1];
+			SAFEPRINTF(domain_list, "%sdomains.cfg", cfg->ctrl_dir);
+			return findstr(p, domain_list) == FALSE;
 		case NET_QWK:
 		{
 			char fulladdr[256] = "";
-			const char* p = strchr(addr, '@');
-			if(p == NULL)
-				return FALSE;
-			qwk_route(cfg, p + 1, fulladdr, sizeof(fulladdr)-1);
+			qwk_route(cfg, p, fulladdr, sizeof(fulladdr)-1);
 			return fulladdr[0] != 0;
 		}
 		default: