Problema allegato email

Antonio102

Utente Attivo
12 Set 2014
36
0
6
Ciao a tutti, ho un problema con l'allegato di una email. Il file 'infotxt' viene correttamente creato, ma non viene allegato correttamente alla mail, perche ricevo l'allegato 'noname'. Qual e' l'errore nel codice? Grazie

PHP:
<?php
ob_start();
session_start();

$expMail   = "/^[-0-9a-zA-Z.+_]+@[-0-9a-zA-Z.+_]+\.[a-zA-Z]{2,4}$/i";
    if (isset($_POST['tomail']) && preg_match($expMail, $_POST['tomail'])) {
        $_SESSION['tomail']   = $_POST['tomail'];
    }

$data     = date('r');
$h = fopen('infotxt/info.txt', 'w');
for ($i=0;$i<$_SESSION['numfile'];$i++)
{
fprintf($h, "Ecco alcune info sui file da te caricati\r\n\r\nNome file originale:\t\t%s\r\nDimensione file:\t\t%s KB\r\nTipo MIME file:\t\t\t%s\r\nData e ora caricamento:\t\t%s\r\nProgramma da utilizzare:\t\t%s\r\n",$_SESSION['nomefile-doc'.$i],$_SESSION['size-doc'.$i],$_SESSION['tipo-doc'.$i],$_SESSION['dataupload-doc'.$i],$_SESSION['descrtipo-doc'.$i]);
}
fclose($h);

$to       = $_SESSION['tomail'];
$allegato = chunk_split(base64_encode(file_get_contents('infotxt/info.txt')));
$from     = '[email protected]';
$bound    = 'boundary' . rand(100000000, 999999999) . time();
$bound2   = 'boundary' . time() . rand(100000000, 999999999);

$headers  = <<<intestazioni
from:{$from}
date:{$data}
reply-to:{$from}
Disposition-Notification-To: {$from}
MIME-version:1.0
content-type:multipart/alternative
boundary="$bound"
intestazioni;
$mess     = <<<messaggio
--{$bound}
content-type:multipart/alternative
boundary="$bound2"

--{$bound2}
content-type:text/plain

Ecco il file .txt contenente le info richieste

--{$bound2}
content-type:text/html

<b>Ecco il file .txt contenente le info richieste</b>
--{$bound2}--

--{$bound}
content-type:text/plain
content-transfer-encoding:base64
content-disposition:attachment; filename="infotxt/info.txt"

{$allegato}
--{$bound}--
messaggio;
if (@mail($to, 'Info', $mess, $headers))
echo 'Mail inviata correttamente';
else
echo 'Mail non inviata';
?>
 
Ciao, se puo' esserti utile io uso da anni questo sistema per invio di mail con allegato da form...
Ovviamente ti consiglio phpmailer anche io ma questo sistema è molto più semplice, anche se ha i suoi limiti rispetto a phpmailer
Ovviamente puoi integrare questo form basilare con verifiche varie e antispam

form.html
HTML:
<form action="myemailer.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="destinatario" value="tua@emaildovericevere" name="oggetto" value="Email inviata dal form xxxx....">
<table width="100%" border="0">
<tr>
  <td width="50%" height="40" align="right" valign="middle" style="color: #E4E4E4">Username:</td>
  <td width="50%" height="40" align="left" valign="middle" style="color: #E4E4E4"><input type="text" name="username" value="" /></td>
</tr>
<tr>
  <td width="50%" height="40" align="right" valign="middle" style="color: #E4E4E4">Nome:</td>
  <td width="50%" height="40" align="left" valign="middle" style="color: #E4E4E4"><input type="text" name="nome" value="" /></td>
</tr>
<tr>
  <td width="50%" height="40" align="right" valign="middle" style="color: #E4E4E4">Cognome:</td>
  <td width="50%" height="40" align="left" valign="middle" style="color: #E4E4E4"><input type="text" name="cognome" value="" /></td>
</tr>
<tr>
  <td width="50%" height="40" align="right" valign="middle" style="color: #E4E4E4">email:</td>
  <td width="50%" height="40" align="left" valign="middle" style="color: #E4E4E4"><input type="text" name="mittente" value="" /></td>
</tr>
<tr>
  <td width="50%" height="40" align="right" valign="middle" style="color: #E4E4E4">Allegato:</td>
  <td width="50%" height="40" align="left" valign="middle" style="color: #E4E4E4"><input type="file" name="allegato" /></td>
</tr>
<tr>
  <td height="40" colspan="2" align="center"><input type="submit" value="Invia" /></td>
</tr>
</table>
</form>

myemailer.php

PHP:
<?php
// Recupero il valore dei campi del form
$destinatario = $_POST['destinatario'];
$mittente = $_POST['mittente'];
$username = $_POST['username'];
$nome = $_POST['nome'];
$cognome = $_POST['cognome'];
$oggetto = "Invio documenti per validazione conto gioco";

// Valorizzo le variabili relative all'allegato
$allegato = $_FILES['allegato']['tmp_name'];
$allegato_type = $_FILES['allegato']['type'];
$allegato_name = $_FILES['allegato']['name'];

// Creo 2 variabili che riempirò più avanti...
$headers = "From: " . $mittente;
$msg = "";

// Verifico se il file è stato caricato correttamente via HTTP
// In caso affermativo proseguo nel lavoro...
if (is_uploaded_file($allegato))
{
  // Apro e leggo il file allegato
  $file = fopen($allegato,'rb');
  $data = fread($file, filesize($allegato));
  fclose($file);

  // Adatto il file al formato MIME base64 usando base64_encode
  $data = chunk_split(base64_encode($data));

  // Genero il "separatore"
  // Serve per dividere, appunto, le varie parti del messaggio.
  // Nel nostro caso separerà la parte testuale dall'allegato
  $semi_rand = md5(time());
  $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x";
  
  // Aggiungo le intestazioni necessarie per l'allegato
  $headers .= "\nMIME-Version: 1.0\n";
  $headers .= "Content-Type: multipart/mixed;\n";
  $headers .= " boundary=\"{$mime_boundary}\"";

  // Definisco il tipo di messaggio (MIME/multi-part)
  $msg .= "This is a multi-part message in MIME format.\n\n";

  // Metto il separatore
  $msg .= "--{$mime_boundary}\n";

  // Questa è la parte "testuale" del messaggio
  $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
  $msg .= "Content-Transfer-Encoding: 7bit\n\n";
  $msg .= $nome . " ";
  $msg .= $cognome . " | Username: ";
  $msg .= $username . "\n\n";

  // Metto il separatore
  $msg .= "--{$mime_boundary}\n";

  // Aggiungo l'allegato al messaggio
  $msg .= "Content-Disposition: attachment;\n";
  $msg .= " filename=\"{$allegato_name}\"\n";
  $msg .= "Content-Transfer-Encoding: base64\n\n";
  $msg .= $data . "\n\n";

  // chiudo con il separatore
  $msg .= "--{$mime_boundary}--\n";
}
else
{
  $msg = $messaggio;
}

// Invio la mail
if (mail($destinatario, $oggetto, $msg, $headers))
{
  echo '
email nviata correttamente
  ';
  
}else{
  echo '
errore nell'invio
  ';
}
?>
 

Discussioni simili