1*6236dae4SAndroid Build Coastguard Worker * Curl SMTP send source member as attachment 2*6236dae4SAndroid Build Coastguard Worker * 3*6236dae4SAndroid Build Coastguard Worker h DFTACTGRP(*NO) ACTGRP(*NEW) 4*6236dae4SAndroid Build Coastguard Worker h OPTION(*NOSHOWCPY) 5*6236dae4SAndroid Build Coastguard Worker h BNDDIR('CURL') 6*6236dae4SAndroid Build Coastguard Worker * 7*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 8*6236dae4SAndroid Build Coastguard Worker * _ _ ____ _ 9*6236dae4SAndroid Build Coastguard Worker * Project ___| | | | _ \| | 10*6236dae4SAndroid Build Coastguard Worker * / __| | | | |_) | | 11*6236dae4SAndroid Build Coastguard Worker * | (__| |_| | _ <| |___ 12*6236dae4SAndroid Build Coastguard Worker * \___|\___/|_| \_\_____| 13*6236dae4SAndroid Build Coastguard Worker * 14*6236dae4SAndroid Build Coastguard Worker * Copyright (C) Daniel Stenberg, <[email protected]>, et al. 15*6236dae4SAndroid Build Coastguard Worker * 16*6236dae4SAndroid Build Coastguard Worker * This software is licensed as described in the file COPYING, which 17*6236dae4SAndroid Build Coastguard Worker * you should have received as part of this distribution. The terms 18*6236dae4SAndroid Build Coastguard Worker * are also available at https://curl.se/docs/copyright.html. 19*6236dae4SAndroid Build Coastguard Worker * 20*6236dae4SAndroid Build Coastguard Worker * You may opt to use, copy, modify, merge, publish, distribute and/or sell 21*6236dae4SAndroid Build Coastguard Worker * copies of the Software, and permit persons to whom the Software is 22*6236dae4SAndroid Build Coastguard Worker * furnished to do so, under the terms of the COPYING file. 23*6236dae4SAndroid Build Coastguard Worker * 24*6236dae4SAndroid Build Coastguard Worker * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF 25*6236dae4SAndroid Build Coastguard Worker * ANY KIND, either express or implied. 26*6236dae4SAndroid Build Coastguard Worker * 27*6236dae4SAndroid Build Coastguard Worker * SPDX-License-Identifier: curl 28*6236dae4SAndroid Build Coastguard Worker * 29*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 30*6236dae4SAndroid Build Coastguard Worker * 31*6236dae4SAndroid Build Coastguard Worker /include H,CURL.INC 32*6236dae4SAndroid Build Coastguard Worker * 33*6236dae4SAndroid Build Coastguard Worker * Example to SMTP send source member as attachment via SMTP. 34*6236dae4SAndroid Build Coastguard Worker * 35*6236dae4SAndroid Build Coastguard Worker fRPGXAMPLESif e disk extmbr(program_name) 36*6236dae4SAndroid Build Coastguard Worker f rename(RPGXAMPLES: record) 37*6236dae4SAndroid Build Coastguard Worker d pi 38*6236dae4SAndroid Build Coastguard Worker d url 60 SMTP server URL 39*6236dae4SAndroid Build Coastguard Worker d recipient_mail 40 Recipient mail addr 40*6236dae4SAndroid Build Coastguard Worker * 41*6236dae4SAndroid Build Coastguard Worker d program_name c 'SMTPSRCMBR' Member name to send 42*6236dae4SAndroid Build Coastguard Worker d sender_name c 'Curl' Sender name 43*6236dae4SAndroid Build Coastguard Worker d sender_mail c '[email protected]' Sender e-mail 44*6236dae4SAndroid Build Coastguard Worker d recipient_name c 'WIMC' Recipient name 45*6236dae4SAndroid Build Coastguard Worker d crlf c X'0D25' 46*6236dae4SAndroid Build Coastguard Worker * 47*6236dae4SAndroid Build Coastguard Worker d urllen s 10u 0 URL length 48*6236dae4SAndroid Build Coastguard Worker d rcptmlen s 10u 0 Recipient mail len 49*6236dae4SAndroid Build Coastguard Worker * 50*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 51*6236dae4SAndroid Build Coastguard Worker 52*6236dae4SAndroid Build Coastguard Worker urllen = trimmed_length(url: %len(url)); 53*6236dae4SAndroid Build Coastguard Worker rcptmlen = trimmed_length(recipient_mail: %len(recipient_mail)); 54*6236dae4SAndroid Build Coastguard Worker 55*6236dae4SAndroid Build Coastguard Worker // Do the curl stuff. 56*6236dae4SAndroid Build Coastguard Worker 57*6236dae4SAndroid Build Coastguard Worker curl_global_init(CURL_GLOBAL_ALL); 58*6236dae4SAndroid Build Coastguard Worker main(); 59*6236dae4SAndroid Build Coastguard Worker curl_global_cleanup(); 60*6236dae4SAndroid Build Coastguard Worker *inlr = *on; // Exit 61*6236dae4SAndroid Build Coastguard Worker * 62*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 63*6236dae4SAndroid Build Coastguard Worker * Main procedure: do the curl job. 64*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 65*6236dae4SAndroid Build Coastguard Worker * 66*6236dae4SAndroid Build Coastguard Worker p main b 67*6236dae4SAndroid Build Coastguard Worker d main pi 68*6236dae4SAndroid Build Coastguard Worker * 69*6236dae4SAndroid Build Coastguard Worker d h s * Easy handle 70*6236dae4SAndroid Build Coastguard Worker d result s like(CURLcode) Curl return code 71*6236dae4SAndroid Build Coastguard Worker d inz(CURLE_OUT_OF_MEMORY) 72*6236dae4SAndroid Build Coastguard Worker d errmsgp s * Error string pointer 73*6236dae4SAndroid Build Coastguard Worker d response s 52 For error display 74*6236dae4SAndroid Build Coastguard Worker d headers s * inz(*NULL) Mail headers 75*6236dae4SAndroid Build Coastguard Worker d rcpts s * inz(*NULL) List of recipients 76*6236dae4SAndroid Build Coastguard Worker d mime s * Mail MIME structure 77*6236dae4SAndroid Build Coastguard Worker d mimepart s * Mail part 78*6236dae4SAndroid Build Coastguard Worker 79*6236dae4SAndroid Build Coastguard Worker // Create and fill curl handle. 80*6236dae4SAndroid Build Coastguard Worker 81*6236dae4SAndroid Build Coastguard Worker h = curl_easy_init(); 82*6236dae4SAndroid Build Coastguard Worker if h <> *NULL; 83*6236dae4SAndroid Build Coastguard Worker rcpts = curl_slist_append_ccsid(rcpts: 84*6236dae4SAndroid Build Coastguard Worker %subst(recipient_mail: 1: rcptmlen): 0); 85*6236dae4SAndroid Build Coastguard Worker headers = curl_slist_append_ccsid(headers: 'From: ' + sender_name + 86*6236dae4SAndroid Build Coastguard Worker ' <' + sender_mail + '>': 87*6236dae4SAndroid Build Coastguard Worker 0); 88*6236dae4SAndroid Build Coastguard Worker headers = curl_slist_append_ccsid(headers: 'To: ' + recipient_name + 89*6236dae4SAndroid Build Coastguard Worker ' <' + %subst(recipient_mail: 1: rcptmlen) + '>': 0); 90*6236dae4SAndroid Build Coastguard Worker headers = curl_slist_append_ccsid(headers: 'Subject: An ILE/RPG ' + 91*6236dae4SAndroid Build Coastguard Worker 'source program': 0); 92*6236dae4SAndroid Build Coastguard Worker headers = curl_slist_append_ccsid(headers: 'Date: ' + mail_date(): 93*6236dae4SAndroid Build Coastguard Worker 0); 94*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt_ccsid(h: CURLOPT_URL: %subst(url: 1: urllen): 0); 95*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt_ccsid(h: CURLOPT_MAIL_FROM: sender_mail: 0); 96*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(h: CURLOPT_MAIL_RCPT: rcpts); 97*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(h: CURLOPT_HTTPHEADER: headers); 98*6236dae4SAndroid Build Coastguard Worker mime = curl_mime_init(h); 99*6236dae4SAndroid Build Coastguard Worker mimepart = curl_mime_addpart(mime); 100*6236dae4SAndroid Build Coastguard Worker curl_mime_data_ccsid(mimepart: 'Please find the ILE/RPG program ' + 101*6236dae4SAndroid Build Coastguard Worker program_name + ' source code in ' + 102*6236dae4SAndroid Build Coastguard Worker 'attachment.' + crlf: 103*6236dae4SAndroid Build Coastguard Worker CURL_ZERO_TERMINATED: 0); 104*6236dae4SAndroid Build Coastguard Worker mimepart = curl_mime_addpart(mime); 105*6236dae4SAndroid Build Coastguard Worker curl_mime_data_cb(mimepart: -1: %paddr(out_data_cb): *NULL: *NULL: 106*6236dae4SAndroid Build Coastguard Worker *NULL); 107*6236dae4SAndroid Build Coastguard Worker curl_mime_filename_ccsid(mimepart: program_name: 0); 108*6236dae4SAndroid Build Coastguard Worker curl_mime_encoder_ccsid(mimepart: 'quoted-printable': 0); 109*6236dae4SAndroid Build Coastguard Worker curl_easy_setopt(h: CURLOPT_MIMEPOST: mime); 110*6236dae4SAndroid Build Coastguard Worker 111*6236dae4SAndroid Build Coastguard Worker // Perform the request. 112*6236dae4SAndroid Build Coastguard Worker 113*6236dae4SAndroid Build Coastguard Worker setll *start RPGXAMPLES; 114*6236dae4SAndroid Build Coastguard Worker result = curl_easy_perform(h); 115*6236dae4SAndroid Build Coastguard Worker 116*6236dae4SAndroid Build Coastguard Worker // Cleanup. 117*6236dae4SAndroid Build Coastguard Worker 118*6236dae4SAndroid Build Coastguard Worker curl_mime_free(mime); 119*6236dae4SAndroid Build Coastguard Worker curl_slist_free_all(headers); 120*6236dae4SAndroid Build Coastguard Worker curl_slist_free_all(rcpts); 121*6236dae4SAndroid Build Coastguard Worker curl_easy_cleanup(h); // Release handle 122*6236dae4SAndroid Build Coastguard Worker endif; 123*6236dae4SAndroid Build Coastguard Worker 124*6236dae4SAndroid Build Coastguard Worker // Check for error and report if some. 125*6236dae4SAndroid Build Coastguard Worker 126*6236dae4SAndroid Build Coastguard Worker if result <> CURLE_OK; 127*6236dae4SAndroid Build Coastguard Worker errmsgp = curl_easy_strerror_ccsid(result: 0); 128*6236dae4SAndroid Build Coastguard Worker response = %str(errmsgp); 129*6236dae4SAndroid Build Coastguard Worker dsply '' '*EXT' response; 130*6236dae4SAndroid Build Coastguard Worker else; 131*6236dae4SAndroid Build Coastguard Worker response = 'Mail sent'; 132*6236dae4SAndroid Build Coastguard Worker dsply '' '*EXT' response; 133*6236dae4SAndroid Build Coastguard Worker endif; 134*6236dae4SAndroid Build Coastguard Worker p main e 135*6236dae4SAndroid Build Coastguard Worker * 136*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 137*6236dae4SAndroid Build Coastguard Worker * Attachment data callback procedure. 138*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 139*6236dae4SAndroid Build Coastguard Worker * 140*6236dae4SAndroid Build Coastguard Worker p out_data_cb b 141*6236dae4SAndroid Build Coastguard Worker d out_data_cb pi 10u 0 142*6236dae4SAndroid Build Coastguard Worker d ptr * value Output data pointer 143*6236dae4SAndroid Build Coastguard Worker d size 10u 0 value Data element size 144*6236dae4SAndroid Build Coastguard Worker d nmemb 10u 0 value Data element count 145*6236dae4SAndroid Build Coastguard Worker d userdata * value User data pointer 146*6236dae4SAndroid Build Coastguard Worker * 147*6236dae4SAndroid Build Coastguard Worker d buffer s 9999999 based(ptr) Output buffer 148*6236dae4SAndroid Build Coastguard Worker d line s 9999999 based(lineptr) ASCII line pointer 149*6236dae4SAndroid Build Coastguard Worker d linelen s 10u 0 150*6236dae4SAndroid Build Coastguard Worker d i s 10u 0 Buffer position 151*6236dae4SAndroid Build Coastguard Worker * 152*6236dae4SAndroid Build Coastguard Worker size = size * nmemb; // The size in bytes. 153*6236dae4SAndroid Build Coastguard Worker i = 0; 154*6236dae4SAndroid Build Coastguard Worker dow size - i >= %len(SRCDTA) + %len(crlf) and not %eof(RPGXAMPLES); 155*6236dae4SAndroid Build Coastguard Worker read record; 156*6236dae4SAndroid Build Coastguard Worker lineptr = curl_from_ccsid(%trimr(SRCDTA) + crlf: 0); 157*6236dae4SAndroid Build Coastguard Worker linelen = %scan(X'00': line) - 1; 158*6236dae4SAndroid Build Coastguard Worker %subst(buffer: i + 1: linelen) = %str(lineptr); 159*6236dae4SAndroid Build Coastguard Worker curl_free(lineptr); 160*6236dae4SAndroid Build Coastguard Worker i = i + linelen; 161*6236dae4SAndroid Build Coastguard Worker enddo; 162*6236dae4SAndroid Build Coastguard Worker return i; 163*6236dae4SAndroid Build Coastguard Worker p out_data_cb e 164*6236dae4SAndroid Build Coastguard Worker * 165*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 166*6236dae4SAndroid Build Coastguard Worker * Mail-formatted date procedure. 167*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 168*6236dae4SAndroid Build Coastguard Worker * 169*6236dae4SAndroid Build Coastguard Worker p mail_date b 170*6236dae4SAndroid Build Coastguard Worker d mail_date pi 50 varying 171*6236dae4SAndroid Build Coastguard Worker * 172*6236dae4SAndroid Build Coastguard Worker d sysval ds qualified To retrieve timezone 173*6236dae4SAndroid Build Coastguard Worker d numsysval 10u 0 174*6236dae4SAndroid Build Coastguard Worker d offset 10u 0 175*6236dae4SAndroid Build Coastguard Worker d 100 176*6236dae4SAndroid Build Coastguard Worker * 177*6236dae4SAndroid Build Coastguard Worker d get_sysval pr extpgm('QWCRSVAL') 178*6236dae4SAndroid Build Coastguard Worker d outdata likeds(sysval) 179*6236dae4SAndroid Build Coastguard Worker d outsize 10u 0 const 180*6236dae4SAndroid Build Coastguard Worker d numsysval 10u 0 const 181*6236dae4SAndroid Build Coastguard Worker d name 10 const 182*6236dae4SAndroid Build Coastguard Worker d errcode 10000 options(*varsize) 183*6236dae4SAndroid Build Coastguard Worker * 184*6236dae4SAndroid Build Coastguard Worker d now ds qualified 185*6236dae4SAndroid Build Coastguard Worker d ts z 186*6236dae4SAndroid Build Coastguard Worker d year 4s 0 overlay(ts: 1) 187*6236dae4SAndroid Build Coastguard Worker d month 2s 0 overlay(ts: 6) 188*6236dae4SAndroid Build Coastguard Worker d day 2s 0 overlay(ts: 9) 189*6236dae4SAndroid Build Coastguard Worker d hour 2s 0 overlay(ts: 12) 190*6236dae4SAndroid Build Coastguard Worker d minute 2 overlay(ts: 15) 191*6236dae4SAndroid Build Coastguard Worker d second 2 overlay(ts: 18) 192*6236dae4SAndroid Build Coastguard Worker * 193*6236dae4SAndroid Build Coastguard Worker d sysvalinfo ds qualified based(sysvalinfoptr) 194*6236dae4SAndroid Build Coastguard Worker d name 10 195*6236dae4SAndroid Build Coastguard Worker d type 1 196*6236dae4SAndroid Build Coastguard Worker d status 1 197*6236dae4SAndroid Build Coastguard Worker d length 10u 0 198*6236dae4SAndroid Build Coastguard Worker d value 99999 199*6236dae4SAndroid Build Coastguard Worker * 200*6236dae4SAndroid Build Coastguard Worker d qusec ds qualified 201*6236dae4SAndroid Build Coastguard Worker d 10u 0 inz(0) 202*6236dae4SAndroid Build Coastguard Worker * 203*6236dae4SAndroid Build Coastguard Worker d weekday s 10u 0 204*6236dae4SAndroid Build Coastguard Worker * 205*6236dae4SAndroid Build Coastguard Worker now.ts = %timestamp(*SYS); 206*6236dae4SAndroid Build Coastguard Worker get_sysval(sysval: %len(sysval): 1: 'QUTCOFFSET': qusec); 207*6236dae4SAndroid Build Coastguard Worker sysvalinfoptr = %addr(sysval) + sysval.offset; 208*6236dae4SAndroid Build Coastguard Worker weekday = %rem(%diff(now.ts: %timestamp('2001-01-01-00.00.00.000000'): 209*6236dae4SAndroid Build Coastguard Worker *DAYS): 7); 210*6236dae4SAndroid Build Coastguard Worker return %subst('MonTueWedThuFriSatSun': 3 * weekday + 1: 3) + ', ' + 211*6236dae4SAndroid Build Coastguard Worker %char(now.day) + ' ' + 212*6236dae4SAndroid Build Coastguard Worker %subst('JanFebMarAprMayJunJulAugSepOctNovDec': 213*6236dae4SAndroid Build Coastguard Worker 3 * now.month - 2: 3) + ' ' + 214*6236dae4SAndroid Build Coastguard Worker %char(now.year) + ' ' + 215*6236dae4SAndroid Build Coastguard Worker %char(now.hour) + ':' + now.minute + ':' + now.second + ' ' + 216*6236dae4SAndroid Build Coastguard Worker %subst(sysvalinfo.value: 1: sysvalinfo.length); 217*6236dae4SAndroid Build Coastguard Worker p mail_date e 218*6236dae4SAndroid Build Coastguard Worker * 219*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 220*6236dae4SAndroid Build Coastguard Worker * Get the length of right-trimmed string 221*6236dae4SAndroid Build Coastguard Worker ************************************************************************** 222*6236dae4SAndroid Build Coastguard Worker * 223*6236dae4SAndroid Build Coastguard Worker p trimmed_length b 224*6236dae4SAndroid Build Coastguard Worker d trimmed_length pi 10u 0 225*6236dae4SAndroid Build Coastguard Worker d string 999999 const options(*varsize) 226*6236dae4SAndroid Build Coastguard Worker d length 10u 0 value 227*6236dae4SAndroid Build Coastguard Worker * 228*6236dae4SAndroid Build Coastguard Worker d addrdiff s 10i 0 229*6236dae4SAndroid Build Coastguard Worker d len s 10u 0 230*6236dae4SAndroid Build Coastguard Worker * 231*6236dae4SAndroid Build Coastguard Worker len = %scan(X'00': string: 1: length); // Limit to zero-terminated string 232*6236dae4SAndroid Build Coastguard Worker if len = 0; 233*6236dae4SAndroid Build Coastguard Worker len = length + 1; 234*6236dae4SAndroid Build Coastguard Worker endif; 235*6236dae4SAndroid Build Coastguard Worker if len <= 1; 236*6236dae4SAndroid Build Coastguard Worker return 0; 237*6236dae4SAndroid Build Coastguard Worker endif; 238*6236dae4SAndroid Build Coastguard Worker return %checkr(' ': string: len - 1); // Trim right 239*6236dae4SAndroid Build Coastguard Worker p trimmed_length e 240