Peut-on envoyer du contenu HTML via un lien mailto ?

Réponses rédigées par Antoine
Dernière mise à jour : 2022-09-29 14:19:36
Thèmes : javascript - html - mailto
Question

Bonjour,

Je suis persuadé que vous allez trouver la solution. J'ai effectué pleins de tests mais je n'ai pas trouvé la solution. Je dois faire en sorte que lorsque que l'user clique sur le bouton "envoyer un mail" cela ouvre Outlook et remplisse le mail. J'ai touvé pour cela, mais le mail apparait avec les balises HTML au lieu de faire un tableau.

<table id="myTable">
    <tr>
        <td>Nom et/ou matricule Utilisateur : </td> <td><?PHP print_r($_POST['username']);?></td>
    </tr>
    <tr>
<td>Type d’intervention (INCIDENT ou DEMANDE) :</td> <td><?PHP print_r($_SESSION['Type']);?></td>
    </tr>
    <tr>
<td>Groupe d’assignation (assignement group) :</td><td> <?PHP print_r($_POST['grpassign']);?></td>
    </tr>
    <tr>
<td>Affecté au technicien (Assigned to) : </td><td><?PHP print_r($_POST['techname']);?></td>
    </tr>
    <tr>
<td>Arbre de Cloture (Work Notes) :</td><td> <?PHP print_r($_SESSION['ValueGenerale']);?></td>
    </tr>l
    <tr>
<td>Explications de l’intervention (close notes) : </td><td><?PHP print_r($_SESSION['CommentTexte']);?></td>
    </tr>
</table>
<script>
function sendMail() { 
    var link = "mailto:safranbugtrackeradc@fr.scc.com" 
    // + "?cc=myCCaddress@example.com" 
    // Il faut que après le mailto cela commence par un ? 
    + "?subject=" + encodeURIComponent("Demande création de Ticket.") 
    + "&body=" + encodeURIComponent(document.getElementById('myTable').outerHTML) ; 
    window.location.href = link; 
}
</script>

Voici comment le mail s'affiche.

<table id="myTable"> 
    <tbody><tr> 
        <td>Nom et/ou matricule Utilisateur : </td> <td>cgxv</td> 
    </tr> 
    <tr> 
<td>Type d’intervention (INCIDENT ou DEMANDE) :</td> <td>[DEMANDE]</td> 
    </tr> 
    <tr> 
<td>Groupe d’assignation (assignement group) :</td><td> zerezr</td> 
    </tr> 
    <tr> 
<td>Affecté au technicien (Assigned to) : </td><td> vcxvxcv</td> 
    </tr> 
    <tr> 
<td>Arbre de Cloture (Work Notes) :</td><td> [ADC_START][SDP][GUICHET][DEMANDE][USER_CMDB_DIF_NON][RDV_NON][RDV_BAL][RSDP_NON][REGUL_OUI][COMMENT/SANS COMMENTAIRE][REP__PRT <asset_xxx <="" tpx_1="">][Version_2.02][KEY_280920221515107085ea84][ADC_END]</asset_xxx></td>
    </tr><tr> 
<td>Explications de l’intervention (close notes) : </td><td>SANS COMMENTAIRE</td> 
    </tr> 
</tbody></table> 

j'ai essayé avec chrome et Edge et c'est idem. Merci de tout cœur pour votre attention.

Réponse

Bonjour, c'est malheureusement impossible ; vous ne pouvez pas envoyer un contenu HTML via les arguments subject et body d'un lien mailto.

Les seules solutions de mises en page sont celles disponibles avec JavaScript et la fonction encodeURIComponent, ou son équivalent PHP urlencode ; vous ne pourrez alors que gérer les espaces, les retours chariot et les tabulations.

<pre id="myTable">
Nom et/ou matricule Utilisateur : data php
Type d’intervention (INCIDENT ou DEMANDE) : data php
Groupe d’assignation (assignement group) : data php
Affecté au technicien (Assigned to) : data php
Arbre de Cloture (Work Notes) : data php
Explications de l’intervention (close notes) : data php
</pre>
<script>
function sendMail() { 
    var link = "mailto:safranbugtrackeradc@fr.scc.com" 
    // + "?cc=myCCaddress@example.com" 
    // Il faut que après le mailto cela commence par un ? OUI
    + "?subject=" + encodeURIComponent("Demande création de Ticket.") 
    + "&body=" + encodeURIComponent(document.getElementById('myTable').innerHTML); 
    window.location.href = link; 
}
sendMail()
</script>

Autres alternatives :

  • Utiliser un serveur de mail avec la librairie PHPmailer.
  • Générer un fichier eml ou msg que l'utilisateur pourra ouvrir pour ensuite l'envoyer.

Je n'ai jamais utilisé cette dernière solution. Mais si vous ouvrez Outlook et commencez à rédiger un mail, vous remarquerez que vous pouvez l'enregistrer au format msg. Il est donc surement possible de générer un tel fichier via une librairie PHP, à creuser via Google.