diff --git a/src/sbbs3/mailsrvr.c b/src/sbbs3/mailsrvr.c index c015f05b7bbbd541aabd9972225e13c61cab3f65..ee85deb2505017e5a822016abdbdae97c7d806f1 100644 --- a/src/sbbs3/mailsrvr.c +++ b/src/sbbs3/mailsrvr.c @@ -3423,6 +3423,8 @@ static void sendmail_thread(void* arg) char secret[64]; char md5_data[384]; char digest[MD5_DIGEST_SIZE]; + char numeric_ip[16]; + char domain_list[MAX_PATH+1]; char* server; char* msgtxt=NULL; char* p; @@ -3545,6 +3547,7 @@ static void sendmail_thread(void* arg) smb_unlockmsghdr(&smb,&msg); continue; } + if(!(startup->options&MAIL_OPT_SEND_INTRANSIT) && msg.hdr.netattr&MSG_INTRANSIT) { smb_unlockmsghdr(&smb,&msg); lprintf(LOG_ERR,"0000 SEND Message #%lu from %s to %s - in transit" @@ -3573,50 +3576,85 @@ static void sendmail_thread(void* arg) } port=0; - if(startup->options&MAIL_OPT_RELAY_TX) { - server=startup->relay_server; - port=startup->relay_port; - } else { - p=strrchr((char*)msg.to_net.addr,':'); /* non-standard SMTP port */ - if(p!=NULL) { - *p=0; - port=atoi(p+1); - } - SAFECOPY(to,(char*)msg.to_net.addr); - truncstr(to,"> "); - - p=strrchr(to,'@'); - if(p==NULL) { - remove_msg_intransit(&smb,&msg); - lprintf(LOG_WARNING,"0000 !SEND INVALID destination address: %s", to); - SAFEPRINTF(err,"Invalid destination address: %s", to); - bounce(&smb,&msg,err,TRUE); - continue; - } - if((dns=resolve_ip(startup->dns_server))==INADDR_NONE) { - remove_msg_intransit(&smb,&msg); - lprintf(LOG_WARNING,"0000 !SEND INVALID DNS server address: %s" - ,startup->dns_server); - continue; + + /* Check if this is a local email ToDo */ + SAFECOPY(to,(char*)msg.to_net.addr); + truncstr(to,"> "); + + p=strrchr(to,'@'); + if(p==NULL) { + remove_msg_intransit(&smb,&msg); + lprintf(LOG_WARNING,"0000 !SEND INVALID destination address: %s", to); + SAFEPRINTF(err,"Invalid destination address: %s", to); + bounce(&smb,&msg,err,TRUE); + continue; + } + p++; + sprintf(domain_list,"%sdomains.cfg",scfg.ctrl_dir); + if(stricmp(p,scfg.sys_inetaddr)==0 + || stricmp(p,startup->host_name)==0 + || findstr(p,domain_list)) { + /* This is a local message... no need to send to remote */ + port = startup->smtp_port; + if(startup->interface_addr==0) + server="127.0.0.1"; + else { + sprintf(numeric_ip, "%u.%u.%u.%u" + , startup->interface_addr >> 24 + , (startup->interface_addr >> 16) & 0xff + , (startup->interface_addr >> 8) & 0xff + , startup->interface_addr & 0xff); + server = numeric_ip; } - p++; - lprintf(LOG_DEBUG,"0000 SEND getting MX records for %s from %s",p,startup->dns_server); - if((i=dns_getmx(p, mx, mx2, startup->interface_addr, dns - ,startup->options&MAIL_OPT_USE_TCP_DNS ? TRUE : FALSE - ,TIMEOUT_THREAD_WAIT/2))!=0) { - remove_msg_intransit(&smb,&msg); - lprintf(LOG_WARNING,"0000 !SEND ERROR %d obtaining MX records for %s from %s" - ,i,p,startup->dns_server); - SAFEPRINTF2(err,"Error %d obtaining MX record for %s",i,p); - bounce(&smb,&msg,err,FALSE); - continue; + } + else { + if(startup->options&MAIL_OPT_RELAY_TX) { + server=startup->relay_server; + port=startup->relay_port; + } else { + p=strrchr((char*)msg.to_net.addr,':'); /* non-standard SMTP port */ + if(p!=NULL) { + *p=0; + port=atoi(p+1); + } +#if 0 /* Already done */ + SAFECOPY(to,(char*)msg.to_net.addr); + truncstr(to,"> "); +#endif + p=strrchr(to,'@'); +#if 0 /* Already done */ + if(p==NULL) { + remove_msg_intransit(&smb,&msg); + lprintf(LOG_WARNING,"0000 !SEND INVALID destination address: %s", to); + SAFEPRINTF(err,"Invalid destination address: %s", to); + bounce(&smb,&msg,err,TRUE); + continue; + } +#endif + if((dns=resolve_ip(startup->dns_server))==INADDR_NONE) { + remove_msg_intransit(&smb,&msg); + lprintf(LOG_WARNING,"0000 !SEND INVALID DNS server address: %s" + ,startup->dns_server); + continue; + } + p++; + lprintf(LOG_DEBUG,"0000 SEND getting MX records for %s from %s",p,startup->dns_server); + if((i=dns_getmx(p, mx, mx2, startup->interface_addr, dns + ,startup->options&MAIL_OPT_USE_TCP_DNS ? TRUE : FALSE + ,TIMEOUT_THREAD_WAIT/2))!=0) { + remove_msg_intransit(&smb,&msg); + lprintf(LOG_WARNING,"0000 !SEND ERROR %d obtaining MX records for %s from %s" + ,i,p,startup->dns_server); + SAFEPRINTF2(err,"Error %d obtaining MX record for %s",i,p); + bounce(&smb,&msg,err,FALSE); + continue; + } + server=mx; } - server=mx; } if(!port) port=IPPORT_SMTP; - if((sock=mail_open_socket(SOCK_STREAM))==INVALID_SOCKET) { remove_msg_intransit(&smb,&msg); lprintf(LOG_ERR,"0000 !SEND ERROR %d opening socket", ERROR_VALUE);