2010-06-22 7 views
1

Je sais intégrer une image dans un courriel en pièce jointe, mais ce n'est pas vraiment ce que je veux faire. Ce que je veux faire est d'intégrer une image dans le message et l'utiliser dans le corps du message lui-même. Est-il possible de faire cela ou de référencer éventuellement un fichier joint d'une manière ou d'une autre pour être utilisé dans le message?Intégrer des images à utiliser dans un message électronique en utilisant PHP?

Dois-je même m'inquiéter à ce sujet? Est-il plus avantageux de simplement les charger via un lien vers l'image sur mon réseau? Je pensais que cela enlèverait un peu de charge à mon serveur, de sorte qu'il ne devrait pas être téléchargé directement depuis mon site dans tous les messages électroniques ouverts, ce qui réduirait un peu la bande passante.

Remarque: Je ne recherche aucun framework ou bibliothèque de messagerie, etc., simplement pour réaliser cette tâche de manière simple.

Répondre

3

Les gens vont sonner pour vous dire d'utiliser SwiftMailer ou d'une autre bibliothèque. Mais ce n'est pas si difficile. C'est très difficile, mais pas dur. Voici une fonction que j'utilise. Je l'ai anonymisé un peu, et j'espère ne rien casser. Dans le message html (que je reçois d'une autre fonction), un lien vers votre image jointe de cette façon:

$output .= '<p><img src="cid:' . $linkID . '" alt="graph" /></p>'; 

$linkID est la même valeur utilisée dans la fonction ci-dessous.

public function sendEmail($emailAddress) 
{ 
    $random_hash = md5(date('r', time())); 

    $htmlString = $this->getHTML($random_hash); 

    $message = "--mixed-$random_hash\n"; 
    $message .= 'Content-Type: multipart/alternative; boundary="alt-' . $random_hash . '"' . "\n\n"; 
    $message .= 'MIME-Version: 1.0' . "\n"; 
    $message .= '--alt-' . $random_hash . "\n"; 
    $message .= 'Content-Type: text/plain; charset="iso-8859-1"' . "\n"; 
    $message .= 'Content-Transfer-Encoding: 7bit' . "\n\n"; 

    // text message 
    $message .= strip_tags($htmlString) . "\n\n"; 

    $message .= '--alt-' . $random_hash . "\n"; 
    $message .= 'Content-Type: text/html; charset="iso-8859-1"' . "\n"; 
    // $message .= 'MIME-Version: 1.0' . "\n"; 
    $message .= 'Content-Transfer-Encoding: 7bit' . "\n\n"; 

    // html message 
    $message .= $htmlString . "\n\n"; 

    $message .= '--alt-' . $random_hash . '--' . "\n"; 

    // graph image 
    if($this->selectedGraph != 0) 
    { 
     $graphString = $this->getGraph(); 
     $graphString = chunk_split(base64_encode($graphString)); 

     $linkID = 'graph-' . $random_hash . '-image'; 

     $message .= '--mixed-' . $random_hash . "\n"; 
     $message .= 'MIME-Version: 1.0' . "\n"; 
     $message .= 'Content-Transfer-Encoding: base64' . "\n"; 
     $message .= 'Content-ID: ' . $linkID . "\n"; 
     $message .= 'Content-Type: image/gif; name="graph.gif"' . "\n"; 
     $message .= 'Content-Disposition: attachment' . "\n\n"; 

     $message .= $graphString; 
     $message .= '--mixed-' . $random_hash . '--' . "\n"; 

    } 
    else 
    { 
     $message .= '--mixed-' . $random_hash . '--' . "\n"; 
    } 


    $headers = 'From: ' . $this->from. "\r\nReply-To: " . $this->replyto; 
    $headers .= "\r\nContent-Type: multipart/related; boundary=\"mixed-" . $random_hash . "\"\r\nMIME-Version: 1.0"; 

    $flags = '-f ' . BOUNCED_EMAIL_ADDRESS; 

    return mail($emailAddress, $this->subject, $message, $headers, $flags); 

} 

Que ce soit intéressant ou non, c'est une autre question. Si vous joignez l'image, vous utilisez la bande passante pour envoyer le message. Peut-être vaut-il mieux utiliser la bande passante en même temps plutôt que de l'étaler? Peut être pas.

Je n'ai pas utilisé d'images jointes jusqu'à ce que je devais envoyer une image différente à chaque destinataire. Je n'étais pas sur le point de stocker et de gérer toutes ces images sur notre serveur (et essayer de les nommer de façon unique).

+0

est '$ this-> getGraph()' chargement juste le contenu de l'image comme 'file_get_contents()' serait? – animuson

+0

Dans mon cas, getGraph() crée réellement l'image en utilisant une bibliothèque de graphiques, mais oui, c'est la même idée. –

+0

Une raison pour envoyer l'image dans le courrier au lieu d'un lien pourrait être que certains clients de messagerie n'ouvriront pas d'images sur un serveur distant, car cela pourrait révéler que l'utilisateur a ouvert le message. Ou au moins le client de messagerie demandera à l'utilisateur s'il (elle) visionnera les images à distance. –

-4

Je pense que la seule façon de le faire est de référencer une image par url comme ceci:

<img src="http://www.youwebsite.com/yourimage.jpg" alt="This is a description" /> 
2
Content-Type: multipart/related; 
    type="text/html"; 
    boundary="Boundary1" 


--Boundary1 
Content-Type: multipart/alternative; 
boundary="Boundary2" 

--Boundary2 
Content-Type: text/html; charset = "utf-8" 
Content-Transfer-Encoding: 8bit 

<img src="cid:content_id_from_attachment"> 

--Boundary2-- 

--Boundary1 
Content-Type: image/jpeg; name="somefilename.jpg" 
Content-Transfer-Encoding: base64 
Content-ID: <content_id_from_attachment> 
Content-Disposition: inline; filename="somefilename.jpg" 

//binary data 

--Boundary1-- 

Limite, jeu de caractères, Content-Transfer-Encoding bien sûr tous choosable. Le paquet PHPMailer peut le faire automatiquement pour vous: http://www.ustrem.org/en/article-send-mail-using-phpmailer-en/

Voir aussi y compris les images à: http://mailformat.dan.info/body/html.html