home *** CD-ROM | disk | FTP | other *** search
/ PC Online 1998 September / PCO_0998.ISO / filesbbs / dos / sbbs_src.exe / SBBS / BULKMAIL.C < prev    next >
Encoding:
C/C++ Source or Header  |  1997-04-13  |  5.5 KB  |  220 lines

  1. #line 1 "BULKMAIL.C"
  2.  
  3. /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */
  4.  
  5. #include "sbbs.h"
  6.  
  7. int bulkmailhdr(int usernum, smbmsg_t *msg, ushort msgattr, ulong offset
  8.     , ulong length, char *title)
  9. {
  10.     char str[256];
  11.     int i,j;
  12.     node_t node;
  13.  
  14. memset(msg,0,sizeof(smbmsg_t));
  15. memcpy(msg->hdr.id,"SHD\x1a",4);
  16. msg->hdr.version=SMB_VERSION;
  17. msg->hdr.attr=msg->idx.attr=msgattr;
  18. msg->hdr.when_written.time=msg->hdr.when_imported.time=time(NULL);
  19. msg->hdr.when_written.zone=msg->hdr.when_imported.zone=sys_timezone;
  20. msg->hdr.offset=msg->idx.offset=offset;
  21.  
  22. username(usernum,str);
  23. smb_hfield(msg,RECIPIENT,strlen(str),str);
  24. strlwr(str);
  25.  
  26. sprintf(str,"%u",usernum);
  27. smb_hfield(msg,RECIPIENTEXT,strlen(str),str);
  28. msg->idx.to=usernum;
  29.  
  30. strcpy(str,useron.alias);
  31. smb_hfield(msg,SENDER,strlen(str),str);
  32. strlwr(str);
  33.  
  34. sprintf(str,"%u",useron.number);
  35. smb_hfield(msg,SENDEREXT,strlen(str),str);
  36. msg->idx.from=useron.number;
  37.  
  38. strcpy(str,title);
  39. smb_hfield(msg,SUBJECT,strlen(str),str);
  40. strlwr(str);
  41. msg->idx.subj=crc16(str);
  42.  
  43. smb_dfield(msg,TEXT_BODY,length);
  44.  
  45. j=smb_addmsghdr(&smb,msg,SMB_SELFPACK);
  46. if(j)
  47.     return(j);
  48.  
  49. // smb_incdat(&smb,offset,length,1); Remove 04/15/96
  50. lncntr=0;
  51. bprintf("Bulk Mailed %s #%d\r\n",username(usernum,tmp),usernum);
  52. sprintf(str,"Bulk Mailed %s #%d",username(usernum,tmp),usernum);
  53. logline("E+",str);
  54. useron.emails++;
  55. logon_emails++;
  56. useron.etoday++;
  57. for(i=1;i<=sys_nodes;i++) { /* Tell user, if online */
  58.     getnodedat(i,&node,0);
  59.     if(node.useron==usernum && !(node.misc&NODE_POFF)
  60.         && (node.status==NODE_INUSE || node.status==NODE_QUIET)) {
  61.         sprintf(str,text[EmailNodeMsg],node_num,useron.alias);
  62.         putnmsg(i,str);
  63.         break; } }
  64. if(i>sys_nodes) {   /* User wasn't online, so leave short msg */
  65.     sprintf(str,text[UserSentYouMail],useron.alias);
  66.     putsmsg(usernum,str); }
  67. return(0);
  68. }
  69.  
  70. void bulkmail(uchar *ar)
  71. {
  72.     char    str[256],str2[256],msgpath[256],title[LEN_TITLE+1],ch
  73.             ,buf[SDT_BLOCK_LEN],found=0;
  74.     ushort    xlat=XLAT_NONE,msgattr=0;
  75.     int     i,j,k,x,file;
  76.     long    l,msgs=0;
  77.     ulong    length,offset;
  78.     FILE    *instream;
  79.     user_t    user;
  80.     smbmsg_t msg;
  81.  
  82. memset(&msg,0,sizeof(smbmsg_t));
  83.  
  84. title[0]=0;
  85. action=NODE_SMAL;
  86. nodesync();
  87.  
  88. if(sys_misc&SM_ANON_EM && (SYSOP || useron.exempt&FLAG('A'))
  89.     && !noyes(text[AnonymousQ]))
  90.     msgattr|=MSG_ANONYMOUS;
  91.  
  92. sprintf(msgpath,"%sINPUT.MSG",node_dir);
  93. sprintf(str2,"Bulk Mailing");
  94. if(!writemsg(msgpath,nulstr,title,WM_EMAIL,0,str2)) {
  95.     bputs(text[Aborted]);
  96.     return; }
  97.  
  98. bputs(text[WritingIndx]);
  99. CRLF;
  100.  
  101. if((i=smb_stack(&smb,SMB_STACK_PUSH))!=0) {
  102.     errormsg(WHERE,ERR_OPEN,"MAIL",i);
  103.     return; }
  104. sprintf(smb.file,"%sMAIL",data_dir);
  105. smb.retry_time=smb_retry_time;
  106. if((i=smb_open(&smb))!=0) {
  107.     smb_stack(&smb,SMB_STACK_POP);
  108.     errormsg(WHERE,ERR_OPEN,smb.file,i);
  109.     return; }
  110.  
  111. if(filelength(fileno(smb.shd_fp))<1) {     /* Create it if it doesn't exist */
  112.     smb.status.max_crcs=mail_maxcrcs;
  113.     smb.status.max_msgs=MAX_SYSMAIL;
  114.     smb.status.max_age=mail_maxage;
  115.     smb.status.attr=SMB_EMAIL;
  116.     if((i=smb_create(&smb))!=0) {
  117.         smb_close(&smb);
  118.         smb_stack(&smb,SMB_STACK_POP);
  119.         errormsg(WHERE,ERR_CREATE,smb.file,i);
  120.         return; } }
  121.  
  122. length=flength(msgpath)+2;     /* +2 for translation string */
  123.  
  124. if(length&0xfff00000UL) {
  125.     smb_close(&smb);
  126.     smb_stack(&smb,SMB_STACK_POP);
  127.     errormsg(WHERE,ERR_LEN,smb.file,length);
  128.     return; }
  129.  
  130. if((i=smb_open_da(&smb))!=0) {
  131.     smb_close(&smb);
  132.     smb_stack(&smb,SMB_STACK_POP);
  133.     errormsg(WHERE,ERR_OPEN,smb.file,i);
  134.     return; }
  135. if(sys_misc&SM_FASTMAIL)
  136.     offset=smb_fallocdat(&smb,length,1);
  137. else
  138.     offset=smb_allocdat(&smb,length,1);
  139. smb_close_da(&smb);
  140.  
  141. if((file=open(msgpath,O_RDONLY|O_BINARY))==-1
  142.     || (instream=fdopen(file,"rb"))==NULL) {
  143.     smb_freemsgdat(&smb,offset,length,1);
  144.     smb_close(&smb);
  145.     smb_stack(&smb,SMB_STACK_POP);
  146.     errormsg(WHERE,ERR_OPEN,msgpath,O_RDONLY|O_BINARY);
  147.     return; }
  148.  
  149. setvbuf(instream,NULL,_IOFBF,2*1024);
  150. fseek(smb.sdt_fp,offset,SEEK_SET);
  151. xlat=XLAT_NONE;
  152. fwrite(&xlat,2,1,smb.sdt_fp);
  153. x=SDT_BLOCK_LEN-2;                /* Don't read/write more than 255 */
  154. while(!feof(instream)) {
  155.     memset(buf,0,x);
  156.     j=fread(buf,1,x,instream);
  157.     if((j!=x || feof(instream)) && buf[j-1]==LF && buf[j-2]==CR)
  158.         buf[j-1]=buf[j-2]=0;
  159.     fwrite(buf,j,1,smb.sdt_fp);
  160.     x=SDT_BLOCK_LEN; }
  161. fflush(smb.sdt_fp);
  162. fclose(instream);
  163.  
  164. j=lastuser();
  165. x=0;
  166.  
  167. if(*ar)
  168.     for(i=1;i<=j;i++) {
  169.         user.number=i;
  170.         getuserdat(&user);
  171.         if(user.misc&(DELETED|INACTIVE))
  172.             continue;
  173.         if(chk_ar(ar,user)) {
  174.             if(found)
  175.                 smb_freemsgmem(&msg);
  176.             x=bulkmailhdr(i,&msg,msgattr,offset,length,title);
  177.             if(x)
  178.                 break;
  179.             msgs++;
  180.             found=1; } }
  181. else
  182.     while(1) {
  183.         bputs(text[EnterAfterLastDestUser]);
  184.         if(!getstr(str,LEN_ALIAS,K_UPRLWR))
  185.             break;
  186.         if((i=finduser(str))!=0) {
  187.             if(found)
  188.                 smb_freemsgmem(&msg);
  189.             x=bulkmailhdr(i,&msg,msgattr,offset,length,title);
  190.             if(x)
  191.                 break;
  192.             msgs++; }
  193.         found=1; }
  194.  
  195. if((i=smb_open_da(&smb))!=0) {
  196.     smb_close(&smb);
  197.     smb_stack(&smb,SMB_STACK_POP);
  198.     errormsg(WHERE,ERR_OPEN,smb.file,i);
  199.     return; }
  200. if(!msgs)
  201.     smb_freemsgdat(&smb,offset,length,1);
  202. else if(msgs>1)
  203.     smb_incdat(&smb,offset,length,msgs-1);
  204. smb_close_da(&smb);
  205.  
  206. smb_close(&smb);
  207. smb_stack(&smb,SMB_STACK_POP);
  208.  
  209. smb_freemsgmem(&msg);
  210. if(x) {
  211.     smb_freemsgdat(&smb,offset,length,1);
  212.     errormsg(WHERE,ERR_WRITE,smb.file,x);
  213.     return; }
  214.  
  215. putuserrec(useron.number,U_EMAILS,5,itoa(useron.emails,tmp,10));
  216. putuserrec(useron.number,U_ETODAY,5,itoa(useron.etoday,tmp,10));
  217. }
  218.  
  219.  
  220.