*====================================================================                         
      *  ILE-RPG module EMLDSTB                                                                     
      *  E-mail a message to a distribution list- DSTTYPE(B)                                        
      *  This module belongs to pgm EMLDST.                                                         
      *                                                                                             
      *  After compiling this module,                                                               
      *  create the programn as follow:                                                             
      *  CRTPGM PGM(MMAIL/EMLDST) MODULE(MMAIL/EMLDST MMAIL/EMLDSTA                                 
      *         MMAIL/EMLDSTB) ACTGRP(*CALLER) AUT(*USE)                                            
      *                                                                                             
      *====================================================================                         
      /copy *LIBL/qrpglesrc,hspecs                                                                  
      * File SENDERIDS- Used to identify the sender of the message                                  
     FSENDERIDS if   e           k disk    usropn                                                   
      * File DSTRLISTS- Used to define the recipients for a given distribution list                 
     FDSTRLISTS if   e           k disk    usropn                                                   
      * Special characters                                                                          
     Fchars     if   e           k disk    usropn                                                   
      /copy *LIBL/qrpglesrc,prototypeb                                                              
      /copy *LIBL/qrpglesrc,mailproto                                                               
      /copy *LIBL/qrpglesrc,usec                                                                    
      /copy *LIBL/qrpglesrc,variables3                                                              
      * Main procedure Prototype and Interface                                                      
     D EMLDSTB         PR                                                                           
     D SenderID                      20                                                             
     D Subject                       70                                                             
     D TextStmf                     256                                                             
     D DataLib                       10                                                             
     D DstL                           4                                                             
     D AttachStmf                   256                                                             
     D myAttachType                  50                                                             
     D NbrReceivers                  10i 0                                                          
     D EMLDSTB         PI                                                                           
     D SenderID                      20                                                             
     D Subject                       70                                                             
     D TextStmf                     256                                                             
     D DataLib                       10                                                             
     D DstL                           4                                                             
     D AttachStmf                   256                                                             
     D myAttachType                  50                                                             
     D NbrReceivers                  10i 0                                                          
      *                                                                                             
     D DstLAll         s                   like(DstL) inz('*ALL')                                   
     D AtSign          s              1                                                             
     D STRListInd      s               n                                                            
     D ENDListInd      s               n                                                            
     D cmd             s            500                                                             
     D email           s            256                                                             
     D TempStmf        s            512                                                             
     D ReturnPth       s            256                                                             
     D MimeSName       s             50                                                             
     D MimeSEmail      s             50                                                             
     D ToMNameArr      s             50    dim(1000)                                                
     D ToMAddrArr      s            256    dim(1000)                                                
     D ToMDistArr      s             10i 0 dim(1000)                                                
     D ToAddrArr       s            256    dim(1000)                                                
     D ToDistArr       s             10i 0 dim(1000)                                                
     D MimeFSubj       s             70                                                             
     D TextFile        s            512                                                             
     D Charset         s             50    inz('iso-8859-1')                                        
     D AtchFName       s            512                                                             
     D ContType        s             21                                                             
     D BinFlag         s              1                                                             
     D i               s             10i 0                                                          
     D r               s             10i 0                                                          
     D ImbAtt          s             10i 0                                                          
     D FromAddr        s            255                                                             
     D CpfID           s              7                                                             
     D module          s             10                                                             
     D topgmq          s              5    inz('*PRV')                                              
     D msgtype         s              7    inz('*INFO')                                             
     D msg             s            512                                                             
      *=====================================================================                        
      * Open files                                                                                  
     C                   exsr      OpnF                                                             
      * Get AT sign                                                                                 
     C                   exsr      GetAtSign                                                        
      * Check the sender's ID                                                                       
     C     SenderID      chain     sidrcd                                                           
     C                   if        not %found                                                       
     C                   eval      msg='Sender ID "' + %trim(SenderID) +                            
     C                             '" not found in file ' +                                         
     C                             %trim(DataLib) + '/SENDERIDS.'                                   
     C                   exsr      SndErrMsg                                                        
     C                   endif                                                                      
      * Send a single message to multiple addressees                                                
     C                   exsr      SndEmail                                                         
      *==================                                                                           
      * Back to caller                                                                              
     C                   exsr      Exit                                                             
      *=====================================================================                        
      * Send a single message to multiple addressees                                                
      *=====================================================================                        
     C     SndEmail      begsr                                                                      
      * Create MIME temporary stream file                                                           
     C                   eval      TempStmf=TempCrtF                                                
      * Add the return path header                                                                  
     C                   eval      ReturnPth=sidrpth                                                
     C                   callp     MimeRtnPth(TempStmf:ReturnPth)                                   
      * Add the Sender header                                                                       
     C                   eval      MimeSName =sidname                                               
     C                   eval      MimeSEmail=sidemail                                              
     C                   callp     MimeSender(TempStmf:                                             
     C                             MimeSName:MimeSEmail)                                            
      * Add the dummy To header                                                                     
     C                   eval      ToMNameArr(1)='Distribution list '  +                            
     C                             %trim(DstL)                                                      
     C                   eval      ToMAddrArr(1)='someone'+AtSign+                                  
     C                             'somewhere.net'                                                  
     C                   eval      ToMDistArr(1)=0                                                  
     C                   eval      ToMNameArr(2)=' '                                                
     C                   eval      ToMAddrArr(2)=' '                                                
     C                   callp     MimeDistr(TempStmf:ToMNameArr:                                   
     C                             ToMAddrArr:ToMDistArr)                                           
      * Add the Subject header                                                                      
     C                   eval      MimeFSubj=Subject                                                
     C                   callp     MimeSubj(TempStmf:MimeFSubj)                                     
      * Add the "Content-Type: MULTIPART/MIXED; ..." header                                         
     C                   callp     MimeMultiP(TempStmf)                                             
      * Include the external message text as multipart/alternative                                  
     C                   eval      TextFile=TextStmf                                                
     C                   eval      rc=MimeImbTxtF(TempStmF:TextFile:                                
     C                             charset)                                                         
      * Add the attachment, if requested so                                                         
     C                   if        AttachStmf<>'/NIL'                                               
     C                   eval      AtchFName=AttachStmf                                             
     C                   eval      ContType=myAttachType                                            
     C                   eval      BinFlag='Y'                                                      
     C                   eval      r=%scan('text/':ContType)                                        
     C                   if        r=1                                                              
     C                   eval      BinFlag='N'                                                      
     C                   endif                                                                      
     C                   eval      ImbAtt=2                                                         
     C                   callp     MimeImbAtt(TempStmf:AtchFName:                                   
     C                             ContType:BinFlag:ImbAtt)                                         
     C                   endif                                                                      
      * Close the MIME file by the part delimiter followed by "--"                                  
     C                   callp     MimeClose(TempStmf )                                             
      * Send a single message to a bunch of receivers                                               
      *==================                                                                           
     C                   exsr      ClrAddrArr                                                       
     C                   eval      FromAddr=MimeSEmail                                              
     C                   eval      STRListInd=*off                                                  
     C                   eval      ENDListInd=*off                                                  
     C                   DOW       ENDListInd=*off                                                  
      * - add up to 1000 receivers                                                                  
     C                   exsr      AddToDstL                                                        
      * - send a message to a bunch of receivers                                                    
     C                   eval      CpfID=SendMail(TempStmf:FromAddr:                                
     C                             ToAddrArr:ToDistArr)                                             
     C                   ENDDO                                                                      
      *==================                                                                           
      *                                                                                             
     C                   endsr                                                                      
      *=====================================================================                        
      * Clear Array "ToAddrArr"                                                                     
      *=====================================================================                        
      /free                                                                                         
           Begsr ClrAddrArr;                                                                        
                                                                                                    
           for i=1 to 1000;                                                                         
               ToAddrArr(i)=' ';                                                                    
           endfor;                                                                                  
                                                                                                    
           Endsr;                                                                                   
      /end-free                                                                                     
      *=====================================================================                        
      * Add receivers to the real distribution list                                                 
      *=====================================================================                        
     C     AddToDstL     begsr                                                                      
     C                   IF        STRListInd=*off                                                  
     C                   eval      STRListInd=*on                                                   
     C                   eval      i=0                                                              
     C                   if        DstL<>DstlAll                                                    
     C     DstL          setll     dstrcd                                                           
     C     DstL          reade     dstrcd                                                           
     C                   else                                                                       
     C                   read      dstrcd                                                           
     C                   endif                                                                      
     C                   ENDIF                                                                      
      *                                                                                             
     C                   DOW       not %eof                                                         
     C                   IF        dststatus='1'      and                                           
     C                             dstemail<>' '                                                    
     C                   eval      email=dstemail                                                   
     C                   eval      rc=VldEmail(email)                                               
     C                   if        rc=0                                                             
     C                   exsr      SavToDstl                                                        
     C                   else                                                                       
     C                   eval      msg='E-mail address "' + %trim(email) +                          
     C                             '" not valid.'                                                   
     C                   exsr      SndWrnMsg                                                        
     C                   endif                                                                      
     C                   if        i>=1000                                                          
     C                   leave                                                                      
     C                   endif                                                                      
     C                   ENDIF                                                                      
     C                   if        DstL<>DstlAll                                                    
     C     DstL          reade     dstrcd                                                           
     C                   else                                                                       
     C                   read      dstrcd                                                           
     C                   endif                                                                      
     C                   ENDDO                                                                      
      *                                                                                             
     C                   if        i<1000                                                           
     C                   eval      ENDListInd=*on                                                   
     C                   endif                                                                      
      *                                                                                             
     C                   endsr                                                                      
      *=====================================================================                        
      * Save into the real distribution list the info related to one addressee                      
      *=====================================================================                        
     C     SavToDstL     begsr                                                                      
     C                   eval      nbrReceivers=nbrReceivers+1                                      
     C                   eval      i=i+1                                                            
     C                   eval      ToAddrArr(i)=%trim(dstemail)                                     
     C                   eval      ToDistArr(i)=0                                                   
      *                                                                                             
     C                   endsr                                                                      
      *=====================================================================                        
      * Get AT sign                                                                                 
      *=====================================================================                        
     C     GetAtSign     begsr                                                                      
      * Get at sign                                                                                 
     C                   eval      rc = doCmd('ovrdbf file(chars) +                                 
     C                             tofile(MMAIL/chars) +                                            
     C                             secure(*yes) +                                                   
     C                             ovrscope(*job)')                                                 
     C                   open      Chars                                                            
     C                   eval      charkey = 'AT SIGN'                                              
     C     charkey       chain     charrcd                                                          
     C                   if        %found                                                           
     C                   eval      AtSign = charval                                                 
     C                   else                                                                       
     C                   eval      AtSign = x'5b'                                                   
     C                   endif                                                                      
     C                   close     Chars                                                            
     C                   eval      rc = doCmd('dltovr file(chars) +                                 
     C                             lvl(*job)')                                                      
      *                                                                                             
     C                   endsr                                                                      
      *=====================================================================                        
      * Open files                                                                                  
      *=====================================================================                        
     C     OpnF          begsr                                                                      
      *                                                                                             
     C                   if        not %open(SENDERIDS)                                             
     C                   eval      rc=docmd('ovrdbf SENDERIDS '+                                    
     C                             %trim(datalib) + '/SENDERIDS +                                   
     C                             secure(*yes) ovrscope(*job)')                                    
     C                   open      SENDERIDS                                                        
     C                   endif                                                                      
      *                                                                                             
     C                   if        not %open(DSTRLISTS)                                             
     C                   eval      rc=docmd('ovrdbf DSTRLISTS '+                                    
     C                             %trim(datalib) + '/DSTRLISTS +                                   
     C                             secure(*yes) ovrscope(*job)')                                    
     C                   open      DSTRLISTS                                                        
     C                   endif                                                                      
      *                                                                                             
     C                   endsr                                                                      
      *=====================================================================                        
      * Close files                                                                                 
      *=====================================================================                        
     C     CloF          begsr                                                                      
      *                                                                                             
     C                   if        %open(SENDERIDS)                                                 
     C                   close     SENDERIDS                                                        
     C                   eval      rc=docmd('dltovr SENDERIDS lvl(*job)')                           
     C                   endif                                                                      
      *                                                                                             
      *                                                                                             
     C                   if        %open(DSTRLISTS)                                                 
     C                   close     DSTRLISTS                                                        
     C                   eval      rc=docmd('dltovr DSTRLISTS lvl(*job)')                           
     C                   endif                                                                      
      *                                                                                             
     C                   endsr                                                                      
      *=====================================================================                        
      * Send warning message                                                                        
      *=====================================================================                        
     C     SndWrnMsg     begsr                                                                      
     C                   eval      module=psdsPgmnam                                                
     C                   callp     SndPgmMsg(module:topgmq:msgtype:msg)                             
      *                                                                                             
     C                   endsr                                                                      
      *=====================================================================                        
      * Send error message                                                                          
      *=====================================================================                        
     C     SndErrMsg     begsr                                                                      
     C                   eval      module=psdsPgmnam                                                
     C                   callp     SndPgmMsg(module:topgmq:msgtype:msg)                             
     C                   exsr      Exit                                                             
      *                                                                                             
     C                   endsr                                                                      
      *=====================================================================                        
      * Back to caller                                                                              
      *=====================================================================                        
     C     Exit          begsr                                                                      
     C                   exsr      CloF                                                             
     C                   eval      *inlr=*on                                                        
     C                   return                                                                     
      *                                                                                             
     C                   endsr