Newsgroup: it.comp.www.php
Titolo: PHPMailer e allegati

Salve, sto avendo problemi ad inviare allegati con la classe phpmailer
1.73. Se inserisco un allegato binario ricevo un file corrotto, con i
file di testo invece tutto bene. Ho già cercato nel forum della classe
su sourceforge ed in passato qualcuno aveva avuto problemi a causa
delle magic_quotes che aggiungevano slash, ma poi questo problema è
stato fissato.
Qualcuno ha avuto questo problema e lo ha risolto? Io nel frattempo
continuo i test per cercare di capire dove sta il problema.
Grazie.
Francesco Mazzi
Webmaster di AltroPC.it - 
http://www.altropc.it
 
Staff di E-Xoopport - 
http://www.e-xoopport.it

 Staff di E-Xoopport - 
http://www.e-xoopport.it
Bug report un po' scarno, manca il codice incriminato e il testo
dell'email che srebbe corrotto, incluso headers.
A me funziona, sia multipart/mixed che multipart/alternative con immagini
embedded, e direi che PHPMailer lavora piuttosto bene ed è semplice.
Di problemi di codifica di header e body non mi risultano, salvo che non
codifica il nome dei file in allegato, per cui se contengono caratteri
non-ASCII stampabili, back-slash o virgolette doppie fa casino.
Ciao,
 ___ 
/_|_\  Umberto Salsi
\/_\/  
www.icosaedro.it

non-ASCII stampabili, back-slash o virgolette doppie fa casino.
hai ragione non ho scritto tutto, quindi specifico che:
1) il codice che ho utilizzato per l'invio è questo (l'ho ridotto
all'osso volutamente per isolare il problema):
include "class.phpmailer.php";
$mail = new PHPMailer();
$mail->From     = "
x...@xxx.it
";
$mail->FromName = "Francesco";
$mail->IsMail();
$mail->Subject = "oggetto";
$mail->Body = "ciao!";
if (!$mail->AddAttachment("../images/accessori.jpg"))
{
  echo "non allega!";
}
$mail->AddAddress("
y...@yyy.it
","Francesco");
if($mail->Send())
{
  echo "Email inviata";
}
else
{
  echo $mail->ErrorInfo;
}
2) l'allegato viene inserito ed arriva, se è di tipo binario (ho
provato con jpg e doc) arriva corrotto, se è di testo (txt) arriva
bene; a video viene scritto 
3) il codice sopra l'ho provato su 2 server diversi, uno in locale ed
uno remoto
4) i nomi dei file da allegare sono composti unicamente da lettere,
senza spazi nè caratteri strani
5) ho fatto una verifica veloce ieri sera ed ho notato che ad esempio
un file doc allegato aveva 25 byte in più dell'originale
Appena posso posterò gli header della mail e farò dei confronti più
dettagliati del file originale e del file allegato.
Grazie, ciao.



Message-ID: <a574aeb557c5a632f3a3072f01cfb814@localhost>
X-Priority: 3
X-Mailer: PHPMailer [version 1.73]
MIME-Version: 1.0
Content-Type: multipart/mixed;
	boundary="b1_a574aeb557c5a632f3a3072f01cfb814"
-------------------------------
ed ecco il corpo:
----------------------------
--b1_a574aeb557c5a632f3a3072f01cfb814
Content-Type: text/plain; charset = "iso-8859-1"
Content-Transfer-Encoding: 8bit
ciao!
--b1_a574aeb557c5a632f3a3072f01cfb814
Content-Type: application/octet-stream; name="accessori.jpg"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="accessori.jpg"
---------------------------
segue poi l'allegato. Ho il sospetto che sia il mio client di posta
(Eudora) che corrompe gli allegati..proverò con un altro.


 wrote:
[...]
Devi sempre specificare il MIME type degli allegati, altrimenti ti
mette "application/octet-stream". Un programma client rigoroso dovrebbe
considerare questo allegato per quello che è, cioè un file binario da
non mostrare. Quindi cambierei
$mail->AddAttachment("../images/accessori.jpg")
in
$img = "../images/accessori.jpg";
$mime_type = mime_content_type($img); # "image/jpeg", probabilmente
if(!$mail->AddAttachement($img, basename($img), "base64", $mime_type)) ...
Il testo dell'email che hai postato mi sembra corretto, a parte che
l'allegato manca del tipo MIME giusto e hai tolto il suo body (ma
sicuramente quest'ultimo andrà bene).
Per quanto riguarda i "byte in più" non ti so dire, bisognerebbe
vedere un esempio.
Forse era solo un esempio di allegato "semplice", ma in teoria il
client di posta dovrebbe consentire di salvarla, ma non mostrarla
direttamente. Fai piuttosto un body HTML con immagine embedded:
$m->IsHTML(TRUE);
$cid = md5($img);
$m->Body = "<html><body>Guarda qua: <img src='cid:$cid'></body></html>";
$m->AddEmbeddedImage($img, $cid, basename($img), "base64", $mime_type);
# Alternativa in testo puro:
$m->AltBody = "Guarda qua: " . basename($img);


$m->AltBody = "Guarda qua: " . basename($img);
proviamo così e vediamo cosa fa. Ti faccio sapere, ciao e grazie.


>$m->AltBody = "Guarda qua: " . basename($img);
anche cosě non funziona, l'allegato viene inviato ma risulta corrotto.
Ho verificato anche un'altra cosa: che se invio  lo stesso allegato
piů volte, l'allegato ricevuto risulta sempre corrotto in maniera
diversa, ho confrontato gli allegati ricevuti con un editor
esadecimale.
Il mistero si infittisce.
