# FIX-MAIL.AWK by J.S. Morisset, aka Storm Widow # FidoNet 1:167/281, MTLNet 17:17/0, InterNet jsm@illusion.tpg.org # Fix-Mail substitutes f.n.z. addresses in outbound e-mail to custom domain # names. ie: f281.n167.z1.illusion.tpg.org -> site.illusion.tpg.org # The Sender: header is changed, and X-Origin/X-Gateway headers are added. # Sample Usage: # # [fredscan.exe] # cd\fredgate # for %%m in (m:\spool\{site}\fr*.xqt) do awk.exe -v xqt=%%m # -f fix-mail.awk config.fil # MapSys Structure: # # #MapSys {4d_addr} *@{site.domain} # Sample Config.Fil Entry: # # MailUF site.illusion.tpg.org 1:167/281.0 GATEMAIL # #MapSys 1:167/281.0 *@site.illusion.tpg.org # Supporting Utils: # # rm.exe Unix style file delete util from MIX Software # stripcr.exe Strip CR chars from text files by 7th Illusion BEGIN { email = "q:\\fix-mail.tmp" # temporary work file xdaemon = "mtlnet.gateway@illusion.tpg.org" # new sender value xorigin = "MTLNet aka the Matrix Technology 'Lectronic Network" xgateway = "7th ILLUSION Telecommunications Co.; illusion.tpg.org" printf("AWK: Reading %s ... ", xqt) while(getline cmd < xqt > 0) { # find e-mail messages if(cmd ~ /^C rmail/) dat = substr(xqt, 1, index(xqt, ".XQT")-1) ".DAT" else if(cmd ~ /^C rnews/) { error = 2; exit } else if(cmd ~ /^# FXD$/) { error = 1; exit } } if(dat == "") { error = 3; exit } print "Mail (Fixing Headers)" print("# FXD") >> xqt # reconstruct mtlnet address for mapsys match while(getline header < dat > 0) if(header ~ /^From: /) { if(header ~ /f[0-9]/ && header ~ /\.n[0-9]/ && header ~ /\.z[0-9]/) { # extract internet user@site address from header oldsite = substr(header, 7, index(header, "(")-8) # find name/address delimiter if((pos = index(oldsite, "%")) == 0) if((pos = index(oldsite, "@")) == 0) { error = 4; exit } pfnz = substr(oldsite, pos+1) name = tolower(substr(oldsite, 1, pos-1)) # re-create fidonet 4d type address if(pfnz !~ /^p[0-9]/) pfnz = "p0." pfnz gsub(/[a-zA-Z.]/, " ", pfnz) split(pfnz, addr) node = addr[4] ":" addr[3] "/" addr[2] "." addr[1] close(dat) break # find node's address in mapsys } else { close(dat) exit # site name already mapped by fredgate } } } $0 ~ /^#MapSys/ { # _mapsys.ctl field structures # $1 #mapsys keyword # $2 node address # $3 internet site if($2 ~ node) { sub(/\*/, name, $3) newsite = $3 exit } } END { if(error == 1) print "Mail (Fixed)" if(error == 2) print "News" if(error == 3) print "Unknown Type" if(error == 4) print "Address Format Unknown!" if(error != 0) exit system("rm.exe -s " email) while(getline header < dat > 0) { if(extended == 0) { # still in header section if(header ~ /^From:/) # ins sender: before from: printf("Sender: %s %s\n", # xfred value set w/ rec'd xdaemon, xfred) >> email # header if(newsite != "") { # address subst. needed if(header ~ /^From/) { gsub(oldsite, newsite, header) print(header) >> email if(header ~ /^From:/) { printf("Reply-To: %s\n", # add missing header newsite) >> email printf(" > %s\n", # display addr change oldsite) # to the screen printf(" < %s\n", newsite) } continue # read next line of msg } else if(header ~ /^Reply-To:/) # added w/ from: header continue # read next line of msg } if(header ~ /^Received:/) { # 2nd header - strip xpos = index(header, "(") # fred version info xfred = substr(header, xpos) header = substr(header, 1, xpos-1) } else if(header ~ /^Sender:/) # add w/ from: header continue else if(header ~ /^Organization:/) # use x-gateway instead continue else if(header == "") { # header/message break extended = 1 # stop comparing header info printf("X-Origin: %s\n", # origin network tagline xorigin) >> email printf("X-Gateway: %s\n", # origin of gateway site xgateway) >> email } } print(header) >> email } close(dat) close(email) system("stripcr.exe " email " " dat) }