sendsmtpmail.p 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297
  1. /*------------------------------------------------------------------------
  2. File : sendsmtpmail.p
  3. Purpose :
  4. Syntax :
  5. Description :
  6. Author(s) : walter.riechsteiner
  7. Created : Thu Mar 21 11:36:52 CET 2019
  8. Notes :
  9. ----------------------------------------------------------------------*/
  10. /* *************************** Definitions ************************** */
  11. /* ******************** Preprocessor Definitions ******************** */
  12. /* *************************** Main Block *************************** */
  13. /*------------------------------------------------------------------------
  14. File : custom.p
  15. Purpose :
  16. Syntax :
  17. Description :
  18. Author(s) : javier.garcia
  19. Created : Wed Mar 20 17:36:56 CET 2019
  20. Notes :
  21. ----------------------------------------------------------------------*/
  22. /* *************************** Definitions ************************** */
  23. USING System.Net.Mail.Attachment FROM ASSEMBLY.
  24. USING System.Net.Mail.MailAddress FROM ASSEMBLY.
  25. USING System.Net.Mail.MailMessage FROM ASSEMBLY.
  26. USING System.Net.Mail.SmtpClient FROM ASSEMBLY.
  27. USING System.Net.Mail.SmtpDeliveryMethod FROM ASSEMBLY.
  28. USING System.Net.NetworkCredential FROM ASSEMBLY.
  29. DEFINE INPUT PARAMETER iphttSendMail AS HANDLE NO-UNDO.
  30. DEFINE OUTPUT PARAMETER opcMessage AS CHARACTER NO-UNDO.
  31. DEFINE OUTPUT PARAMETER oplRetVal AS LOG NO-UNDO.
  32. { ttsendmail.i }
  33. { properties.i }
  34. DEFINE VARIABLE smtp AS SmtpClient.
  35. DEFINE VARIABLE fromAddress AS MailAddress.
  36. DEFINE VARIABLE toAddress AS MailAddress.
  37. DEFINE VARIABLE emailmessage AS MailMessage.
  38. DEFINE VARIABLE cAttachment AS Attachment.
  39. DEFINE VARIABLE lBatch AS LOGICAL NO-UNDO.
  40. DEFINE VARIABLE lSuper AS LOGICAL NO-UNDO.
  41. DEFINE VARIABLE cLogFile AS CHARACTER NO-UNDO.
  42. DEFINE VARIABLE cMessage AS CHARACTER NO-UNDO.
  43. DEFINE VARIABLE ii AS INTEGER NO-UNDO.
  44. DEFINE VARIABLE ix AS INTEGER NO-UNDO.
  45. DEFINE VARIABLE cString AS CHARACTER NO-UNDO.
  46. DEFINE VARIABLE cToFirst AS CHARACTER NO-UNDO.
  47. DEFINE VARIABLE cToSecond AS CHARACTER NO-UNDO.
  48. DEFINE VARIABLE lcBody AS LONGCHAR NO-UNDO.
  49. DEFINE VARIABLE cDateiName AS CHARACTER NO-UNDO.
  50. DEFINE VARIABLE cAttached AS CHARACTER NO-UNDO.
  51. DEFINE VARIABLE cAttName AS CHARACTER NO-UNDO.
  52. DEFINE VARIABLE cProgramm AS CHARACTER NO-UNDO.
  53. DEFINE VARIABLE cLogFileProg AS CHARACTER NO-UNDO.
  54. /* ******************** Preprocessor Definitions ******************** */
  55. /* *************************** Main Block *************************** */
  56. ASSIGN
  57. opcMessage = ''
  58. oplRetVal = FALSE.
  59. lSuper = DYNAMIC-FUNCTION ('getSuperAktiv':U) NO-ERROR.
  60. IF lSuper = ? THEN lSuper = FALSE.
  61. IF NOT lSuper THEN
  62. DO:
  63. { super/funktionen.i }
  64. cString = SUBSTITUTE('SYSTEM&1SYSTEM&11000', CHR(01)).
  65. RUN ANMELDUNG ( cString ).
  66. END.
  67. cLogFileProg = SEARCH('writeLogFile.p').
  68. cProgramm = DYNAMIC-FUNCTION ('makeProgname':U, THIS-PROCEDURE:HANDLE) NO-ERROR.
  69. cLogFile = DYNAMIC-FUNCTION ('getLogFilePfad':U) NO-ERROR.
  70. IF cLogFile = ? THEN cLogFile = SESSION:TEMP-DIRECTORY.
  71. cLogFile = cLogFile + cProgramm + '.log'.
  72. EMPTY TEMP-TABLE ttSendMail.
  73. CREATE ttSendMail.
  74. httSendMail:BUFFER-COPY (iphttSendMail).
  75. ASSIGN
  76. ttSendMail.cTo = REPLACE(ttSendMail.cTo, ',', ';')
  77. ttSendMail.cCC = REPLACE(ttSendMail.cCC, ',', ';')
  78. ttSendMail.cBC = REPLACE(ttSendMail.cBC, ',', ';')
  79. ttSendMail.cAttachedName = REPLACE(ttSendMail.cAttachedName, ',', ';')
  80. ttSendMail.cAttachedFile = REPLACE(ttSendMail.cAttachedFile, ',', ';')
  81. .
  82. IF ttSendMail.cFrom = '' THEN ttSendMail.cFrom = cMailFromFreigabe.
  83. IF ttSendMail.cFrom = '' OR
  84. ttSendMail.cTo = '' THEN
  85. DO:
  86. opcMessage = 'Mailadresse für Kontoanmeldung oder Maildresse zu "TO" fehlt/fehlen'.
  87. RETURN.
  88. END.
  89. ASSIGN
  90. opcMessage = ''
  91. oplRetVal = TRUE.
  92. DO WHILE ttSendMail.cAttachedFile <> '':
  93. DO ix = 1 TO NUM-ENTRIES(ttSendMail.cAttachedFile, ';'):
  94. cDateiname = ENTRY(ix, ttSendMail.cAttachedFile, ';').
  95. cDateiname = SEARCH (cDateiName).
  96. IF cDateiName = ? THEN
  97. DO:
  98. opcMessage = SUBSTITUTE('Attachement &1 nicht gefunden', ttSendMail.cAttachedFile).
  99. RUN VALUE (cLogFileProg) ( cProgramm, cLogFile, opcMessage ).
  100. oplRetVal = FALSE.
  101. RETURN.
  102. END.
  103. ttSendMail.cAttachedFile = cDateiName.
  104. END.
  105. LEAVE.
  106. END.
  107. DO WHILE ttSendMail.cBody BEGINS 'File:':
  108. cDateiname = TRIM(SUBSTRING(ttSendMail.cBody,06)).
  109. cDateiname = SEARCH (cDateiName).
  110. IF cDateiName = ? THEN
  111. DO:
  112. opcMessage = SUBSTITUTE('Datei &1 für Body-Text nicht gefunden', ENTRY(2, ttSendMail.cBody, ':')).
  113. RUN VALUE(cLogFileProg) ( cProgramm, cLogFile, opcMessage ).
  114. oplRetVal = FALSE.
  115. RETURN.
  116. END.
  117. ttSendMail.cBody = 'FILE:' + cDateiName.
  118. LEAVE.
  119. END.
  120. cToFirst = ENTRY(1, ttSendMail.cTo, ';').
  121. cToSecond = ''.
  122. IF NUM-ENTRIES(ttSendMail.cTo, ';') > 1 THEN
  123. DO:
  124. DO ii = 2 TO NUM-ENTRIES(ttSendMail.cTo, ';'):
  125. IF ENTRY(ii, ttSendMail.cTo, ';') = '' THEN NEXT.
  126. cToSecond = cToSecond
  127. + (IF cToSecond = '' THEN '' ELSE ';')
  128. + ENTRY(ii, ttSendMail.cTo, ';').
  129. END.
  130. END.
  131. DO WHILE TRUE:
  132. fromAddress = NEW MailAddress(ttSendMail.cFrom).
  133. toAddress = NEW MailAddress(cToFirst).
  134. smtp = NEW SmtpClient().
  135. smtp:Host = ttSendMail.cMailServer.
  136. smtp:Port = INTEGER(ttSendMail.cMailPort).
  137. smtp:EnableSsl = FALSE.
  138. smtp:DeliveryMethod = SmtpDeliveryMethod:Network.
  139. smtp:TimeOut = 5000.
  140. IF ttSendMail.lAuth THEN
  141. DO:
  142. IF ttSendMail.cAuthUsername = '' THEN ttSendMail.cAuthUsername = cAuthUserName.
  143. IF ttSendMail.cAuthPasswort = '' THEN ttSendMail.cAuthPasswort = cAuthPasswort.
  144. smtp:EnableSsl = ttSendMail.lSSLEnabled.
  145. smtp:UseDefaultCredentials = FALSE.
  146. smtp:Credentials = NEW NetworkCredential(ttSendMail.cAuthUserName, ttSendMail.cAuthPasswort).
  147. smtp:TargetName = SUBSTITUTE('STARTTLS/&1', ttSendMail.cMailServer).
  148. END.
  149. ELSE
  150. DO:
  151. smtp:Credentials = NEW NetworkCredential(ttSendMail.cMailKonto, ttSendMail.cMailPassw).
  152. END.
  153. emailmessage = NEW MailMessage(fromAddress, toAddress).
  154. IF cToSecond <> '' THEN
  155. DO:
  156. DO ii = 1 TO NUM-ENTRIES(cToSecond, ';'):
  157. IF ENTRY(ii, cToSecond, ';') = '' THEN NEXT.
  158. emailmessage:TO:ADD(ENTRY(ii, cToSecond, ';')).
  159. END.
  160. END.
  161. IF ttSendMail.cCC <> '' THEN
  162. DO:
  163. DO ii = 1 TO NUM-ENTRIES(ttSendMail.cCC, ';'):
  164. IF ENTRY(ii, ttSendMail.cCC, ';') = '' THEN NEXT.
  165. emailmessage:cc:ADD(ENTRY(ii, ttSendMail.cCC, ';')).
  166. END.
  167. END.
  168. IF ttSendMail.cBC <> '' THEN
  169. DO:
  170. DO ii = 1 TO NUM-ENTRIES(ttSendMail.cBC, ';'):
  171. IF ENTRY(ii, ttSendMail.cBC, ';') = '' THEN NEXT.
  172. emailmessage:Bcc:ADD(ENTRY(ii, ttSendMail.cBC, ';')).
  173. END.
  174. END.
  175. IF ttsendmail.cBody BEGINS 'FILE:' THEN
  176. DO:
  177. cDateiname = REPLACE(ttsendmail.cBody, 'FILE:', '').
  178. COPY-LOB FILE cDateiname TO lcBody.
  179. emailmessage:Body = lcBody NO-ERROR.
  180. END.
  181. ELSE
  182. DO:
  183. emailmessage:Body = ttsendmail.cBody NO-ERROR.
  184. END.
  185. IF ERROR-STATUS:ERROR THEN
  186. DO:
  187. opcMessage = 'Body-Fehler'.
  188. RUN VALUE(cLogFileProg) ( cProgramm, cLogFile, opcMessage ).
  189. oplRetVal = FALSE.
  190. LEAVE.
  191. END.
  192. emailmessage:Subject = ttSendMail.cSubject.
  193. emailMessage:IsBodyHtml = TRUE.
  194. IF ttSendMail.cAttachedName <> '' THEN
  195. DO:
  196. IF ttSendMail.cAttachedFile = '' THEN ttSendMail.cAttachedFile = ttSendMail.cAttachedName.
  197. IF ttSendMail.cAttachedName = '' THEN ttSendMail.cAttachedName = ttSendMail.cAttachedFile.
  198. DO ii = 1 TO NUM-ENTRIES(ttSendMail.cAttachedName, ';'):
  199. cAttached = ENTRY(ii, ttSendMail.cAttachedFile, ';').
  200. cAttachment = NEW Attachment(cAttached).
  201. cAttName = ENTRY(ii, ttSendMail.cAttachedName, ';').
  202. DO WHILE cAttName <> '':
  203. cAttName = REPLACE(cAttName, '\', '/').
  204. ii = R-INDEX(cAttName, '/').
  205. IF ii = 0 THEN LEAVE.
  206. ii = ii + 1.
  207. cAttName = TRIM(SUBSTRING(cAttName,ii)).
  208. LEAVE.
  209. END.
  210. cAttachment:NAME = cAttName.
  211. emailmessage:attachments:ADD(cAttachment).
  212. DELETE OBJECT cAttachment.
  213. END.
  214. END.
  215. cString = SUBSTITUTE('Sendmail From &1 to &2, cc an &3 mit Subject &4 am &5 um &6 ',
  216. emailmessage:From:ToString(),
  217. emailmessage:TO:ToString() ,
  218. emailmessage:CC:ToString() ,
  219. emailMessage:Subject ,
  220. STRING(TODAY,"99.99.9999") ,
  221. STRING(TIME ,"HH:MM:SS") ).
  222. RUN VALUE (cLogFileProg) ( cProgramm, cLogFile, cString ).
  223. smtp:Send(emailmessage) NO-ERROR.
  224. DO WHILE ERROR-STATUS:ERROR:
  225. oplRetVal = FALSE.
  226. DO ii = 1 TO ERROR-STATUS:NUM-MESSAGES:
  227. cString = ERROR-STATUS:GET-MESSAGE(ii).
  228. ix = INDEX(cString, ':').
  229. IF ix > 0 THEN cString = TRIM(SUBSTRING(cString, ix + 1)).
  230. cMessage = SUBSTITUTE('&1 : &2 -> &3',
  231. STRING(NOW,'99.99.9999 HH:MM:SS.SSS'),
  232. ERROR-STATUS:GET-NUMBER(ii),
  233. cString ).
  234. opcMessage = opcMessage
  235. + (IF opcMessage = '' THEN '' ELSE CHR(10))
  236. + cMessage.
  237. END.
  238. RUN VALUE (cLogFileProg) ( cProgramm, cLogFile, opcMessage ).
  239. LEAVE.
  240. END.
  241. LEAVE.
  242. END.
  243. DELETE OBJECT fromAddress NO-ERROR.
  244. DELETE OBJECT toAddress NO-ERROR.
  245. DELETE OBJECT smtp:Credentials NO-ERROR.
  246. DELETE OBJECT smtp NO-ERROR.
  247. DELETE OBJECT emailmessage NO-ERROR.
  248. DELETE OBJECT cAttachment NO-ERROR.
  249. RETURN.