Il tuo codice sembra un mischione di pezzi presi quà e là e che hai cercato di assemblare ;-)
Prova questo:
<?php
//error_reporting(E_ALL);
//ini_set('display_errors',1);
$attachmName = 'dati.xls'; // nome dell'allegato
$sender = 'mittente@....'; // qui devi mettere la vera email del mittente
$to = 'destinatario@....'; // qui devi mettere la vera email del destinatario
$subject = 'Oggetto....'; // // qui devi mettere l'oggetto della e-mail
/* */
$db2 = db2_connect(/*...*/); // Qui devi inserire i paramtri per la connessione!!! vedi https://www.php.net/manual/en/function.db2-connect.php
$query = "Select CCODE, DESCR, NRQTA FROM LIB.MYFILE";
$statement = db2_exec($db2, $query);
$rowsCount = db2_num_rows($statement);
if ($rowsCount > 0)
{
$attachmentData = "Codice\tDescrizione\tQuantità\t\n";
while ($dbRow = db2_fetch_both($statement))
{
$attachmRow = '';
for ($j = 0; $j < 3; $j++)
$attachmRow .= ($dbRow[$j] ?? 'NULL') . ($j < 2 ? "\t" : '');
$attachmRow = preg_replace("/\r\n|\n\r|\r|\n|,/", ' ', $attachmRow);
$attachmentData .= $attachmRow . "\n";
}
$attachmentData = chunk_split(base64_encode(utf8_decode($attachmentData)));
$courtesyMsg = 'In allegato i dati richiesti';
}
else
$courtesyMsg = 'Nessun dato disponibile';
/* */
$eol = "\r\n";
$boundary = md5(date('r', time()));
/* */
$arrHeaders = [];
$arrHeaders[] = "From: $sender";
$arrHeaders[] = 'MIME-Version: 1.0';
$arrHeaders[] = "Content-Type: multipart/mixed; boundary=\"$boundary\"";
$arrHeaders[] = 'Content-Transfer-Encoding: 7bit';
$arrHeaders[] = 'This is a MIME encoded message.';
$headers = implode ($eol, $arrHeaders) . $eol;
/* */
$arrBody = [];
$arrBody[] = '--' . $boundary;
$arrBody[] = 'Content-Type: text/plain; charset="iso-8859-1"';
$arrBody[] = 'Content-Transfer-Encoding: 8bit';
$body = $eol . implode ($eol, $arrBody) . $eol . $eol . $courtesyMsg;
/* */
$attachment = '';
if ($rowsCount > 0)
{
$arrAttach = [];
$arrAttach[] = '--' . $boundary;
$arrAttach[] = "Content-Type: application/octet-stream; name=\"$attachmName\"";
$arrAttach[] = 'Content-Transfer-Encoding: base64';
$arrAttach[] = 'Content-Disposition: attachment';
$attachment = $eol . implode ($eol, $arrAttach) . $eol . $eol . $attachmentData . $eol . "--$boundary--";
}
$message = $body . $attachment;
if (mail($to, $subject, $message, $headers))
echo 'Email inviata';
else
echo 'Email NON inviata';
Tieni presente che dove hai $db2 = db2_connect(); devi passare i dati di connessione che io non ho - io non ho nemmeno DB2 pertantanto una prova reale la puoi fare solo tu.
Ho usato la stessa tecnica che intendevi usare tu per generare l'allegato, in ogni caso in quel modo non si crea un vero file ‘Excel’ ma piuttosto un ‘CSV’ con separatore la tabulazione (di fatto TSV). Creare un vero file XLS diventa più complicato, comunque non dovresti avere problemi a leggerlo con Excel o LibreOffice