1. 程式人生 > >tiptop自定義傳送郵件及EXCEL附件

tiptop自定義傳送郵件及EXCEL附件

 很多公司都有這樣的需求,希望系統可以定時郵件傳送一些統計報表給到相關人員,以便做資料分析,或者是希望做單時,傳送單據內容給到相關人員提醒稽核和備案,下面分享一種十分簡單方便的實現方式,javamail+4gl+perl指令碼實現; 1:在aooi999配置好系統標準的javamail 功能,測試可以正常傳送報表郵件,配置方式可以百度 2:新增郵件傳送功能函式,可以參考cl_prt裡面的發郵件功能,我簡化了一些東西程式碼如下: FUNCTION p_sendmail1(l_xml) DEFINE p_chk    LIKE type_file.chr100 DEFINE l_cmd    STRING 

DEFINE l_top    STRING DEFINE l_tempdir    STRING DEFINE res      LIKE type_file.num5 DEFINE l_xml        RECORD   file         STRING,  #XML檔名(不含路徑,檔案放置在os.Path.join(FGL_GETENV("TEMPDIR")底下)   mailserver   STRING,  #MAIL SERVER IP   serverport   STRING,  #MAIL SERVER Port   user         STRING,  #MAIL SERVER User 
  passwd       STRING,  #MAIL SERVER User Password   checkauth    LIKE type_file.chr1,    #No.FUN-690005 VARCHAR(1), #CheckAuth   subject      STRING,  #信件主旨   body         STRING,  #信件本文內容檔路徑   attach       STRING,  #信件附件檔路徑   recipient    STRING,  #收件者   cc           STRING,  #副本   bcc          STRING,  #密件副本 
  sender       STRING   #寄件者 END RECORD DEFINE l_mlj        RECORD LIKE mlj_file.* DEFINE l_str        STRING DEFINE lc_channel    base.Channel DEFINE   ch                            base.Channel,   l_status                      SMALLINT,   l_index                       SMALLINT,   l_temp                        STRING,   l_text                        STRING LET res = 1 {INITIALIZE l_mlj.* TO NULL SELECT * INTO l_mlj.*  FROM mlj_file WHERE mlj01 = "DEFAULT" INITIALIZE l_xml.* TO NULL LET l_top = fgl_getenv("TOP") LET l_tempdir =fgl_getenv("TEMPDIR") #  生成XML檔案寫入系統 LET l_xml.file = p_chk CLIPPED,'.xml'  #按傳入的名稱 LET l_xml.mailserver = l_mlj.mlj03   #郵件主機 LET l_xml.serverport = l_mlj.mlj04   #郵件主機埠 LET l_xml.user = l_mlj.mlj05         #郵件主機使用者 LET l_xml.passwd = l_mlj.mlj06       #郵件主機密碼 LET l_xml.checkauth = l_mlj.mlj08    #認證 LET l_xml.sender = '[email protected]' #寄件人 LET l_xml.subject ='TEST'            #郵件主旨 LET l_xml.body = l_tempdir CLIPPED,'/',p_body CLIPPED          #文字內容 LET l_xml.attach = l_tempdir CLIPPED,'/',p_attach CLIPPED            #附件地址 LET l_xml.recipient = '[email protected]'  #收件人 #LET l_xml.cc = g_xml.cc #LET l_xml.bcc = g_xml.bcc} #########產生for javamail的xml檔############ LET l_tempdir =fgl_getenv("TEMPDIR") LET l_top = fgl_getenv("TOP")    LET lc_channel = base.Channel.create()    LET l_str = os.Path.join(l_tempdir CLIPPED,l_xml.file CLIPPED)    CALL lc_channel.openFile(l_str, "w")    CALL lc_channel.setDelimiter("")    CALL lc_channel.write("<?xml version=""1.0"" encoding=""UTF-8""?>") #No.FUN-740189    CALL lc_channel.write("<Mail>")    CALL lc_channel.write("<Protocol>smtp</Protocol>")    LET l_str = '<CheckAuth>',l_xml.checkauth CLIPPED,'</CheckAuth>'    CALL lc_channel.write(l_str CLIPPED)    LET l_str = '<MailServer>',l_xml.mailserver CLIPPED,'</MailServer>'    CALL lc_channel.write(l_str CLIPPED)    LET l_str = '<MailServerPort>',l_xml.serverport CLIPPED,'</MailServerPort>'    CALL lc_channel.write(l_str CLIPPED)    LET l_str = '<MailServerUser>',l_xml.user CLIPPED,'</MailServerUser>'    CALL lc_channel.write(l_str CLIPPED)    LET l_str = '<MailServerUserPassword>',l_xml.passwd CLIPPED,'</MailServerUserPassword>'    CALL lc_channel.write(l_str CLIPPED)    Let l_str = '<Subject>',l_xml.subject CLIPPED,'</Subject>'    CALL lc_channel.write(l_str CLIPPED)    IF NOT cl_null(l_xml.body) THEN       LET l_str = '<MessageBody>',l_xml.body CLIPPED,'</MessageBody>'       CALL lc_channel.write(l_str CLIPPED)    END IF    IF NOT cl_null(l_xml.attach) THEN       LET l_str = '<Attach>',l_xml.attach CLIPPED,'</Attach>'       CALL lc_channel.write(l_str CLIPPED)    END IF    LET l_str = '<Recipient>',l_xml.recipient CLIPPED,'</Recipient>'    CALL lc_channel.write(l_str CLIPPED)    IF NOT cl_null(l_xml.cc) THEN       LET l_str = '<CCRecipient>',l_xml.cc CLIPPED,'</CCRecipient>'       CALL lc_channel.write(l_str CLIPPED)    END IF    IF NOT cl_null(l_xml.bcc) THEN       LET l_str = '<BCCRecipient>',l_xml.bcc CLIPPED,'</BCCRecipient>'       CALL lc_channel.write(l_str CLIPPED)    END IF    LET l_str = '<From>',l_xml.sender CLIPPED,'</From>'    CALL lc_channel.write(l_str CLIPPED)    CALL lc_channel.write("</Mail>")    CALL lc_channel.close()    #將產生給javamail的xml檔轉成客戶端的編碼 #  生成XML檔案寫入系統 LET l_cmd="chmod 777 ",os.Path.join(l_tempdir CLIPPED,l_xml.file CLIPPED)," 2>/dev/null"     #FUN-8B0011 RUN l_cmd LET l_cmd="sh ",l_top CLIPPED,"/ds4gl2/bin/javamail/UnixMailSender.bat ",      os.Path.join(l_tempdir CLIPPED,l_xml.file CLIPPED)," >/u1/out/caozq.txt" #FUN-510006 FUN-8B0011 RUN l_cmd  IN FORM MODE RETURNING res  if res = 0 then  let l_str = "Send ok"  else  let l_str = "Send fail"  end if #讀取caozq.txt,判斷是否成功 SLEEP 1 LET ch = base.Channel.create() CALL ch.openFile('/u1/out/caozq.txt','r') LET l_status = ch.read(l_temp) WHILE l_status LET l_text = l_text.trim(),l_temp.trim() LET l_status = ch.read(l_temp) END WHILE LET l_index = 0 LET l_index = l_text.getIndexOf('successfully',1) IF l_index > 0 THEN  let l_str = "Send ok"  else  let l_str = "Send fail" END IF END FUNCTION 函式可做一個公用函式,供其他程式呼叫 3:如何生成附件excel檔可以參考另一個帖子 perl生成excel 的,沒寫太詳細,碼字太麻煩....