- Home
- Categorie
- Coding e Sistemistica
- PHP
- Immagini in e-mail
-
Potresti inviare il file dell'immagine come allegato alla mail, in questo modo non è più necessario eseguire richieste esterne per visualizzare il contenuto.
-
potrebbe essere una soluzione per determinate immagini che voglio inserire a fondo della pagina.
Ma se le immagini devono occupare uno spazio ben definito? Io me lo giostro con il codice html e php, inserendole negli spazi che voglio io.
-
Quando si utilizzano immagini come allegati alla mail, bisogna usare codice html standard, come quando si fa riferimento ad immagini esterne, l'unica differenza sta nel SRC che è diverso.
Ecco un esempio di come inviare email con immagine allegata.
[php]
// Intestazioni generali
$header = "From: Mittente [email protected]\n";
$header .= "To: Destinatario [email protected]\n";
$header .= "X-Mailer: PHP" . phpversion() "\n"; //Opzionale// Stringa boundary per la separazione dei contenuti
$boundary = "==String_Boundary_x" .md5(time()). "x";// Intestazioni per messaggi related (Standard MIME)
$header .= "MIME-Version: 1.0\n";
$header .= "Content-Type: multipart/related;\n";
$header .= " boundary="$boundary";\n\n";// Messaggio per programmi che non sopportano i MIME
$messaggio = "Il programma non supporta i MIME\n\n";srand((double)microtime() * 1000000);
$chars = array('a','b','c','d','e','f', 'g','h','i','l','m','n','o','p','q','r','s','t','u','v','z','x','w','y','j','j');for($rand = 1; $rand <= 15; $rand++)
{
$random = rand(0, count($chars) - 1);
$randstr .= $chars[$random];
}// Messaggio HTML
$messaggio .= "--$boundary\n";
$messaggio .= "Content-Type: text/html; charset="iso-8859-1"\n";
$messaggio .= "Content-Transfer-Encoding: 7bit\n\n";
$messaggio .= "<html>
<body>
<p>Messaggio HTML con immagine</p>
<p><img src="cid:$randstr" alt="immagine"></p>
</body>
</html>\n\n";// Sezione contenente l'immagine con attributo ID = $randstr
// L'immagine si trova già sul server
$messaggio .= "--$boundary\n";
$messaggio .= "Content-ID: <$randstr>\n";
$messaggio .= "Content-Type: " . mime_content_type("immagine.jpg") . "\n";
$messaggio .= "Content-Transfer-Encoding: base64\n\n";// Leggiamo l'immagine
$allegato = "immagine.jpg";
$file = fopen($allegato,'rb');
$data = fread($file, filesize($allegato));
fclose($file);// Trasmetto l'immagine usando la codifica base64
$data = chunk_split(base64_encode($data));
$messaggio .= "$data\n\n";// Chiusura del messaggio con la stringa boundary
$messaggio .= "--$boundary--\n";$subject = "Soggetto";
if(@mail("[email protected]", $subject, $messaggio, $header))
echo "Inviata!";
else
echo "Non Inviata!";
[/php]
-
Ma l'immagine non deve essere inviata come allegato, bensì inserita nel testo dell'email.
Ripeto: il codice che avevo scritto inizialmente andava bene, perchè l'immagine viene visualizzata, solo che se la apro con outlook, l'utente deve ogni volta dare il consenso per visualizzarla.
-
Nell'esempio che ti ho fatto, l'immagine viene mostrata all'interno del messaggio.
L'unica differenza col tuo codice è che il tag IMG, non fà più riferimento aud un link esterno (ritenuto pericoloso e bloccato da outlook), ma ad un link interno alla mail, l'allegato.
-
Ho provato il tuo codice ma l'e-mail non parte
-
Che errore ti dà?
-
No, la manda l'e-mail.
Però invia un'immagine vuote. Forse sbaglio qualcosa.
Quando vado ad inserire il nome dell'immagine, devo specificare il percorso? Tipo così:[php]
$messaggio .= "Content-Type: " . mime_content_type("w ww.nomesito.it/immagine.jpg") . "\n";
[/php]
-
E' meglio se usi l'url locale per le immagine che inserisci.
Seconda cosa, la funzione mime_content_type() non è sempre supportata, in alternativa puoi sostituirla con "image/jpeg", "image/png", "image/gif" o "image/bmp" in base all'immagine.[php]
$messaggio .= "Content-Type: image/jpeg\n";
[/php]
-
Ok, così funziona.
Mille grazie per la pazienza, se un giorno passi dalle mie parti ti offro un caffè
-
Ok va bene!
-
Scusate se riapro una discussione già chiusa da tempo, ma credo sia il posto più attinete.
Sto impazzendo da giorni su questo codice, riesco ad inviare la mail, ma non si vede l'immagine.
Cosa sbaglio?<?php //DESTINATARIO MAIL: Invio i dati del form alla mia mail $to= "[email protected]"; //Intestazione generica // L?INDIRIZZO DEL MITTENTE DELLA MAIL recuperato dal campo mail_address // Nome e Cognome del mittente DELLA MAIL recuperato da $_POST $from = trim(stripslashes($_POST["nome"]))." ".trim(stripslashes($_POST["cognome"])); //Oggetto della mail $subject = "Richiesta informazioni da ".$from." tramite Campasite"; //Creazione dell'header $header = "From: ".$from." <".$_POST[mail_address].">\n"; $header .="CC: <[email protected]>"; $header .= "Reply-to: <".$to.">\n"; //Se voglio sapere con che progrmma genero la mail inserisco questo campo //$header .= "X-Mailer: Il nostro Php\n"; // generiamo le stringhe che fungono da separatori $boundary = "==String_Boundary_x" .md5(time()). "x"; $boundary2 = "==String_Boundary2_y" .md5(time()). "y"; // costruiamo le intestazioni che specificano // un messaggio costituito da più parti alternative $header .= "MIME-Version: 1.0\n"; $header .= "Content-Type: multipart/related;\n"; $header .= " type=\"multipart/alternative\";\n"; $header .= " boundary=\"$boundary\";\n\n"; // questa parte del messaggio viene visualizzata // solo se il programma non sa interpretare // i MIME poiché è posta prima della stringa boundary $messaggio = $_POST[note]."\n\nSe visualizzi questo testo il tuo programma non supporta i MIME.\n\n"; // il primo segmento del multipart/related // è definito come multipart/alternative $messaggio .= "--$boundary\n"; $messaggio .= "Content-Type: multipart/alternative;\n"; $messaggio .= " boundary=\"$boundary2\";\n\n"; // sezione alternativa in puro testo $messaggio .= "--$boundary2\n"; $messaggio .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n"; $messaggio .= "Content-Transfer-Encoding: 7bit\n\n"; $messaggio .= $_POST[note]."\n\nMessaggio in formato testo.\n\n"; // sezione alternativa del messaggio in formato html $messaggio .= "--$boundary2\n"; $messaggio .= "Content-Type: text/html; charset=\"iso-8859-1\"\n"; $messaggio .= "Content-Transfer-Encoding: 7bit\n\n"; $messaggio .= " <html> <head> <title>La mia email HTML</title> <style type=\"text/css\"> body {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; font-weight:normal; color:#000000;} </style> </head> <body> <p>Ecco la mia prima mail in HTML.<br>Questo testo è in <strong>bold</strong></p> <p>E qui ci metto questa immagine: <img src=\"cid:$FiatImg\"> alt=\"Monogramma AC\"</p> </body> </html>\n"; // chiusura della sezione multipart/alternative $messaggio .= "--$boundary2--\n"; // seconda sezione del multipart/related contenente l?immagine // cui attribuiamo l?id MiaImmagine123 $messaggio .= "--$boundary\n"; $messaggio .= "Content-ID: <$FiatImg>\n"; $messaggio .= "Content-Type: image/jpg\n"; $messaggio .= "Content-Transfer-Encoding: base64\n\n"; // leggiamo il file corrispondente all?immagine dal nostro server $allegato = "./Fiat_Logo.jpg"; $file = fopen($allegato,?rb?); $data = fread($file,filesize($allegato)); fclose($file); // usiamo la codifica base64 per trasmettere il file $data = chunk_split(base64_encode($data)); $messaggio .= "$data\n\n"; // chiusura del messaggio con la stringa boundary $messaggio .= "--$boundary--\n"; if( @mail($to, $subject, $messaggio, $header) ) echo "E-mail inviata con successo!"; else echo "Errore nell?invio dell?e-mail!"; ?>
-
Risolto!!!!
Avevo copiato tre righe di codice da una paginaa internet e mi si visualizzavano correttamente i"-", ma non erano interpretati correttamente.