xref: /aosp_15_r20/external/curl/packages/OS400/rpg-examples/SMTPSRCMBR (revision 6236dae45794135f37c4eb022389c904c8b0090d)
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