| 1 | XMR3 ;ISC-SF/GMB-SMTP Receiver (RFC 822) ;07/01/2002  14:11 | 
|---|
| 2 | ;;8.0;MailMan;;Jun 28, 2002 | 
|---|
| 3 | DATA ; TEXT / ASSUMES VALID RECIPIENT | 
|---|
| 4 | ; Incoming Variables: | 
|---|
| 5 | ; XMINSTR("FWD BY")="" | 
|---|
| 6 | ; XMZ        message number of new message | 
|---|
| 7 | ; XMZFDA     FM FDA for new message | 
|---|
| 8 | ; XMZIENS    IENS for new message | 
|---|
| 9 | ; $D(XMC("DX"))  means Test mode: Messages will not be delivered | 
|---|
| 10 | ; If the msg is from a VA site, the following may be set: | 
|---|
| 11 | ; XMREMID    always set if the msg is from a VA site | 
|---|
| 12 | ; $G(XMRXMZ) message number of message we already have. | 
|---|
| 13 | ;            Set if new message is a duplicate of one we already have. | 
|---|
| 14 | N XMLIN,XMINCR,XMHDR,XMREJECT,XMSUBJ,XMFROM,XMDATE,XMENCR,XMZO,XMSENDER,XMREPLTO | 
|---|
| 15 | D GETDATA Q:ER | 
|---|
| 16 | I '$G(XMRXMZ),'$D(XMC("DX")) D HDRPROC Q:ER | 
|---|
| 17 | I '$G(XMREJECT),'$D(XMC("DX")) D SET | 
|---|
| 18 | S XMSTATE="^HELO^MAIL^" | 
|---|
| 19 | K ^TMP("XMY",$J),^TMP("XMY0",$J) | 
|---|
| 20 | D ZAPIT^XMXMSGS2(.5,.95,XMZ) | 
|---|
| 21 | I '$G(XMREJECT) D | 
|---|
| 22 | . S XMSG="250 'data' accepted" X XMSEN | 
|---|
| 23 | . D XMTHIST^XMTDR(XMINST,"R",$P($G(^XMB(3.9,XMZ,2,0)),U,4)) | 
|---|
| 24 | K XMNVFROM,XMINSTR,XMREMID,XMRXMZ,XMZ,XMZIENS,XMZFDA | 
|---|
| 25 | Q | 
|---|
| 26 | GETDATA ; | 
|---|
| 27 | N XMH | 
|---|
| 28 | S XMSG="354 Enter data" X XMSEN Q:ER | 
|---|
| 29 | S XMLIN=.001,XMINCR=.001,XMH="" | 
|---|
| 30 | F  X XMREC Q:ER  Q:XMRG="."  D | 
|---|
| 31 | . I $E(XMRG)="." S XMRG=$E(XMRG,2,999) | 
|---|
| 32 | . S XMLIN=XMLIN+XMINCR | 
|---|
| 33 | . S ^XMB(3.9,XMZ,2,XMLIN,0)=XMRG | 
|---|
| 34 | . Q:XMINCR=1 | 
|---|
| 35 | . I XMRG="" S XMINCR=1,XMLIN=0 Q | 
|---|
| 36 | . I XMLIN=.99 S XMINCR=.000001 | 
|---|
| 37 | . I $E(XMRG,1)=" "!($E(XMRG,1)=$C(9)) Q:XMH=""  D NEXT(XMH,.XMHDR,XMRG) Q | 
|---|
| 38 | . ;I $E(XMRG,1)=" " Q:XMH=""  D NEXT(XMH,.XMHDR,XMRG) | 
|---|
| 39 | . S XMH=$$UP^XLFSTR($P(XMRG,":")) | 
|---|
| 40 | . I "^DATE^FROM^IMPORTANCE^IN-REPLY-TO^MESSAGE-ID^SUBJECT^"[(U_XMH_U) S XMH=$E($TR(XMH,"-"),1,4),XMHDR(XMH)=$$SCRUB($P(XMRG,":",2,99)) Q | 
|---|
| 41 | . I "^ENCRYPTED^EXPIRY-DATE^REFERENCES^REPLY-TO^RETURN-RECEIPT-TO^SENDER^SENSITIVITY^"[(U_XMH_U) S XMH=$E($TR(XMH,"-"),1,4),XMHDR(XMH)=$$SCRUB($P(XMRG,":",2,99)) Q | 
|---|
| 42 | . I "^X-PRIORITY^"[(U_XMH_U) S XMH=$E($P(XMH,"-",2),1,4),XMHDR(XMH)=$$SCRUB($P(XMRG,":",2,99)) Q | 
|---|
| 43 | . I "^X-MM-BASKET^X-MM-CLOSED^X-MM-INFO-ONLY^X-MM-TYPE^"[(U_XMH_U) S XMH=$E($P(XMH,"-",3),1,4),XMHDR(XMH)=$$SCRUB($P(XMRG,":",2,99)) Q | 
|---|
| 44 | . S XMH="" | 
|---|
| 45 | Q:ER | 
|---|
| 46 | Q | 
|---|
| 47 | NEXT(XMH,XMHDR,XMDATA) ; | 
|---|
| 48 | N I | 
|---|
| 49 | S XMDATA=$$SCRUB(XMDATA) Q:XMDATA="" | 
|---|
| 50 | I XMHDR(XMH)="" S XMHDR(XMH)=XMDATA Q | 
|---|
| 51 | I $L(XMHDR(XMH))+$L(XMDATA)<255 S XMHDR(XMH)=XMHDR(XMH)_" "_XMDATA Q | 
|---|
| 52 | S I=$O(^XMHDR(XMH,":"),-1)+1 | 
|---|
| 53 | I $G(XMHDR(XMH,I))'="",$L(XMHDR(XMH,I))+$L(XMDATA)<255 S XMHDR(XMH,I)=$G(XMHDR(XMH,I))_" "_XMDATA Q | 
|---|
| 54 | S XMHDR(XMH,I+1)=XMDATA | 
|---|
| 55 | Q | 
|---|
| 56 | HDRPROC ; Process header commands | 
|---|
| 57 | N XMH,XMP,XMRINFO | 
|---|
| 58 | I XMLIN,$O(^XMB(3.9,XMZ,2,XMLIN)) D  Q | 
|---|
| 59 | . S XMREJECT=1 | 
|---|
| 60 | . S XMSG="500 Synchronization Lost.  Msg rejected." X XMSEN | 
|---|
| 61 | . D KILLIT^XMR3A | 
|---|
| 62 | ;I '$D(XMHDR("FROM")) D  Q | 
|---|
| 63 | ;. S XMREJECT=1 | 
|---|
| 64 | ;. S XMSG="501 Missing FROM Header.  Msg rejected." X XMSEN | 
|---|
| 65 | ;. D KILLIT^XMR3A | 
|---|
| 66 | I $$TOOLONG D  Q | 
|---|
| 67 | . S XMREJECT=1 | 
|---|
| 68 | . S XMSG="551 Too many lines.  Msg rejected." X XMSEN | 
|---|
| 69 | . D KILLIT^XMR3A | 
|---|
| 70 | I '$D(XMREMID) S XMREMID="" | 
|---|
| 71 | S (XMH,XMZO,XMFROM,XMENCR,XMSENDER,XMDATE,XMSUBJ)="" | 
|---|
| 72 | F  S XMH=$O(XMHDR(XMH)) Q:XMH=""  D | 
|---|
| 73 | . S XMP=XMHDR(XMH) | 
|---|
| 74 | . D @XMH | 
|---|
| 75 | I '$O(^XMB(3.9,XMZ,2,.999999)),'$D(XMZFDA(3.9,XMZIENS,.01)) D  Q | 
|---|
| 76 | . S XMSG="552 No subject or text.  Msg rejected." X XMSEN | 
|---|
| 77 | . D KILLIT^XMR3A | 
|---|
| 78 | . S XMREJECT=1 | 
|---|
| 79 | I $G(XMRINFO) D  Q | 
|---|
| 80 | . S XMSG="555 Reply to 'Info Only'.  Msg rejected." X XMSEN | 
|---|
| 81 | . D KILLIT^XMR3A | 
|---|
| 82 | . S XMREJECT=1 | 
|---|
| 83 | ;I $G(XMZFDA(3.9,XMZIENS,9))="" D  Q | 
|---|
| 84 | ;. S XMSG="501 No MESSAGE-ID.  Msg rejected." X XMSEN | 
|---|
| 85 | ;. D KILLIT^XMR3A | 
|---|
| 86 | ;. S XMREJECT=1 | 
|---|
| 87 | ;I '$O(^XMB(3.9,XMZ,2,.999999)) S ^XMB(3.9,XMZ,2,1,0)=" " | 
|---|
| 88 | S ^XMB(3.9,XMZ,2,0)="^^"_XMLIN_U_XMLIN | 
|---|
| 89 | Q | 
|---|
| 90 | TOOLONG() ; | 
|---|
| 91 | N XMLIMIT | 
|---|
| 92 | S XMLIMIT=$P($G(^XMB(1,1,"NETWORK-LIMIT")),U,2) | 
|---|
| 93 | Q:'XMLIMIT 0 | 
|---|
| 94 | Q:$G(XM2LONG) 1 | 
|---|
| 95 | Q:XMLIN'>XMLIMIT 0 | 
|---|
| 96 | I $G(XMHDR("TYPE"))["X"!($G(XMHDR("TYPE"))["K") Q 0 | 
|---|
| 97 | Q 1 | 
|---|
| 98 | SCRUB(X) ; Strip ctrl chars and leading/trailing blanks | 
|---|
| 99 | S:X?.E1C.E X=$$CTRL^XMXUTIL1(X) | 
|---|
| 100 | S:$E(X,1)=" "!($E(X,$L(X))=" ") X=$$STRIP^XMXUTIL1(X) | 
|---|
| 101 | Q X | 
|---|
| 102 | BASK ; "X-MM-BASKET:" (Delivery Basket) | 
|---|
| 103 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,21)=XMP | 
|---|
| 104 | Q | 
|---|
| 105 | CLOS ; "X-MM-CLOSED:YES" | 
|---|
| 106 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.95)="y" | 
|---|
| 107 | Q | 
|---|
| 108 | DATE ; "DATE:" | 
|---|
| 109 | S XMDATE=XMP | 
|---|
| 110 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.4)=XMDATE | 
|---|
| 111 | Q | 
|---|
| 112 | ENCR ; "ENCRYPT:" | 
|---|
| 113 | S XMENCR=XMP | 
|---|
| 114 | Q:'$D(XMZIENS) | 
|---|
| 115 | S XMZFDA(3.9,XMZIENS,1.8)=$P(XMENCR,U,1)        ; scramble hint | 
|---|
| 116 | S XMZFDA(3.9,XMZIENS,1.85)=$P(XMENCR,U,2,999)   ; scramble key | 
|---|
| 117 | Q | 
|---|
| 118 | EXPI ; "EXPIRY-DATE:" (vaporize date) | 
|---|
| 119 | N XMVAPOR | 
|---|
| 120 | S XMVAPOR=$$CONVERT^XMXUTIL1(XMP,1) Q:XMVAPOR=-1 | 
|---|
| 121 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.6)=XMVAPOR | 
|---|
| 122 | Q | 
|---|
| 123 | FROM ; "FROM:" | 
|---|
| 124 | S XMFROM=XMP | 
|---|
| 125 | Q:'$D(XMZIENS) | 
|---|
| 126 | ;I $D(XMHDR("FROM",1)) D CONTINU(.XMFROM,"FROM",.XMHDR) | 
|---|
| 127 | S XMZFDA(3.9,XMZIENS,1)=XMFROM | 
|---|
| 128 | Q | 
|---|
| 129 | CONTINU(XMVBL,XMH,XMHDR) ; | 
|---|
| 130 | N I | 
|---|
| 131 | S I=0 | 
|---|
| 132 | F  S I=$O(XMHDR(XMH,I)) Q:'I  S XMVBL=XMVBL_" "_XMHDR(XMH,I) | 
|---|
| 133 | Q | 
|---|
| 134 | IMPO ; "IMPORTANCE:HIGH" (Priority) | 
|---|
| 135 | I $$UP^XLFSTR(XMP)'="HIGH"!'$D(XMZIENS) Q | 
|---|
| 136 | S:$G(XMZFDA(3.9,XMZIENS,1.7))'["P" XMZFDA(3.9,XMZIENS,1.7)=$G(XMZFDA(3.9,XMZIENS,1.7))_"P" | 
|---|
| 137 | Q | 
|---|
| 138 | INFO ; "X-MM-INFO-ONLY:YES" | 
|---|
| 139 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.97)="y" | 
|---|
| 140 | Q | 
|---|
| 141 | REFE ; "REFERENCES:" (used by some systems, instead of 'in-reply-to') | 
|---|
| 142 | Q | 
|---|
| 143 | INRE ; "IN-REPLY-TO:" message at this site | 
|---|
| 144 | N I,XMLOCID,XMREC | 
|---|
| 145 | S XMLOCID=$$REMID(XMP) | 
|---|
| 146 | S XMZO=$$LOCALXMZ^XMR3A(XMLOCID) | 
|---|
| 147 | Q:'XMZO | 
|---|
| 148 | I $P(XMZO,U,3)'="E" S XMZO="" Q | 
|---|
| 149 | S XMZO=+XMZO | 
|---|
| 150 | S XMREC=$G(^XMB(3.9,XMZO,0)) | 
|---|
| 151 | I $P(XMREC,U,8) D  ; If reply to a reply, get original msg # | 
|---|
| 152 | . S XMZO=$P(XMREC,U,8) | 
|---|
| 153 | . S XMREC=$G(^XMB(3.9,XMZO,0)) | 
|---|
| 154 | I XMREC="" S XMZO="" Q  ; Original message not found, so make this reply a message. | 
|---|
| 155 | I "^y^Y^"[(U_$P(XMREC,U,12)_U) S XMRINFO=1 Q  ; Reply to 'info only' msg | 
|---|
| 156 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.35)=XMZO  ; Point from response to original msg | 
|---|
| 157 | Q | 
|---|
| 158 | REMID(X) ; | 
|---|
| 159 | Q:X["<" $TR($P(X,">",1),"<") | 
|---|
| 160 | ; I've seen some like this: "<<...>>" | 
|---|
| 161 | ; I've seen some like this: "<...>; comment here" | 
|---|
| 162 | Q X | 
|---|
| 163 | MESS ; "MESSAGE-ID:" at site where message originated | 
|---|
| 164 | S XMREMID=$$REMID(XMP) | 
|---|
| 165 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,9)=XMREMID | 
|---|
| 166 | Q | 
|---|
| 167 | PRIO ; "X-PRIORITY:1" (Priority) | 
|---|
| 168 | I $$UP^XLFSTR(XMP)'=1!'$D(XMZIENS) Q | 
|---|
| 169 | S:$G(XMZFDA(3.9,XMZIENS,1.7))'["P" XMZFDA(3.9,XMZIENS,1.7)=$G(XMZFDA(3.9,XMZIENS,1.7))_"P" | 
|---|
| 170 | Q | 
|---|
| 171 | REPL ; "REPLY-TO:" | 
|---|
| 172 | S XMREPLTO=XMP | 
|---|
| 173 | ;I $D(XMHDR("REPL",1)) D CONTINU(.XMREPLTO,"REPL",.XMHDR) | 
|---|
| 174 | Q | 
|---|
| 175 | RETU ; "RETURN-RECEIPT-TO:" | 
|---|
| 176 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.3)="y" | 
|---|
| 177 | Q | 
|---|
| 178 | SEND ; "SENDER:" (Surrogate) | 
|---|
| 179 | S XMSENDER=XMP | 
|---|
| 180 | ;I $D(XMHDR("SEND",1)) D CONTINU(.XMSENDER,"SEND",.XMHDR) | 
|---|
| 181 | Q:XMSENDER=$G(XMFROM) | 
|---|
| 182 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.1)=XMSENDER | 
|---|
| 183 | Q | 
|---|
| 184 | SENS ; "SENSITIVITY:PERSONAL" (Confidential) | 
|---|
| 185 | Q:"^PERSONAL^PRIVATE^COMPANY-CONFIDENTIAL^"'[(U_$$UP^XLFSTR(XMP)_U) | 
|---|
| 186 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.96)="y" | 
|---|
| 187 | Q | 
|---|
| 188 | SUBJ ; "SUBJECT:" | 
|---|
| 189 | S XMSUBJ=XMP | 
|---|
| 190 | I XMSUBJ["   " S XMSUBJ=$$MAXBLANK^XMXUTIL1(XMSUBJ) | 
|---|
| 191 | I XMSUBJ["^" S XMSUBJ=$$ENCODEUP^XMXUTIL1(XMSUBJ) | 
|---|
| 192 | S XMSUBJ=$E(XMSUBJ,1,65) | 
|---|
| 193 | Q:XMSUBJ=""!'$D(XMZIENS) | 
|---|
| 194 | I $L(XMSUBJ)<3 S XMSUBJ="..." | 
|---|
| 195 | S XMZFDA(3.9,XMZIENS,.01)=XMSUBJ | 
|---|
| 196 | Q | 
|---|
| 197 | TYPE ; "X-MM-TYPE:" | 
|---|
| 198 | S:$D(XMZIENS) XMZFDA(3.9,XMZIENS,1.7)=XMP | 
|---|
| 199 | Q | 
|---|
| 200 | SET ; Set data into message file | 
|---|
| 201 | I $G(XMREMID)'="" D CHEKDUP^XMR3A Q:$G(XMREJECT) | 
|---|
| 202 | I $D(XMZFDA) D | 
|---|
| 203 | . I $D(XMZFDA(3.9,XMZIENS,1.1)),$L(XMZFDA(3.9,XMZIENS,1))+$L(XMZFDA(3.9,XMZIENS,1.1))>130 S XMZFDA(3.9,XMZIENS,1.1)=$E($$REMADDR^XMXADDR3(XMZFDA(3.9,XMZIENS,1.1)),1,64) | 
|---|
| 204 | . I $L(XMZFDA(3.9,XMZIENS,1))>100 S XMZFDA(3.9,XMZIENS,1)="<"_$$REMADDR^XMXADDR3(XMZFDA(3.9,XMZIENS,1))_">" | 
|---|
| 205 | . D FILE^DIE("","XMZFDA") | 
|---|
| 206 | ;SENDER only RCPT / REMOTE sender drops thru (local>0=pointer) | 
|---|
| 207 | I $G(XMZO) D  Q:$O(^TMP("XMY",$J,""))  ; I don't understand this. | 
|---|
| 208 | . D DOTRAN^XMC1(42315,XMZ,XMZO) ;> Putting response |1| into message |2| | 
|---|
| 209 | . D DOTRAN^XMC1(42316,XMZO)     ;> Delivering message |1| | 
|---|
| 210 | . D RPOST^XMKP("NR",XMZO,XMZ) | 
|---|
| 211 | D FWD^XMKP(.5,XMZ,.XMINSTR) | 
|---|
| 212 | D CHECK^XMKPL | 
|---|
| 213 | Q | 
|---|
| 214 | PARSE(XMZ,XMREMID,XMSUBJ,XMFROM,XMDATE,XMSENDER,XMENCR,XMZO) ; Get data for remotely originated message | 
|---|
| 215 | ; This is used by ^XMRENT & ^XMS3 | 
|---|
| 216 | ; XMSUBJ   subject | 
|---|
| 217 | ; XMFROM   from | 
|---|
| 218 | ; XMDATE   date | 
|---|
| 219 | ; XMENCR   scramble hint "^" scramble key | 
|---|
| 220 | ; XMREMID  message id at site where msg originated (not necessarily at the sending site) | 
|---|
| 221 | ; XMZO     original message xmz (to which this msg is a response) | 
|---|
| 222 | N XMP,XMH,XMHDR,XMRINFO,XMZFDA,XMZIENS,XMFIND | 
|---|
| 223 | ; Don't add anything to this list: | 
|---|
| 224 | S XMFIND="^DATE^ENCRYPTED^FROM^IN-REPLY-TO^MESSAGE-ID^SENDER^SUBJECT^" | 
|---|
| 225 | D HDRFIND(XMZ,XMFIND,.XMHDR) | 
|---|
| 226 | S XMH="" | 
|---|
| 227 | F  S XMH=$O(XMHDR(XMH)) Q:XMH=""  D | 
|---|
| 228 | . S XMP=XMHDR(XMH) | 
|---|
| 229 | . D @XMH | 
|---|
| 230 | Q | 
|---|
| 231 | HDRFIND(XMZ,XMFIND,XMHDR) ; | 
|---|
| 232 | N XMH,XMI,XMREC | 
|---|
| 233 | I XMFIND'?1"^".E1"^" D | 
|---|
| 234 | . I $E(XMFIND,1)'=U S XMFIND=U_XMFIND | 
|---|
| 235 | . I $E(XMFIND,$L(XMFIND))'=U S XMFIND=XMFIND_U | 
|---|
| 236 | S XMI=0 | 
|---|
| 237 | F  S XMI=$O(^XMB(3.9,XMZ,2,XMI)) Q:XMI'<1!'XMI  S XMREC=^(XMI,0) Q:XMREC=""  D | 
|---|
| 238 | . I $E(XMREC,1)=" "!($E(XMREC,1)=$C(9)) Q:XMH=""  D NEXT(XMH,.XMHDR,XMREC) Q | 
|---|
| 239 | . S XMH=$$UP^XLFSTR($P(XMREC,":")) | 
|---|
| 240 | . I XMFIND'[(U_XMH_U) S XMH="" Q | 
|---|
| 241 | . I "^DATE^FROM^IMPORTANCE^IN-REPLY-TO^MESSAGE-ID^SUBJECT^"[(U_XMH_U) S XMH=$E($TR(XMH,"-"),1,4),XMHDR(XMH)=$$SCRUB($P(XMREC,":",2,99)) Q | 
|---|
| 242 | . I "^ENCRYPTED^EXPIRY-DATE^REFERENCES^REPLY-TO^RETURN-RECEIPT-TO^SENDER^SENSITIVITY^"[(U_XMH_U) S XMH=$E($TR(XMH,"-"),1,4),XMHDR(XMH)=$$SCRUB($P(XMREC,":",2,99)) Q | 
|---|
| 243 | . I "^X-PRIORITY^"[(U_XMH_U) S XMH=$E($P(XMH,"-",2),1,4),XMHDR(XMH)=$$SCRUB($P(XMREC,":",2,99)) Q | 
|---|
| 244 | . I "^X-MM-BASKET^X-MM-CLOSED^X-MM-INFO-ONLY^X-MM-TYPE^"[(U_XMH_U) S XMH=$E($P(XMH,"-",3),1,4),XMHDR(XMH)=$$SCRUB($P(XMREC,":",2,99)) Q | 
|---|
| 245 | . S XMH="" | 
|---|
| 246 | Q | 
|---|