home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 2 / AUCD2.iso / internet / pop098.spk / !POP / NB054trans / POP / sendmail (.txt) < prev    next >
RISC OS BBC BASIC V Source  |  1995-06-25  |  8KB  |  437 lines

  1.  >SendMail
  2.  takes a mail message file and copies to outgoing directory
  3.  *** Version for !POP/SMTP mail transport
  4.  *** Identical to G.A's ka9q "sendmail" except I've brought
  5.  the mail spool directory out to the front and changed it.
  6.  - Daniel Pead
  7. Hspooldir$="<POP$MailDir>.spool": 
  8.  Set the mail spool directory here
  9. " at line ";
  10. "OS_GetEnv" 
  11. ver$="0.52"
  12. N$="":nolocal%=
  13. :test%=
  14. getpar(A$," ")
  15. "-f":N$=
  16. getpar(A$," ")
  17. "-nolocal":nolocal%=
  18. "-test":test%=
  19.  A$=""
  20.  N$=""
  21. exit(1,"No file parameter")
  22. checkdirs
  23.  tmp%300,nbuf%4096
  24.  no fixed upper limit, let memory be the factor...
  25. tomax%=(
  26. -1000)
  27.  to$(tomax%)
  28. >gate$=
  29. varval("NewsBase$RemoteHost"):
  30.  gate$<5
  31.  gate$=""
  32. $local$=
  33. varval("NewsBase$Local")
  34.  nolocal%
  35.  local$=""
  36. !3localhost$=
  37. lower(
  38. varval("NewsBase$HostName"))
  39.  now extract to/from info...
  40. $Bfrom$="":to$="":bcc$="":count%=0:into%=
  41. :sender$="":errors$=""
  42. %9C1%=
  43. openin(N$):
  44.  C1%=0 
  45. exit(1,"Couldn't open file")
  46.   A$=
  47. sget(C1%)
  48. A$,6)="From: " 
  49.  temp$=
  50. A$,7):from$=
  51. getaddress(temp$)
  52. A$,8)="Sender: "
  53.  temp$=
  54. A$,9):sender$=
  55. getaddress(temp$)
  56. A$,12)="Errors-To: "
  57.  temp$=
  58. A$,9):errors$=
  59. getaddress(temp$)
  60. A$,5)="Bcc: " 
  61.  bcc$=
  62. A$,7):
  63.  note if Bcc: exists
  64.  fake continuation lines by faking extra "To:" lines...
  65. A$,1)<>" "
  66.  into%=
  67. A$,1)=" "
  68. into%<>0
  69.  A$="To:"+A$
  70. A$,4)="To: "
  71. A$,4)="Cc: "
  72. A$,5)="Bcc: " 
  73. 0+    l%=
  74. A$," "):to$=
  75. A$,l%+1):into%=
  76.     temp$=
  77. getaddress(to$)
  78. 2=    
  79.  temp$>""
  80. count%<tomax%
  81.  to$(count%)=temp$:count%+=1
  82.  to$=""
  83. count%=tomax%
  84.  A$=""
  85. cf(C1%)
  86.  override envelope return path with errors-to or sender header if present...
  87.  errors$>""
  88.  from$=errors$
  89.  sender$>""
  90.  from$=sender$
  91.  now take care of some error conditions...
  92.  to$(0)=""
  93. exit(1,"No recipients found")
  94.  from$=""
  95. exit(1,"Couldn't decode sender")
  96.  bcc$>""
  97. removebcc(N$)
  98.  test%
  99. "ka9q sendmail "+ver$+" test output: "+N$
  100. "Maximum recipients = ";tomax%
  101. "From: "+from$
  102. "To: "+to$(0)
  103.  l%=1
  104.  tomax%:
  105.  to$(l%)>""
  106. "    "+to$(l%)
  107. exit(0,"test run")
  108.  now first handle any local mail, saving to <NewsBase$Local>
  109.  local$>""
  110.  l%=0
  111.  count%-1
  112.   to$=to$(l%):tosite$=""
  113.  to$>""
  114.     at%=
  115. to$,"@")
  116. R<    
  117.  at%>0
  118.  tosite$=
  119. lower(
  120. to$,at%+1)):to$=
  121. to$,at%-1)
  122. S(    
  123.  tosite$=""
  124. tosite$=localhost$
  125. T-      
  126. localsave(N$,to$)<>0
  127.  to$(l%)=""
  128. U        
  129.  now make mqueue.work file...
  130.  three choices...
  131.  1) multiple recipients, smtp gateway defined; send as one file via gateway
  132.  2) single recipient, send direct
  133.  3) multiple recipients, no gateway; send separately directly.
  134.  count%>1
  135. gate$>""
  136.   seq%=
  137.   to$=to$(0)
  138. c5  test%=
  139. from$," "):
  140.  test%>1 from$=
  141. from$,test%)
  142. d)  o$=spooldir$+".mqueue.work."+
  143.  seq%
  144.   C%=
  145. openout(o$)
  146. f8    
  147.  C%=0 
  148. exit(1,"Couldn't open output work file")
  149. #C%,gate$
  150. #C%,from$
  151.  l%=0
  152.  count%-1
  153. j$      
  154.  to$(l%)>""
  155. #C%,to$(l%)
  156. k        
  157. cf(C%):
  158. settype(o$,&FFF)
  159. m)  o$=spooldir$+".mqueue.text."+
  160.  seq%
  161. n+  F%=
  162. movefile(N$,o$):
  163. settype(o$,&FFF)
  164. exit(1,"Couldn't move to spool area")
  165.  l%=0
  166.  count%-1
  167.     seq%=
  168.     to$=to$(l%)
  169.  to$>""
  170.       at%=
  171. to$,"@",1)+1
  172. v=      tosite$=
  173. to$,at%):
  174.  at%<1
  175. tosite$=""
  176.  tosite$=gate$
  177. wI      
  178.  tosite$=""
  179. exit(1,"Couldn't send; no destination or gateway")
  180. x9      test%=
  181. from$," "):
  182.  test%>1 from$=
  183. from$,test%)
  184. y-      o$=spooldir$+".mqueue.work."+
  185.  seq%
  186.       C%=
  187. openout(o$)
  188. {<        
  189.  C%=0 
  190. exit(1,"Couldn't open output work file")
  191.         
  192. #C%,tosite$
  193.         
  194. #C%,from$
  195.         
  196. #C%,to$
  197. %        
  198. cf(C%):
  199. settype(o$,&FFF)
  200. -      o$=spooldir$+".mqueue.text."+
  201.  seq%
  202. /      F%=
  203. copyfile(N$,o$):
  204. settype(o$,&FFF)
  205. 5      
  206. exit(1,"Couldn't move to spool area")
  207.         
  208.   F%=
  209. delfile(N$)
  210.  finished, so remove source file
  211. "remove "+N$
  212. exit(0,"Mail sent")
  213. movefile(s$,d$)
  214. "XOS_FSControl",25,s$,d$
  215. "XOS_FSControl",26,s$,d$,(1<<7) 
  216. copyfile(s$,d$)
  217. "XOS_FSControl",26,s$,d$ 
  218. delfile(f$)
  219. "XOS_File",6,f$
  220. exit(n%,a$)
  221. ("set NewsBase$ReturnCode "+
  222. ("set NewsBase$ReturnInfo "+a$)
  223. checkdirs
  224. objtype(spooldir$)<2 
  225. exit(1,spooldir$+" not found")
  226. ensuredir(spooldir$)
  227. ensuredir(spooldir$+".mqueue")
  228. ensuredir(spooldir$+".mqueue.text")
  229. ensuredir(spooldir$+".mqueue.work")
  230. objtype(spooldir$+".mqueue.text")<2 
  231. objtype(spooldir$+".mqueue.work")<2 
  232. exit(1,"SMTP spool directories not created")
  233. ensuredir(f$)
  234. objtype(f$)
  235.  t%<2
  236. "XOS_File",8,f$
  237. sget(h%)
  238.  return line from file without error if too long...
  239.  a$,C%
  240.  C%<>10:C%=
  241.  a$<253
  242. C%<>10
  243. C%<>13:a$+=
  244. objtype(f$)
  245. "XOS_File",17,f$
  246.  t%;F%
  247. settype(f$,t%)
  248. "XOS_File",18,f$,t%
  249.  h%<>0 
  250. "XOS_Find",0,h%:h%=0
  251. varval(A$)
  252.  L%,F%
  253. "XOS_ReadVarVal",A$,tmp%,256,0,3 
  254. ,,L%;F%
  255. L%>256 
  256. tmp%?L%=13:=$tmp%
  257. lower(A$)
  258.  B$,l%,c%,a%,z%,d%
  259. "A":z%=
  260. "Z":d%=
  261. "a"-a%
  262.  A$>0
  263.  l%=1
  264.   c%=
  265. A$,l%,1)
  266.  c%>=a%
  267. c%<=z%
  268.  c%+=d%
  269.   B$+=
  270. getaddress(
  271.  B$,C$,at%,end%,brack%
  272. B$="":at%=0:end%=0
  273. l%=0:
  274. end%=0
  275.   l%+=1:C$=
  276. A$,l%,1)
  277.  B$>""
  278.  end%=1
  279. *    
  280. "(":brack%=1:
  281.  l%+=1:C$=
  282. A$,l%,1)
  283.       
  284.  C$="\"
  285.  l%+=1
  286.       
  287.  C$="("
  288.  brack%+=1
  289.       
  290.  C$=")"
  291.  brack%-=1
  292.       
  293.  brack%<1
  294. "\":l%+=1
  295. $      B$="":
  296.  l%+=1:C$=
  297. A$,l%,1)
  298. +      
  299.  C$="\"
  300.  l%+=1:
  301.  C$<>">"B$+=C$
  302.       
  303.  C$=">"
  304. !      
  305.  at%>0
  306. B$,at%,1)="%"
  307.       B$+=C$:at%=
  308.  skip
  309. )    
  310. """":B$+=C$:
  311.  l%+=1:C$=
  312. A$,l%,1)
  313. ,      
  314.  C$="\"
  315.  l%+=1:
  316.  C$<>""""B$+=C$
  317. -      
  318.  C$=""""
  319.  C$=""""
  320.  B$+=C$
  321. :B$+=C$
  322. A$,l%+1)
  323.  read in sequence numer, and update
  324.  seq%,C%
  325. %seq$=spooldir$+".mqueue.sequence"
  326. objtype(seq$)=0 
  327.   seq%=1
  328. objtype(spooldir$+".mqueue.text."+
  329.  seq%)>0:seq%+=1:
  330. A  C%=
  331. openin(seq$):
  332.  C%=0 
  333. exit(1,"Can't open sequence file")
  334. "  seq%=
  335. #C%):
  336. cf(C%):seq%+=1
  337. openout(seq$):
  338.  seq%:
  339. cf(C%)
  340.     =seq%
  341. removebcc(d$)
  342.  f$,a$,r3%:f$=
  343. tmpfile
  344. openin(d$)
  345.  f1%>0
  346.   f2%=
  347. openout(f$)
  348.  f2%>0
  349.     inbcc%=
  350. sget(f1%)
  351.     !      
  352. A$,1)<>" "
  353.  inbcc%=
  354. #      
  355. A$,4)="Bcc:"
  356.  inbcc%=
  357.       
  358.  inbcc%=
  359. #f2%,A$
  360.  A$=""
  361.       r3%=0
  362. 7      
  363.  r3%=0:
  364. "XOS_GBPB",4,f1%,nbuf%,4096
  365. ,,,r3%
  366. 9        
  367.  r3%<4096
  368. "XOS_GBPB",2,f2%,nbuf%,4096-r3%
  369.       
  370.         
  371. "    
  372. cf(f2%):
  373. settype(f$,&FFF)
  374.         
  375. 6    
  376. exit(1,"Couldn't open temp file for mailing")
  377. cf(f1%):F%=
  378. delfile(d$)
  379. localsave(f$,to$)
  380.  o$,r3%,ok%
  381. ok%=0:o$=local$+"."+to$
  382. openin(f$)
  383.  f1%>0
  384.   f2%=
  385. openup(o$)
  386.  f2%>0
  387. #f2%=
  388. #f2%,"From "+
  389.       r3%=0
  390. &7      
  391.  r3%=0:
  392. "XOS_GBPB",4,f1%,nbuf%,4096
  393. ,,,r3%
  394. '9        
  395.  r3%<4096
  396. "XOS_GBPB",2,f2%,nbuf%,4096-r3%
  397.       
  398. )        
  399. #f2%,""
  400. +(    
  401. cf(f2%):
  402. settype(o$,&FFF):ok%=
  403. cf(f1%)
  404. openin(f$)
  405.  h%,F%
  406. "XOS_Find",&4F,f$ 
  407.  h%;F%:
  408. 1)<>0
  409.  h%=0
  410. openup(f$)
  411.  h%,F%
  412. "XOS_Find",&CF,f$
  413.  h%;F%
  414. "XOS_Find",&8F,f$
  415.  h%;F%:
  416. 1)<>0
  417.  h%=0
  418. openout(f$)
  419.  h%,F%
  420. "XOS_Find",&8F,f$
  421.  h%;F%:
  422. 1)<>0
  423.  h%=0
  424. getpar(
  425.  A$,s$)
  426.  B$,l%
  427. A$,s$)
  428.  l%>0
  429.   B$=
  430. A$,l%-1):A$=
  431. A$,l%+1)
  432.   B$=A$:A$=""
  433. tmpfile
  434.  f$="<NewsBase$Data>.scratch.tmp"+
  435. (10000))
  436. objtype(f$)=0
  437.