45 votes

Comment intégrer des images dans un courriel en html

J'essaie d'implémenter un code pour envoyer un email HTML avec une image intégrée.

J'ai déjà essayé d'envoyer un simple email HTML avec une image mais cette image est prise depuis le serveur.

0 votes

>Et je ne veux pas utiliser de bibliothèque comme PEAR Pourquoi ? Avez-vous des arguments raisonnables pour expliquer pourquoi vous devez réinventer la roue ?

6 votes

@FractalizeR Je veux apprendre comment cela fonctionne.

74voto

Carlos Lima Points 2579

Je recommande vivement d'utiliser une bibliothèque comme PHPMailer pour envoyer des courriels.
Il est plus facile et gère la plupart des problèmes automatiquement pour vous.

En ce qui concerne l'affichage des images intégrées (en ligne), voici ce qui est prévu leur documentation :

Attaches en ligne

Il existe un moyen supplémentaire d'ajouter une pièce jointe. Si vous voulez faire un e-mail HTML avec des images incorporées dans le bureau, il est nécessaire de joindre l'image image et ensuite lier la balise à celle-ci. Pour Par exemple, si vous ajoutez une image en tant que pièce en pièce jointe avec le CID my-photo, vous vous y accéderez dans l'e-mail HTML avec <img src="cid:my-photo" alt="my-photo" /> .

En détail, voici la fonction permettant d'ajouter une pièce jointe en ligne :

$mail->AddEmbeddedImage(filename, cid, name);
//By using this function with this example's value above, results in this code:
$mail->AddEmbeddedImage('my-photo.jpg', 'my-photo', 'my-photo.jpg ');

Pour vous donner un exemple plus complet de la façon dont cela fonctionnerait :

<?php
require_once('../class.phpmailer.php');
$mail = new PHPMailer(true); // the true param means it will throw exceptions on     errors, which we need to catch

$mail->IsSMTP(); // telling the class to use SMTP

try {
  $mail->Host       = "mail.yourdomain.com"; // SMTP server
  $mail->Port       = 25;                    // set the SMTP port
  $mail->SetFrom('name@yourdomain.com', 'First Last');
  $mail->AddAddress('whoto@otherdomain.com', 'John Doe');
  $mail->Subject = 'PHPMailer Test';

  $mail->AddEmbeddedImage("rocks.png", "my-attach", "rocks.png");
  $mail->Body = 'Your <b>HTML</b> with an embedded Image: <img src="cid:my-attach"> Here is an image!';

  $mail->AddAttachment('something.zip'); // this is a regular attachment (Not inline)
  $mail->Send();
  echo "Message Sent OK<p></p>\n";
} catch (phpmailerException $e) {
  echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
  echo $e->getMessage(); //Boring error messages from anything else!
}
?>

Edit :

Concernant votre commentaire, vous avez demandé comment envoyer du HTML e-mail avec des images intégrées, donc je vous ai donné un exemple de la façon de le faire.
La bibliothèque dont je vous ai parlé peut envoyer des courriels en utilisant de nombreuses autres méthodes que le SMTP.
Jetez un coup d'œil à la Page d'exemple de PHPMailer pour d'autres exemples.

D'une manière ou d'une autre, si vous ne voulez pas envoyer le courrier électronique de la manière prise en charge par la bibliothèque, vous pouvez (devriez) toujours utiliser la bibliothèque pour construire le message, puis vous l'envoyez de la manière que vous voulez.

Par exemple :

Vous pouvez remplacer la ligne qui envoie l'email :

$mail->Send();

Avec ça :

$mime_message = $mail->CreateBody(); //Retrieve the message content
echo $mime_message; // Echo it to the screen or send it using whatever method you want

J'espère que cela vous aidera. Faites-moi savoir si vous rencontrez des difficultés à l'utiliser.

0 votes

Bonjour Carlos Vous êtes excellent, mais je ne suis pas satisfait de votre exemple car vous avez résolu mon problème en utilisant un serveur smtp, et je n'utilise pas de serveur SMTP, je travaille sur un simple fire ftp mais en tout cas merci pour votre aide.

1 votes

Mise à jour de la réponse avec une alternative. J'espère que cela vous aidera ! Bonne chance :)

2 votes

J'ai dû ajouter $mail->IsHTML(true); pour obtenir l'image incorporée.

31voto

Arthur Halma Points 3042

J'utilise cette fonction qui trouve toutes les images dans ma lettre et les joint au message.

Paramètres : Prend votre HTML (que vous voulez envoyer) ;
Retour : Le HTML et les en-têtes nécessaires, que vous pouvez utiliser dans mail() ;

Exemple d'utilisation :

define("DEFCALLBACKMAIL", "yourmail@yourdomain.com"); // WIll be shown as "from".
$final_msg = preparehtmlmail($html); // give a function your html*

mail('your@mail.com', 'your subject', $final_msg['multipart'], $final_msg['headers']); 
// send email with all images from html attached to letter

function preparehtmlmail($html) {

  preg_match_all('~<img.*?src=.([\/.a-z0-9:_-]+).*?>~si',$html,$matches);
  $i = 0;
  $paths = array();

  foreach ($matches[1] as $img) {
    $img_old = $img;

    if(strpos($img, "http://") == false) {
      $uri = parse_url($img);
      $paths[$i]['path'] = $_SERVER['DOCUMENT_ROOT'].$uri['path'];
      $content_id = md5($img);
      $html = str_replace($img_old,'cid:'.$content_id,$html);
      $paths[$i++]['cid'] = $content_id;
    }
  }

  $boundary = "--".md5(uniqid(time()));
  $headers .= "MIME-Version: 1.0\n";
  $headers .="Content-Type: multipart/mixed; boundary=\"$boundary\"\n";
  $headers .= "From: ".DEFCALLBACKMAIL."\r\n";
  $multipart = '';
  $multipart .= "--$boundary\n";
  $kod = 'utf-8';
  $multipart .= "Content-Type: text/html; charset=$kod\n";
  $multipart .= "Content-Transfer-Encoding: Quot-Printed\n\n";
  $multipart .= "$html\n\n";

  foreach ($paths as $path) {
    if(file_exists($path['path']))
      $fp = fopen($path['path'],"r");
      if (!$fp)  {
        return false;
      }

    $imagetype = substr(strrchr($path['path'], '.' ),1);
    $file = fread($fp, filesize($path['path']));
    fclose($fp);

    $message_part = "";

    switch ($imagetype) {
      case 'png':
      case 'PNG':
            $message_part .= "Content-Type: image/png";
            break;
      case 'jpg':
      case 'jpeg':
      case 'JPG':
      case 'JPEG':
            $message_part .= "Content-Type: image/jpeg";
            break;
      case 'gif':
      case 'GIF':
            $message_part .= "Content-Type: image/gif";
            break;
    }

    $message_part .= "; file_name = \"$path\"\n";
    $message_part .= 'Content-ID: <'.$path['cid'].">\n";
    $message_part .= "Content-Transfer-Encoding: base64\n";
    $message_part .= "Content-Disposition: inline; filename = \"".basename($path['path'])."\"\n\n";
    $message_part .= chunk_split(base64_encode($file))."\n";
    $multipart .= "--$boundary\n".$message_part."\n";

  }

  $multipart .= "--$boundary--\n";
  return array('multipart' => $multipart, 'headers' => $headers);  
}

0 votes

Veuillez noter que la solution éditée ne fonctionne plus en raison du fait que le hasard a mis un * au lieu d'un ; après cette ligne : $final_msg = preparehtmlmail($html) . Après avoir changé cela, cela fonctionne presque parfaitement : maintenant, il affiche toujours DEFFCALLBACKMAIL dans le champ from...

0 votes

Est-ce que ça marche ? J'ai essayé et file_name = \"$path\" \n il est écrit file_name = Array dans l'email

0 votes

Parce que $path est Array et non une chaîne. Essayez $path['path'] .

17voto

donis Points 385

PHPMailer a la capacité d'intégrer automatiquement les images de votre courriel HTML. Vous devez donner le chemin complet dans le système de fichiers, lorsque vous écrivez votre HTML :

<img src="/var/www/host/images/photo.png" alt="my photo" />

Il sera automatiquement converti en :

<img src="cid:photo.png" alt="my photo" />

1voto

cletus Points 276888

Vous devez encoder votre e-mail en tant que mime multipart et ensuite vous pouvez joindre les e-mails en tant que pièces jointes. Vous les référencez par cid dans l'email.

Vous pouvez également ne pas les joindre à l'e-mail et utiliser directement les URL, mais la plupart des programmes de messagerie bloqueront cette méthode, car les spammeurs l'utilisent pour détecter la validité des adresses e-mail.

Vous ne dites pas quelle langue, mais en voici une. exemple .

0 votes

Monsieur comment puis-je encoder mon email en tant que mime multipart, signifie qu'il y a un code pour cela ?

1voto

BGM Points 2427

Voici un moyen d'obtenir une variable de type chaîne sans avoir à se soucier du codage.

Si vous avez Mozilla Thunderbird vous pouvez l'utiliser pour récupérer le code html de l'image pour vous.

J'ai écrit un petit tutoriel ici, accompagné d'une capture d'écran (c'est pour powershell, mais cela n'a pas d'importance pour ce cas) :

powershell email avec image html montrant le x rouge

Et encore :

Comment intégrer des images dans un courriel

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X