| 1 | XMS3 ;ISC-SF/GMB-SMTP Send (RFC 822) ;04/15/2003  12:44
 | 
|---|
| 2 |  ;;8.0;MailMan;**18**;Jun 28, 2002
 | 
|---|
| 3 |  ; Entry points (DBIA 10073):
 | 
|---|
| 4 |  ; REC   Get the next line of message text
 | 
|---|
| 5 |  Q
 | 
|---|
| 6 | HEADER(XMZ,XMZREC,XMFROM,XMNETNAM) ; RFC 822 - Header Records
 | 
|---|
| 7 |  ; These records are what you see when you do a "QN" at the prompt:
 | 
|---|
| 8 |  ; "Message Action: Ignore//"
 | 
|---|
| 9 |  S XMSG="Subject: "_$S($P(XMZREC,U)=$$EZBLD^DIALOG(34012):"",1:$P(XMZREC,U)) X XMSEN Q:ER
 | 
|---|
| 10 |  S XMSG="Date: "_$$INDT^XMXUTIL1($P(XMZREC,U,3)) X XMSEN Q:ER
 | 
|---|
| 11 |  S XMSG="Message-ID: <"_$$NETID(XMZ)_">" X XMSEN Q:ER
 | 
|---|
| 12 |  I $D(^XMB(3.9,XMZ,"IN")) D  Q:ER
 | 
|---|
| 13 |  . N XMINRE
 | 
|---|
| 14 |  . S XMINRE=^XMB(3.9,XMZ,"IN")
 | 
|---|
| 15 |  . I $P(XMINRE,"@",1)?.E1".VA.GOV"!($P(XMINRE,"@",2)?.N) S XMINRE=$P(XMINRE,"@",2)_"@"_$P(XMINRE,"@")
 | 
|---|
| 16 |  . S XMSG="In-reply-to: <"_XMINRE_">" X XMSEN
 | 
|---|
| 17 |  I "^Y^y^"[(U_$P(XMZREC,U,5)_U) D  Q:ER
 | 
|---|
| 18 |  . S XMSG="Return-Receipt-To: "_XMFROM X XMSEN
 | 
|---|
| 19 |  I $D(^XMB(3.9,XMZ,"K")) D  Q:ER
 | 
|---|
| 20 |  . S XMSG="Encrypted: "_$P(XMZREC,U,10)_U_^("K") X XMSEN
 | 
|---|
| 21 |  I $P(XMZREC,U,4)'="" D  Q:ER
 | 
|---|
| 22 |  . S XMSG="Sender: "_$$FROM^XMS1($P(XMZREC,U,4),XMNETNAM) X XMSEN
 | 
|---|
| 23 |  S XMSG="From: "_XMFROM X XMSEN Q:ER
 | 
|---|
| 24 |  I $P(XMZREC,U,6)'="" D  Q:ER
 | 
|---|
| 25 |  . S XMSG="Expiry-Date: "_$$INDT^XMXUTIL1($P(XMZREC,U,6)) X XMSEN
 | 
|---|
| 26 |  I $P(XMZREC,U,7)["P" D  Q:ER
 | 
|---|
| 27 |  . S XMSG="Importance: high" X XMSEN Q:ER
 | 
|---|
| 28 |  . S XMSG="X-Priority: 1" X XMSEN
 | 
|---|
| 29 |  I "^Y^y^"[(U_$P(XMZREC,U,11)_U) D  Q:ER
 | 
|---|
| 30 |  . S XMSG="Sensitivity: Private" X XMSEN
 | 
|---|
| 31 |  I $D(^XMB(3.9,XMZ,.5)) D  Q:ER
 | 
|---|
| 32 |  . N XMZBSKT
 | 
|---|
| 33 |  . S XMZBSKT=$P($G(^XMB(3.9,XMZ,.5)),U,1)
 | 
|---|
| 34 |  . Q:XMZBSKT=""
 | 
|---|
| 35 |  . S XMSG="X-MM-Basket: "_XMZBSKT X XMSEN
 | 
|---|
| 36 |  I $P(XMZREC,U,7)'="",$P(XMZREC,U,7)'="P" D  Q:ER
 | 
|---|
| 37 |  . S XMSG="X-MM-Type: "_$P(XMZREC,U,7) X XMSEN
 | 
|---|
| 38 |  I "^Y^y^"[(U_$P(XMZREC,U,9)_U) D  Q:ER
 | 
|---|
| 39 |  . S XMSG="X-MM-Closed: YES" X XMSEN
 | 
|---|
| 40 |  I "^Y^y^"[(U_$P(XMZREC,U,12)_U) D  Q:ER
 | 
|---|
| 41 |  . S XMSG="X-MM-Info-Only: YES" X XMSEN
 | 
|---|
| 42 |  D TOLIST(XMZ,XMNETNAM) Q:ER
 | 
|---|
| 43 |  Q
 | 
|---|
| 44 | NETID(XMZ) ;
 | 
|---|
| 45 |  N XMCRE8
 | 
|---|
| 46 |  S XMCRE8=$P($G(^XMB(3.9,XMZ,.6)),U,1)
 | 
|---|
| 47 |  I 'XMCRE8 D
 | 
|---|
| 48 |  . S XMCRE8=$P($G(^XMB(3.9,XMZ,0)),U,3)
 | 
|---|
| 49 |  . I $P(XMCRE8,".")?7N S XMCRE8=$P(XMCRE8,".")
 | 
|---|
| 50 |  . E  D
 | 
|---|
| 51 |  . . S XMCRE8=$$CONVERT^XMXUTIL1(XMCRE8)
 | 
|---|
| 52 |  . . I XMCRE8=-1 S XMCRE8=DT
 | 
|---|
| 53 |  . S $P(^XMB(3.9,XMZ,.6),U,1)=XMCRE8
 | 
|---|
| 54 |  . S ^XMB(3.9,"C",XMCRE8,XMZ)=""
 | 
|---|
| 55 |  N XMREMID
 | 
|---|
| 56 |  I $D(^XMB(3.9,XMZ,5)) D  Q:XMREMID'="" XMREMID
 | 
|---|
| 57 |  . S XMREMID=^XMB(3.9,XMZ,5)
 | 
|---|
| 58 |  . I $P(XMREMID,"@",1)?.E1".VA.GOV"!($P(XMREMID,"@",2)?.N) S XMREMID=$P(XMREMID,"@",2)_"@"_$P(XMREMID,"@")
 | 
|---|
| 59 |  . Q:XMREMID'=""
 | 
|---|
| 60 |  . D PARSE^XMR3(XMZ,.XMREMID)
 | 
|---|
| 61 |  ;Q XMZ_"@"_^XMB("NETNAME")
 | 
|---|
| 62 |  Q XMZ_"."_XMCRE8_"@"_^XMB("NETNAME")
 | 
|---|
| 63 | TOLIST(XMZ,XMNETNAM) ;
 | 
|---|
| 64 |  N XMTO,XMIEN
 | 
|---|
| 65 |  S XMIEN=$O(^XMB(3.9,XMZ,6,0)),XMSG="To: "_$$TOFORMAT($P(^XMB(3.9,XMZ,6,XMIEN,0),U,1),$S($G(XMC("MAILMAN")):$P(^(0),U,2),1:""))
 | 
|---|
| 66 |  F  S XMIEN=$O(^XMB(3.9,XMZ,6,XMIEN)) Q:'XMIEN!(XMIEN>50)  D  Q:ER
 | 
|---|
| 67 |  . S XMTO=$$TOFORMAT($P(^XMB(3.9,XMZ,6,XMIEN,0),U,1),$S($G(XMC("MAILMAN")):$P(^(0),U,2),1:""))
 | 
|---|
| 68 |  . S XMSG=XMSG_","
 | 
|---|
| 69 |  . I $L(XMSG)+$L(XMTO)>80 D TOSEND(.XMSG) Q:ER
 | 
|---|
| 70 |  . S XMSG=XMSG_" "_XMTO
 | 
|---|
| 71 |  Q:ER
 | 
|---|
| 72 |  D TOSEND(.XMSG) Q:ER
 | 
|---|
| 73 |  I XMIEN>50 S XMSG="(Too many recipients to list...)" D TOSEND(.XMSG) Q:ER
 | 
|---|
| 74 |  Q
 | 
|---|
| 75 | TOFORMAT(XMTO,XMPREFIX) ;
 | 
|---|
| 76 |  N XMDOM
 | 
|---|
| 77 |  S XMDOM=$S(XMTO["@":$P(XMTO,"@",2,99),1:XMNETNAM)
 | 
|---|
| 78 |  S XMTO=$$TO($P(XMTO,"@"))
 | 
|---|
| 79 |  Q $S(XMPREFIX="":"",$E(XMTO,1)=$C(34):"",1:XMPREFIX_":")_XMTO_"@"_XMDOM
 | 
|---|
| 80 | TO(XMTO) ;
 | 
|---|
| 81 |  I $E(XMTO)'=$C(34),(XMTO[",")!(XMTO[" ") D
 | 
|---|
| 82 |  . I XMTO["," S XMTO=$TR(XMTO,", .","._+")
 | 
|---|
| 83 |  . I XMTO[" " S XMTO=$C(34)_XMTO_$C(34)
 | 
|---|
| 84 |  Q XMTO
 | 
|---|
| 85 | TOSEND(XMSG) ;
 | 
|---|
| 86 |  I $L(XMSG)>80 D  Q
 | 
|---|
| 87 |  . N XMSGHOLD,XMPIECES
 | 
|---|
| 88 |  . S XMPIECES=$L(XMSG,"@")
 | 
|---|
| 89 |  . S XMSGHOLD=$P(XMSG,"@",XMPIECES)
 | 
|---|
| 90 |  . S XMSG=$P(XMSG,"@",1,XMPIECES-1)
 | 
|---|
| 91 |  . X XMSEN
 | 
|---|
| 92 |  . S XMSG="    @"_XMSGHOLD
 | 
|---|
| 93 |  X XMSEN
 | 
|---|
| 94 |  S XMSG="   "
 | 
|---|
| 95 |  Q
 | 
|---|
| 96 | TEXT(XMZ) ; Send body of text
 | 
|---|
| 97 |  N XMS0AJ
 | 
|---|
| 98 |  ;S XMBLOCK=1 ; *** What's this?  See ^XML4CRC* & ^XMLSWP*
 | 
|---|
| 99 |  S XMS0AJ=0
 | 
|---|
| 100 |  F  S XMS0AJ=$O(^XMB(3.9,XMZ,2,XMS0AJ)) Q:XMS0AJ'>0  D  Q:ER
 | 
|---|
| 101 |  . S XMSG=^XMB(3.9,XMZ,2,XMS0AJ,0)
 | 
|---|
| 102 |  . I $E(XMSG)="." S XMSG="."_XMSG
 | 
|---|
| 103 |  . E  I $E(XMSG,1,4)="~*~^" S XMSG=" "_XMSG  ; *** What's this?
 | 
|---|
| 104 |  . X XMSEN
 | 
|---|
| 105 |  I ER S ER("MSG")="Error sending msg "_XMZ_", text line "_XMS0AJ Q
 | 
|---|
| 106 |  ;D:$D(XMBLOCK) KILL^XML4CRC
 | 
|---|
| 107 |  Q
 | 
|---|
| 108 | RCPTERR(XMERRMSG,XMZ,XMZREC,XMNVFROM,XMRCPTO,XMRCPT,XMIEN) ; Non-delivery to recipient
 | 
|---|
| 109 |  N XMFDA,XMIENS,XMTO,XMPARM,XMINSTR
 | 
|---|
| 110 |  S XMIENS=XMIEN_","_XMZ_","
 | 
|---|
| 111 |  S XMFDA(3.91,XMIENS,3)="@"                ; remote msg id
 | 
|---|
| 112 |  S XMFDA(3.91,XMIENS,4)=XMCM("START","FM") ; xmit date/time
 | 
|---|
| 113 |  S XMFDA(3.91,XMIENS,5)=$E($P(XMERRMSG," ",2,999),1,30)  ; status
 | 
|---|
| 114 |  S XMFDA(3.91,XMIENS,6)="@"                ; path
 | 
|---|
| 115 |  D FILE^DIE("","XMFDA")
 | 
|---|
| 116 |  S XMTO=$$SENDER(XMZ,XMZREC,XMNVFROM,XMIEN,1,XMERRMSG) Q:"<>"[XMTO
 | 
|---|
| 117 |  S XMINSTR("FROM")="POSTMASTER"
 | 
|---|
| 118 |  S XMPARM(1)=$P(XMZREC,U,1) ; subject
 | 
|---|
| 119 |  S XMPARM(2)=XMRCPTO
 | 
|---|
| 120 |  S XMPARM(3)=XMERRMSG
 | 
|---|
| 121 |  S XMPARM(4)=XMRCPT
 | 
|---|
| 122 |  S XMPARM(5)=$S(XMTO["@":$G(^XMB(3.9,XMZ,5)),1:XMZ)
 | 
|---|
| 123 |  D TASKBULL^XMXBULL(.5,"XM SEND ERR RECIPIENT",.XMPARM,"",XMTO,.XMINSTR)
 | 
|---|
| 124 |  Q
 | 
|---|
| 125 | MSGERR(XMSITE,XMINST,XMERRMSG,XMZ,XMZREC,XMNVFROM,XMRCPT) ;
 | 
|---|
| 126 |  ; If a message is rejected at a site for any reason (the whole message,
 | 
|---|
| 127 |  ; not just one recipient), then this message may be sent.
 | 
|---|
| 128 |  N XMTO,XMPARM,XMIEN,XMNAME,XMCNT,XMINSTR
 | 
|---|
| 129 |  D DOTRAN^XMC1(XMERRMSG)
 | 
|---|
| 130 |  S XMPARM(3)=XMERRMSG
 | 
|---|
| 131 |  S XMERRMSG=$E($P(XMERRMSG," ",2,999),1,30)
 | 
|---|
| 132 |  K ^TMP("XM",$J,"REJECT")
 | 
|---|
| 133 |  S XMIEN=""
 | 
|---|
| 134 |  F  S XMIEN=$S($D(XMRCPT):$O(XMRCPT(XMIEN)),1:$O(^XMB(3.9,XMZ,1,"AQUEUE",XMINST,XMIEN))) Q:XMIEN=""  D
 | 
|---|
| 135 |  . N XMFDA,XMIENS
 | 
|---|
| 136 |  . S XMIENS=XMIEN_","_XMZ_","
 | 
|---|
| 137 |  . S XMFDA(3.91,XMIENS,3)="@"      ; remote msg id
 | 
|---|
| 138 |  . S XMFDA(3.91,XMIENS,4)=XMCM("START","FM") ; xmit date/time
 | 
|---|
| 139 |  . S XMFDA(3.91,XMIENS,5)=XMERRMSG ; status
 | 
|---|
| 140 |  . S XMFDA(3.91,XMIENS,6)="@"      ; path
 | 
|---|
| 141 |  . S XMFDA(3.91,XMIENS,9)="@"      ; xmit time
 | 
|---|
| 142 |  . D FILE^DIE("","XMFDA")
 | 
|---|
| 143 |  . S XMNAME=$P($G(^XMB(3.9,XMZ,1,XMIEN,0)),U,1) Q:XMNAME=""
 | 
|---|
| 144 |  . S XMTO=$$SENDER(XMZ,XMZREC,XMNVFROM,XMIEN) Q:"<>"[XMTO
 | 
|---|
| 145 |  . S (XMCNT,^(XMTO))=$G(^TMP("XM",$J,"REJECT",XMTO))+1
 | 
|---|
| 146 |  . S ^TMP("XM",$J,"REJECT",XMTO,XMCNT)=XMNAME
 | 
|---|
| 147 |  S XMINSTR("FROM")="POSTMASTER"
 | 
|---|
| 148 |  S XMPARM(1)=$P(XMZREC,U,1) ; subject
 | 
|---|
| 149 |  S XMPARM(2)=XMSITE
 | 
|---|
| 150 |  S XMTO=""
 | 
|---|
| 151 |  F  S XMTO=$O(^TMP("XM",$J,"REJECT",XMTO)) Q:XMTO=""  D TASKBULL^XMXBULL(.5,"XM SEND ERR MSG",.XMPARM,"^TMP(""XM"",$J,""REJECT"",XMTO)",XMTO,.XMINSTR)
 | 
|---|
| 152 |  K ^TMP("XM",$J,"REJECT")
 | 
|---|
| 153 |  Q
 | 
|---|
| 154 | SENDER(XMZ,XMZREC,XMNVFROM,XMIEN,XMDELFWD,XMERRMSG) ; Function returns 'to whom to send error message'
 | 
|---|
| 155 |  N XMFWDREC,XMFWDR
 | 
|---|
| 156 |  S XMFWDREC=$G(^XMB(3.9,XMZ,1,XMIEN,"F")) ; Try to find forwarder
 | 
|---|
| 157 |  S XMFWDR=$P(XMFWDREC,U,2)
 | 
|---|
| 158 |  I XMFWDR'="" D  Q XMFWDR  ; Forwarder is local
 | 
|---|
| 159 |  . I $G(XMDELFWD) D DELFWD(XMZ,XMIEN,XMFWDR,XMERRMSG)
 | 
|---|
| 160 |  I $E(XMFWDREC)="<" Q $E($P($P(XMFWDREC,U,1),">",1),2,999)  ; Forwarder is remote
 | 
|---|
| 161 |  Q:$D(^XMB(3.9,XMZ,.7)) XMNVFROM  ; Sender is remote
 | 
|---|
| 162 |  N XMFROM
 | 
|---|
| 163 |  S XMFROM=$P(XMZREC,U,2)
 | 
|---|
| 164 |  I +XMFROM=XMFROM Q XMFROM  ; Sender is local
 | 
|---|
| 165 |  I XMFROM'["@" Q .5         ; Sender is fictitious, so notify postmaster
 | 
|---|
| 166 |  Q XMNVFROM  ; Sender is remote
 | 
|---|
| 167 | DELFWD(XMZ,XMIEN,XMFWDR,XMERRMSG) ; Delete user's forwarding address
 | 
|---|
| 168 |  Q:+XMFWDR'=XMFWDR
 | 
|---|
| 169 |  N XMFWD
 | 
|---|
| 170 |  S XMFWD=$P(^XMB(3.7,XMFWDR,0),U,2) Q:XMFWD=""
 | 
|---|
| 171 |  N XMINSTR,XMADDR,XMFULL,XMERROR,XMFDA,XMTXT,XMFWDADD
 | 
|---|
| 172 |  S XMINSTR("ADDR FLAGS")="X" ; do not create ^TMP(, just check.
 | 
|---|
| 173 |  S XMADDR=$P(^XMB(3.9,XMZ,1,XMIEN,0),U,1)
 | 
|---|
| 174 |  D ADDRESS^XMXADDR(DUZ,XMFWD,.XMFULL,.XMERROR)
 | 
|---|
| 175 |  I '$D(XMERROR),XMADDR'=$G(XMFULL) Q
 | 
|---|
| 176 |  D DELFWD^XMVVITA(XMFWDR,XMFWD,XMERRMSG)
 | 
|---|
| 177 |  Q
 | 
|---|
| 178 |  ; The following has nothing to do with the above.
 | 
|---|
| 179 |  ; These are used by the SERVER Communications Protocol in file 3.4.
 | 
|---|
| 180 | REC ; Read the next line of text from the message.  When called for the
 | 
|---|
| 181 |  ; first time, returns the first line.
 | 
|---|
| 182 |  ; In:
 | 
|---|
| 183 |  ; XMZ   - IEN of the message in file 3.9
 | 
|---|
| 184 |  ; XMPOS - (optional) line number of the previous line read
 | 
|---|
| 185 |  ;         Default is .999999
 | 
|---|
| 186 |  ; Out:
 | 
|---|
| 187 |  ; XMPOS - line number of XMRG
 | 
|---|
| 188 |  ; XMRG  - =the next line of text, if OK; ="" if end of text reached
 | 
|---|
| 189 |  ; XMER  - =0 if OK; =-1 if end of text reached
 | 
|---|
| 190 |  S XMPOS=$S('$D(XMPOS):.999999,XMPOS<.999999:.999999,1:XMPOS)
 | 
|---|
| 191 |  S XMPOS=$O(^XMB(3.9,XMZ,2,XMPOS))
 | 
|---|
| 192 |  I +XMPOS'=XMPOS S XMER=-1,XMRG="" Q
 | 
|---|
| 193 |  S XMRG=^XMB(3.9,XMZ,2,XMPOS,0),XMER=0
 | 
|---|
| 194 |  Q
 | 
|---|
| 195 | SEN ; Send a line to the return message
 | 
|---|
| 196 |  S XMSLINE=XMSLINE+1,^XMB(3.9,XMZ,2,XMSLINE,0)=XMSG
 | 
|---|
| 197 |  Q
 | 
|---|
| 198 | OPEN ; Open the reverse message path
 | 
|---|
| 199 |  Q
 | 
|---|
| 200 | CLOSE ; Close the reverse message
 | 
|---|
| 201 |  S ^XMB(3.9,XMZ,2,0)="^3.92A^"_XMSLINE_U_XMSLINE_U_DT
 | 
|---|
| 202 |  Q
 | 
|---|