      * Curl SMTP send source member as attachment
      *
     h DFTACTGRP(*NO) ACTGRP(*NEW)
     h OPTION(*NOSHOWCPY)
     h BNDDIR('CURL')
      *
      **************************************************************************
      *                                  _   _ ____  _
      *  Project                     ___| | | |  _ \| |
      *                             / __| | | | |_) | |
      *                            | (__| |_| |  _ <| |___
      *                             \___|\___/|_| \_\_____|
      *
      * Copyright (C) Daniel Stenberg, <daniel@haxx.se>, et al.
      *
      * This software is licensed as described in the file COPYING, which
      * you should have received as part of this distribution. The terms
      * are also available at https://curl.se/docs/copyright.html.
      *
      * You may opt to use, copy, modify, merge, publish, distribute and/or sell
      * copies of the Software, and permit persons to whom the Software is
      * furnished to do so, under the terms of the COPYING file.
      *
      * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF
      * ANY KIND, either express or implied.
      *
      * SPDX-License-Identifier: curl
      *
      **************************************************************************
      *
      /include H,CURL.INC
      *
      * Example to SMTP send source member as attachment via SMTP.
      *
     fRPGXAMPLESif   e             disk    extmbr(program_name)
     f                                     rename(RPGXAMPLES: record)
     d                 pi
     d url                           60                                         SMTP server URL
     d recipient_mail                40                                         Recipient mail addr
      *
     d program_name    c                   'SMTPSRCMBR'                         Member name to send
     d sender_name     c                   'Curl'                               Sender name
     d sender_mail     c                   'curl@example.com'                   Sender e-mail
     d recipient_name  c                   'WIMC'                               Recipient name
     d crlf            c                   X'0D25'
      *
     d urllen          s             10u 0                                      URL length
     d rcptmlen        s             10u 0                                      Recipient mail len
      *
      **************************************************************************

        urllen = trimmed_length(url: %len(url));
        rcptmlen = trimmed_length(recipient_mail: %len(recipient_mail));

        // Do the curl stuff.

        curl_global_init(CURL_GLOBAL_ALL);
        main();
        curl_global_cleanup();
        *inlr = *on;            // Exit
      *
      **************************************************************************
      * Main procedure: do the curl job.
      **************************************************************************
      *
     p main            b
     d main            pi
      *
     d h               s               *                                        Easy handle
     d result          s                   like(CURLcode)                       Curl return code
     d                                     inz(CURLE_OUT_OF_MEMORY)
     d errmsgp         s               *                                        Error string pointer
     d response        s             52                                         For error display
     d headers         s               *   inz(*NULL)                           Mail headers
     d rcpts           s               *   inz(*NULL)                           List of recipients
     d mime            s               *                                        Mail MIME structure
     d mimepart        s               *                                        Mail part

            // Create and fill curl handle.

        h = curl_easy_init();
        if h <> *NULL;
            rcpts = curl_slist_append_ccsid(rcpts:
                                        %subst(recipient_mail: 1: rcptmlen): 0);
            headers = curl_slist_append_ccsid(headers: 'From: ' + sender_name +
                                                       ' <' + sender_mail + '>':
                                              0);
            headers = curl_slist_append_ccsid(headers: 'To: ' + recipient_name +
                           ' <' + %subst(recipient_mail: 1: rcptmlen) + '>': 0);
            headers = curl_slist_append_ccsid(headers: 'Subject: An ILE/RPG ' +
                                              'source program': 0);
            headers = curl_slist_append_ccsid(headers: 'Date: ' + mail_date():
                                              0);
            curl_easy_setopt_ccsid(h: CURLOPT_URL: %subst(url: 1: urllen): 0);
            curl_easy_setopt_ccsid(h: CURLOPT_MAIL_FROM: sender_mail: 0);
            curl_easy_setopt(h: CURLOPT_MAIL_RCPT: rcpts);
            curl_easy_setopt(h: CURLOPT_HTTPHEADER: headers);
            mime = curl_mime_init(h);
            mimepart = curl_mime_addpart(mime);
            curl_mime_data_ccsid(mimepart: 'Please find the ILE/RPG program ' +
                                           program_name + ' source code in ' +
                                           'attachment.' + crlf:
                                 CURL_ZERO_TERMINATED: 0);
            mimepart = curl_mime_addpart(mime);
            curl_mime_data_cb(mimepart: -1: %paddr(out_data_cb): *NULL: *NULL:
                              *NULL);
            curl_mime_filename_ccsid(mimepart: program_name: 0);
            curl_mime_encoder_ccsid(mimepart: 'quoted-printable': 0);
            curl_easy_setopt(h: CURLOPT_MIMEPOST: mime);

            // Perform the request.

            setll *start RPGXAMPLES;
            result = curl_easy_perform(h);

            // Cleanup.

            curl_mime_free(mime);
            curl_slist_free_all(headers);
            curl_slist_free_all(rcpts);
            curl_easy_cleanup(h);       // Release handle
        endif;

        // Check for error and report if some.

        if result <> CURLE_OK;
            errmsgp = curl_easy_strerror_ccsid(result: 0);
            response = %str(errmsgp);
            dsply '' '*EXT' response;
        else;
            response = 'Mail sent';
            dsply '' '*EXT' response;
        endif;
     p main            e
      *
      **************************************************************************
      * Attachment data callback procedure.
      **************************************************************************
      *
     p out_data_cb     b
     d out_data_cb     pi            10u 0
     d  ptr                            *   value                                Output data pointer
     d  size                         10u 0 value                                Data element size
     d  nmemb                        10u 0 value                                Data element count
     d  userdata                       *   value                                User data pointer
      *
     d buffer          s        9999999    based(ptr)                           Output buffer
     d line            s        9999999    based(lineptr)                       ASCII line pointer
     d linelen         s             10u 0
     d i               s             10u 0                                      Buffer position
      *
        size = size * nmemb;                                   // The size in bytes.
        i = 0;
        dow size - i >= %len(SRCDTA) + %len(crlf) and not %eof(RPGXAMPLES);
            read record;
            lineptr = curl_from_ccsid(%trimr(SRCDTA) + crlf: 0);
            linelen = %scan(X'00': line) - 1;
            %subst(buffer: i + 1: linelen) = %str(lineptr);
            curl_free(lineptr);
            i = i + linelen;
        enddo;
        return i;
     p out_data_cb     e
      *
      **************************************************************************
      * Mail-formatted date procedure.
      **************************************************************************
      *
     p mail_date       b
     d mail_date       pi            50    varying
      *
     d sysval          ds                  qualified                            To retrieve timezone
     d  numsysval                    10u 0
     d  offset                       10u 0
     d                              100
      *
     d get_sysval      pr                  extpgm('QWCRSVAL')
     d  outdata                            likeds(sysval)
     d  outsize                      10u 0 const
     d  numsysval                    10u 0 const
     d  name                         10    const
     d  errcode                   10000    options(*varsize)
      *
     d now             ds                  qualified
     d  ts                             z
     d  year                          4s 0 overlay(ts: 1)
     d  month                         2s 0 overlay(ts: 6)
     d  day                           2s 0 overlay(ts: 9)
     d  hour                          2s 0 overlay(ts: 12)
     d  minute                        2    overlay(ts: 15)
     d  second                        2    overlay(ts: 18)
      *
     d sysvalinfo      ds                  qualified based(sysvalinfoptr)
     d  name                         10
     d  type                          1
     d  status                        1
     d  length                       10u 0
     d  value                     99999
      *
     d qusec           ds                  qualified
     d                               10u 0 inz(0)
      *
     d weekday         s             10u 0
      *
        now.ts = %timestamp(*SYS);
        get_sysval(sysval: %len(sysval): 1: 'QUTCOFFSET': qusec);
        sysvalinfoptr = %addr(sysval) + sysval.offset;
        weekday = %rem(%diff(now.ts: %timestamp('2001-01-01-00.00.00.000000'):
                                                *DAYS): 7);
        return %subst('MonTueWedThuFriSatSun': 3 * weekday + 1: 3) + ', ' +
               %char(now.day) + ' ' +
               %subst('JanFebMarAprMayJunJulAugSepOctNovDec':
                      3 * now.month - 2: 3) + ' ' +
               %char(now.year) + ' ' +
               %char(now.hour) + ':' + now.minute + ':' + now.second + ' ' +
               %subst(sysvalinfo.value: 1: sysvalinfo.length);
     p mail_date       e
      *
      **************************************************************************
      * Get the length of right-trimmed string
      **************************************************************************
      *
     p trimmed_length  b
     d trimmed_length  pi            10u 0
     d  string                   999999    const options(*varsize)
     d  length                       10u 0 value
      *
     d addrdiff        s             10i 0
     d len             s             10u 0
      *
        len = %scan(X'00': string: 1: length); // Limit to zero-terminated string
        if len = 0;
            len = length + 1;
        endif;
        if len <= 1;
            return 0;
        endif;
        return %checkr(' ': string: len - 1);  // Trim right
     p trimmed_length  e
