*/ function send( \alveolata\email\struct_credentials $credentials, \alveolata\email\struct_data $data ) : void { // constants $separator = \md5(\time()); // helpers $headerEntry = function ($key, $value, $args = []) { return \sprintf( "%s: %s%s\r\n", $key, $value, \implode( '', \array_map( fn($x) => \sprintf('; %s=%s', $x, $args[$x]), \array_keys($args) ) ) ); }; $separatorEntry = function ($final) use ($separator) { return ( $final ? \sprintf("--%s--\r\n", $separator) : \sprintf("--%s\r\n", $separator) ); }; $textEntry = function ($content) { return \sprintf("\r\n%s\r\n", $content); }; // vars $message = ''; $additional_headers = ''; $additional_headers .= $headerEntry('To', \implode(',', $data->to)); $additional_headers .= $headerEntry('Subject', $data->subject); if (! empty($data->from)) { $additional_headers .= $headerEntry('From', $data->from); } if (! empty($data->reply_to)) { $additional_headers .= $headerEntry('Reply-To', $data->reply_to); } if (! empty($data->cc)) { $additional_headers .= $headerEntry('Cc', \implode(',', $data->cc)); } if (! empty($data->bcc)) { $additional_headers .= $headerEntry('Bcc', \implode(',', $data->bcc)); } if (empty($data->attachments)) { $additional_headers .= $headerEntry('Content-Type', 'text/plain', ['charset' => 'utf-8']); $message .= $textEntry(\wordwrap($data->body_plain)); } else { $additional_headers .= $headerEntry('MIME-Version', '1.0'); $additional_headers .= $headerEntry('Content-Type', 'multipart/mixed', ['boundary' => $separator]); $message .= $separatorEntry(false); $message .= $headerEntry('Content-Type', 'text/plain', ['charset' => 'utf-8']); $message .= $headerEntry('Content-Transfer-Encoding', '7bit'); $message .= $textEntry(\wordwrap($data->body_plain)); foreach ($data->attachments as $attachment) { $message .= $separatorEntry(false); $message .= $headerEntry('Content-Transfer-Encoding', 'base64'); $message .= $headerEntry('Content-Type', $attachment['mime'] ?? 'application/octet-stream'); $message .= $headerEntry('Content-Disposition', 'attachment', ['filename' => ($attachment['name'] ?? \basename($attachment['path']))]); $message .= $textEntry(\chunk_split(\base64_encode(\file_get_contents($attachment['path'])))); } $message .= $separatorEntry(true); } // exec $successful = \mail( \implode(',', $data->to), $data->subject, $message, $additional_headers ); if (! $successful) { throw (new \Exception(\sprintf('mail_could_not_be_sent'))); } } ?>