project BLF > class Mail > method ReadHandler
Description
This Procedure handles the return messages form the server
Internal usage
unused
program code (program1/mail.p)
do while true:
/* pause for just a few milliseconds */
vgt1 = etime.
do while true:
vgt2 = etime.
if (vgt2 - vgt1) > 50 then leave.
end.
assign vilength = vhSocket:GET-BYTES-AVAILABLE()
vlResponded = yes.
IF vilength > 0
THEN DO:
set-size(vmBuffer) = 0.
SET-SIZE(vmBuffer) = vilength + 1.
vhSocket:READ(vmBuffer, 1, vilength, 1).
vcmessage = vcMessage + GET-STRING(vmBuffer,1).
vleod = (get-byte(vmBuffer,viLength - 1) = 13 and
get-byte(vmBuffer,viLength ) = 10).
SET-SIZE(vmBuffer) = 0.
/* debugging */
publish "Logging.BusinessCode"
("packet in : ":U + vcmessage + chr(10) + "Step : ":U + string(viStep), "").
end.
virepeats = virepeats + 1.
if vleod or virepeats > 100 then leave.
end.
if vcMessage <> ""
then do:
do while true:
assign vib = vib + 1
vcA = substring(vcmessage,vib,1,"CHARACTER":U).
if vcA >= "0":U
and vcA <= "9":U
then assign vcMessageNR = vcMessageNR + vcA.
else leave.
end.
assign vimessagenumber = INTEGER(vcmessageNR).
CASE viStep:
WHEN 1 THEN IF vimessagenumber = 220
THEN do:
<M-10 run SendHandler (input 'HELO ':U + substring(vcFrom,index(vcFrom,'@':U) + 1,-1,'CHARACTER':U) (icString),
input 2 (iiNewState),
output viWriteReturn (oiReturnStatus)) in Mail>
end.
ELSE viStep = -1.
WHEN 2 THEN IF vimessagenumber = 250
THEN do:
<M-11 run SendHandler (input 'MAIL FROM:<':U + vcFrom + chr(62) (icString),
input 3 (iiNewState),
output viWriteReturn (oiReturnStatus)) in Mail>
end.
ELSE viStep = -1.
WHEN 3 THEN IF vimessagenumber = 250
THEN do:
assign viRecipients = viRecipients + 1.
<M-12 run SendHandler (input 'RCPT TO:<':U + entry(viRecipients,vcRecipientsPerDomain,'|':u) + chr(62) (icString),
input (if num-entries(vcRecipientsPerDomain,'|':u) <= viRecipients then 4 else 3) (iiNewState),
output viWriteReturn (oiReturnStatus)) in Mail>
end.
ELSE viStep = -1.
WHEN 4 THEN IF vimessagenumber = 250
THEN do:
<M-13 run SendHandler (Input 'DATA':U (icString),
Input 5 (iiNewState),
Output viWriteReturn (oiReturnStatus)) in Mail>
end.
ELSE viStep = -1.
WHEN 5 THEN IF vimessagenumber = 354
THEN do:
<M-26 run InitializeMessage (output viFcReturnSuper (oiReturnStatus)) in Mail>
ASSIGN viMessageID = viMessageID + 1
vcString = 'Message-ID: <':U + string(viFcCurrentInstanceId)
+ string(viMessageID)
+ (if index(vcFrom,'@':U) = 0
then ''
else substring(vcFrom,index(vcFrom,'@':U),-1,'CHARACTER':U))
+ '>':U + CHR(13) + CHR(10) +
'From: ':U + vcFrom + CHR(13) + CHR(10) +
'To: ':U + replace(vcTo,'|':u,'; ':u) + CHR(13) + CHR(10) +
'Cc: ':U + replace(vcCc,'|':u,'; ':u) + CHR(13) + CHR(10) +
'Date: ':U + vcDate + CHR(13) + CHR(10) +
'Subject: ':U + vcSubject + CHR(13) + CHR(10) +
'Mime-Version: 1.0':U + CHR(13) + CHR(10) +
'X-Mailer: "Mail Component" - by CB v1.X':U + CHR(13) + CHR(10) +
'Content-Type: multipart/mixed;':U +
' boundary="----=_CB.PART"':U + CHR(13) + CHR(10) +
chr(13) + CHR(10) +
'------=_CB.PART':U + chr(13) + CHR(10) +
'Content-Type: text/plain':U +
'; charset="' + session:cpinternal + '"':U + chr(13) + CHR(10) +
'Content-Transfer-Encoding: 8bit':U + chr(13) + CHR(10) +
chr(13) + CHR(10) +
vcBody.
<M-27 run AddToMessage (input vcString (icString),
input vmEmpty (imPart),
output viFcReturnSuper (oiReturnStatus)) in Mail>
DO viCnt = 1 TO NUM-ENTRIES (vcAttachments) :
ASSIGN vcAttach = replace(entry(viCnt,vcAttachments),"~\":U,"/":U)
vcAttach = ENTRY(NUM-ENTRIES(vcAttach,"/":U),vcAttach,"/":U).
ASSIGN vcString = CHR(13) + CHR(10) + "------=_CB.PART":U + chr(13) + CHR(10) +
"Content-Type: application/octet-stream; ":U +
"name=":U + vcAttach + chr(13) + CHR(10) +
"Content-Transfer-Encoding: base64":U + chr(13) + CHR(10) +
"Content-ID: ":U + vcAttach + chr(13) + CHR(10) +
"Content-Disposition: attachment; ":U +
"filename=":U + vcAttach + CHR(13) + CHR(10) + CHR(13) + CHR(10).
<M-28 run AddToMessage (input vcString (icString),
input vmEmpty (imPart),
output viFcReturnSuper (oiReturnStatus)) in Mail>
<M-29 run FileToMemptr (input entry(viCnt,vcAttachments) (icFile),
input true (ilEncode),
output vmAttach (omFile),
output viWriteReturn (oiReturnStatus)) in Mail>
<M-30 run AddToMessage (input '':U (icString),
input vmAttach (imPart),
output viWriteReturn (oiReturnStatus)) in Mail>
SET-SIZE(vmAttach) = 0.
END.
do viCnt = 1 to 50 :
if get-size(vmAttachmentStore[viCnt]) <> 0
then do :
ASSIGN vcAttach = replace(entry(viCnt,vcAttachmentStore[viCnt]),"~\":U,"/":U)
vcAttach = ENTRY(NUM-ENTRIES(vcAttach,"/":U),vcAttach,"/":U).
ASSIGN vcString = CHR(13) + CHR(10) + "------=_CB.PART":U + chr(13) + CHR(10) +
"Content-Type: application/octet-stream; ":U +
"name=":U + vcAttach + chr(13) + CHR(10) +
"Content-Transfer-Encoding: base64":U + chr(13) + CHR(10) +
"Content-ID: ":U + vcAttach + chr(13) + CHR(10) +
"Content-Disposition: attachment; ":U +
"filename=":U + vcAttach + CHR(13) + CHR(10) + CHR(13) + CHR(10).
<M-36 run AddToMessage (input vcString (icString),
input vmEmpty (imPart),
output viFcReturnSuper (oiReturnStatus)) in Mail>
<M-34 run FileEncode (input vmAttachmentStore[viCnt] (imIn),
input true (ilLineBreaks),
output vmAttach (omOut),
output viFcReturnSuper (oiReturnStatus)) in Mail>
<M-35 run AddToMessage (input '':U (icString),
input vmAttach (imPart),
output viWriteReturn (oiReturnStatus)) in Mail>
SET-SIZE(vmAttach) = 0.
set-size(vmAttachmentStore[viCnt]) = 0.
assign vcAttachmentStore[viCnt] = "".
end.
end.
ASSIGN vcString = CHR(13) + CHR(10) + "------=_CB.PART--":U + CHR(13) + CHR(10).
<M-31 run AddToMessage (input vcString (icString),
input vmEmpty (imPart),
output viFcReturnSuper (oiReturnStatus)) in Mail>
ASSIGN vcString = CHR(13) + CHR(10) + ".":U + CHR(13) + CHR(10).
<M-32 run AddToMessage (input vcString (icString),
input vmEmpty (imPart),
output viWriteReturn (oiReturnStatus)) in Mail>
<M-33 run SendMessage (output viWriteReturn (oiReturnStatus)) in Mail>
end.
WHEN 6 THEN IF vimessagenumber = 250
THEN do:
<M-22 run SendHandler (Input 'quit':U (icString),
Input 7 (iiNewState),
Output viWriteReturn (oiReturnStatus)) in Mail>
end.
ELSE viStep = -1.
when 7 then do:
<M-23 run Disconnect () in Mail>
end.
END CASE.
END.
IF vistep = 7
THEN DO:
<M-25 run Disconnect () in Mail>
END.
else if viStep = -1
then do:
<M-38 run SetMessage
(input #T-39'Error message received from mail server: $1':100(15)t-39# (icMessage),
input vcMessage (icArguments),
input '' (icFieldName),
input '' (icFieldValue),
input 'D':U (icType),
input 3 (iiSeverity),
input '' (icRowid),
input 'BLF-341':U (icFcMsgNumber),
input '' (icFcExplanation),
input '' (icFcIdentification),
input '' (icFcContext),
output viFcReturnSuper (oiReturnStatus)) in Mail>
end.
else if viWriteReturn <> 0
then assign viStep = -1.