Originariamente inviato da Vincent
...
ma quando arriva la mail, alcune immagini non vengono visualizzate, e alcuni links non funzionano.
In effetti tutte le immagini di sfondo della pagina richiamate dal file css vengono caricate nella mail, ma il tag [img]../miaImg.jpg[/img] viene per esempio sostituito con
[img]cid:b3b5c35e730ac3e363f3dd7d8e4132c6[/img]
Ma se apro il browser e lancio il file mail.php, io visualizzo tutto correttamente, ed il codice sorgente risulta pulito come in effetti è stato scritto... come mai accade questo?
P.S. Utilizzo Thunderbird come client di posta elettronica.
...
in breve:
invece di allegare le immagini così:
Codice PHP:
$mail->AddEmbeddedImage('my-photo.jpg', 'my-photo', 'my-photo.jpg');
allegale così, aggiungendo anche i due parametri 'base64' e 'image/jpg' che vedi in più:
Codice PHP:
$mail->AddEmbeddedImage('my-photo.jpg', 'my-photo', 'my-photo.jpg', 'base64', 'image/jpg');
segue spiegazione (per prima cosa: scusate se dico fesserie, alcune cose non sono chiare anche a me, sentitevi liberi di correggere/integrare).
per quanto riguarda il src=cid:... è normale: siccome il protocollo di trasmissione delle email, SMTP, può trattare solo caratteri ASCII a 7 bit, le foto allegate, che sono composte anche di caratteri estesi, vengono trasformate in una sequenza di caratteri a 7 bit. questa sequenza viene messa da una parte nell'email e le viene assegnato un codice particolare: il cid:qualcosa. quindo il corpo dell'email deve proprio fare riferimento a quel cid, perché l'immagine, in effetti, è stata ricodificata in qualcos'altro.
il fatto che un client di posta elettronica possa visualizzare un messaggio email come se fosse una pagina web è qualcosa "in più" rispetto alle sue funzionalità originali e non tutti i client di posta elettronica fanno questo "qualcosa in più" allo stesso modo (per dire, già i browser, che sono dedicati a ciò, non visualizzano le pagine allo stesso modo, figuriamoci i client di posta elettronica...).
la cosa non mi è molto chiara, quindi la riporto per come l'ho capita io: lo standard per gli allegati multimediali sulle email si chiama MIME e non tutti i client, appunto, lo interpretano allo stesso modo. ad esempio, se ho capito bene, gmail (che non è un client ma vabbè) o outlook si accorgono che un certo file allegato/embedded è un'immagine e lo visualizzano come tale anche se gli si dice che secondo lo standard MIME è un "application/octect stream" anziché, come gli si dovrebbe dire, una "image/jpg" o "image/gif" o image/png". thunderbird invece no, vuole proprio che gli venga detto che la mappazza a 7 bit che poi lui deve trasformare in immagine sia proprio un'immagine.
allora, qui viene il bello.
nella documentazione di PHPMailer viene detto che per allegare un'immagine occorre fare così:
Codice PHP:
$mail->AddEmbeddedImage('my-photo.jpg', 'my-photo', 'my-photo.jpg');
ora, se andiamo a cercare la funzione AddEmbeddedImage di PHPMailer che allega le immagini troviamo questa:
Codice PHP:
function AddEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = 'application/octet-stream') {
...
(nella versione di PHPMailer che ho scaricato io, la 2.0.0, è a riga 1312 del file class.phpmailer.php).
come vedi i parametri obbligatori sono solo i primi due *MA!* ce ne sono anche altri facoltativi!
(me ne sono accorto perché pensavo di modificare a mano io la funzione, per fortuna che l'avevano già previsto anche se non l'hanno documentato).
tra questi parametri è l'ultimo quello che ci interessa: serve a dire "marca la mappazza a 7 bit che otterrai ricodificando il file che ti passo come mappazza-immagine e non come mappazza-file generico".
allora per dire esplicitamente a PHPMailer di marcare come immagine la mappazza, in modo che anche Thunderbird la interpreti correttamente, bisognerà allegare le immagini in questo modo:
Codice PHP:
$mail->AddEmbeddedImage('my-photo.jpg', 'my-photo', 'my-photo.jpg', 'base64', 'image/jpg');
cioè passando esplicitamente anche i parametri facoltativi $encoding ('base64') e $type (in questo caso, visto che l'immagine dell'esempio è jpg, 'image/jpg'. se l'immagine fosse gif o png si dovrebbe passare 'image/gif' o 'image/png'. in realtà mi sono accorto per sbaglio che Thunderbird visualizza correttamente sia le gif marcate 'image/jpg' che le jpg marcate 'image/gif'). per $encoding andrebbe bene il valore di default, ma mi pare che i parametri facoltativi possano essere tralasciati solo se stanno tutti in fondo alla chiamata, e non se risultano "in mezzo" come in questo caso.
personalmente non ci sarei mai arrivato se non avessi letto in un altro forum che qualcuno si era accorto che su thunderbird era la marcatura a dare problemi.
forse gli autori di PHPMailer dovrebbero documentare meglio questo meritevole sforzo che hanno fatto!