sendsmtpmail.p 11 KB

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