Invio email con allegato file xls da php

di il
4 risposte

Invio email con allegato file xls da php

Buongiorno,

vi posto uno script php per la creazione e l'invio di una email con allegato un file xls. Il problema e che non funziona correttamente.

Chi mi da una mano? Grazie 

<?php
header("Content-Type: application/vnd.ms-excel");
header("Content-Disposition: attachment; filename=test.xls");

header("Pragma: no-cache");
header("Expires: 0");
?>
<!DOCTYPE html>
<html lang="it">
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<title><?php echo ''; ?></title>
	</head>
	
	<body>
		<?php
		$db2 = db2_connect();
		$sep = "\t";
		echo "Codice \t Descrizione \t Quantità  \t \n ";
		
		$data = "Select CCODE, DESCR, NRQTA FROM LIB.MYFILE";
		$result = db2_exec($db2, $data);
		$resultRows = db2_num_rows($result);
				
		if ($resultRows>0) {
			$sep = "\t"; //tabbed character
			for ($i = 0; $i < odbc_num_fields($result); $i++) {
				echo odbc_num_fields($result) . "\t";
			}
			print("\n");
		while ($row= db2_fetch_both($result)) {
			$schema_insert = "";
			for ($j=0; $j<odbc_num_fields($result);$j++) {
				if (!isset($row[$j]))
					$schema_insert .= "NULL".$sep;
				elseif ($row[$j] != "")
					$schema_insert .= "$row[$j]".$sep;
				else
					$schema_insert .= "".$sep;
			}
			$schema_insert = str_replace($sep."$", "", $schema_insert);
			$schema_insert = preg_replace("/\r\n|\n\r|\n|\r/", " ", $schema_insert);
			$schema_insert .= "\t";
			print(trim(str_replace(',', " ", $schema_insert)));
			print "\n";
		}

		file_put_contents('$path_to_excelfile', $schema_insert);
	
	}
	
	$to = 'miaemail';
	$subject = 'Test email with attachment';
	$random_hash = md5(date('r', time()));
	$headers = "From: altraemail\r\nReply-To: altraemail";
	$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";
	$attachment = chunk_split(base64_encode(file_get_contents('path to file')));
	mail( $to, $subject, $message, $headers ); 
?>
	</body>
</html> 

4 Risposte

  • Re: Invio email con allegato file xls da php

    Dovresti spiegare quale problema riscontri

  • Re: Invio email con allegato file xls da php

    Buongiorno,

    grazie per il tuo interesse nella mia segnalazione.

    I  problemi riscontrati sono:

    - ho il download del file excel (che non mi serve) quando vado a testare. 

    - la mail che ricevo non ha con se, lo stesso file excel,  in allegato. Non ho allegati.

    - il file excel che ho in download mi riporta le informazioni dell'sql in una unica riga (ESEMPIO): Codice Descrizione Quantità 3AC PRODOTTO1A 4. Il risultato dovrebbe essere:

    CodicedescrizioneQuantità
    3ACPRODOTTO1A4
    XXXXXXXXXXXXXXX

    - nel file excel ho anche questo errore:

    ( ! ) Warning: file_get_contents(path to file): failed to open stream: No such file or directory in C:\www\testlib\Test\test09.php on line 58

  • Re: Invio email con allegato file xls da php

    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

  • Re: Invio email con allegato file xls da php

    Perfetto, funziona.

    Grazie per il tuo suggerimento.

    Y

Devi accedere o registrarti per scrivere nel forum
4 risposte