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
|
---|