|
|
1.1 ! root 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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.