PhpMyNewsLetter 2.0

Support et annonces PhpMyNewsLetter.

Vous n'êtes pas identifié(e).

Annonce

Pour me permettre de mieux vous aider au mieux, merci d'être le plus précis possible en donnant :
- la version de phpmynewsletter utilisée
- votre hébergement : personnel, dédié, mutualisé
- votre hébergeur (OVH, free, Infomaniak, 1and1,...)
- votre OS : linux, windows
- version de PHP (5.3, 5.6, 7.0, hhvm...)
Toutes les réponses à mes questions qui sont sans retour de votre part seront considérées comme résolues !

#1 08-11-2016 14:00:02

Skygui
Membre

DKIM FAIL si HTML dans envois

Salut,

Je reviens vers vous car je galère depuis 72h sur un bug qui commence à m'exaspérer.
Je m'explique, dans le sens ou un email qui n'est pas signé avec DKIM à 99% de chance d’atterrir dans les spams chez Gmail et Outlook, il est donc primordial pour toutes société qui se respect, d'envoyer des email avec un score 10/10 chez Mail-Tester.com.

J'ai donc installé OpenDKIM sur mon Centos... configurer mes entrées DNS SPF... DMARC... et mes clées 2048 pour DKIM.

  1. Après avoir attendu la propagation DNS, Je teste l'envoi d'un e-mail à partir de mon PC, avec Thunderbird et une IP autorisée par OpenDKIM, en passant par mon serveur SMTP Postfix précédemment configuré pour signer mes emails. Je vérifie mon score... ok je passe, je vérifie chez Gmail et Outlook: nickel.

  2. Deuxième test: j'envoi un email banal avec que du texte dans le corps, via PHPMyNewsletter, ok, tout passe...

  3. Troisième test: j'envoi un email 100% HTML (valide W3C HTML5), et là: le drame.... je me retrouve avec une note à 6.9/10, avec en erreur "Signature non valide"

    Cela fait 3 foutu jours que je suis bloqué sur ca, j'ai beau chercher, tester dans tous les sens, j'ai utiliser les outils Mail-Tester.com, Port25.com, AppMailDev... tous le même résultat : envoi en 100% HTML: signature erronnée, envoi avec du texte ca passe...... pourtant, même en saisissant du text-plain, avec PHPMyNewsletter, on a l'entête et le footer du mail qui sont de l'HTML !

La config de notre société:

Centos 6
PHP 5.6.26 (Cli)
Postfix



Une idée pour un gars au fond du trou ............ ?  mad

Dernière modification par Skygui (08-11-2016 14:19:09)

Hors ligne

#2 08-11-2016 14:17:31

johnny
Modérateur

Re : DKIM FAIL si HTML dans envois

Il sera peut être utile d'avoir le lien vers le résultat du test de mail tester afin de voir ce qui est dit exactement.

Quelle version de phpmnl utilises tu ?


Poser une question c'est être idiot 5 minutes, ne pas la poser c'est le rester toute sa vie.

Hors ligne

#3 08-11-2016 14:20:30

Skygui
Membre

Re : DKIM FAIL si HTML dans envois

johnny a écrit :

Il sera peut être utile d'avoir le lien vers le résultat du test de mail tester afin de voir ce qui est dit exactement.

Quelle version de phpmnl utilises tu ?


Le lien est le suivant : https://www.mail-tester.com/web-DX2O2B
J'utilise la version 2.0.4  (sinon je n'aurais pas posté dans cette catégorie de topic smile)

Dernière modification par Skygui (08-11-2016 14:21:30)

Hors ligne

#4 08-11-2016 14:28:52

johnny
Modérateur

Re : DKIM FAIL si HTML dans envois

Il faut savoir que la 2.0.4 est encore en développement, beaucoup de choses sont à corriger dessus. Cependant, ça n'explique pas pourquoi la signature DKIM est considérée valide sur un mail en texte et non valide en HTML. Pour la peine, faudra attendre le passage d'Arnaud, ça devient trop compliqué pour moi ^^'

Je pose la question de la version, parce que tout le monde ne poste pas toujours dans la bonne section. Je préfère lever le doute ^^'


Poser une question c'est être idiot 5 minutes, ne pas la poser c'est le rester toute sa vie.

Hors ligne

#5 08-11-2016 14:34:52

Skygui
Membre

Re : DKIM FAIL si HTML dans envois

Je sais bien que la 2.0.4 n'est qu'une Beta. Justement je post pour contribuer au debug, même si ma demande est très intéressée   cool

Hors ligne

#6 08-11-2016 15:07:37

Arnaud
Administrateur

Re : DKIM FAIL si HTML dans envois

Bonjour Skygui,

Je vais mettre en ligne cet après midi sur Github la nouvelle version de compose.php et send.php.
Je t'invite à faire une petite pause et je vais te rassurer :
- Ton serveur est trèèèèèès propre, c'est très bien ! (On est voisin d'ailleurs  cool  cool )
- Tes clés sont correctement installées, pas de soucis ! encore un emoticon tiens :  cool
- compose a un bug : en mettant une balise <body>, celle ci n'est pas détectée, et donc dans ton mail (regarde la source), tu as 2 ouvertures fermetures de body et head.... D'où le plantage !


<html><head></head><body><div align=3D'center' style=3D'font-size:10pt;fo=
nt-family:arial,helvetica,sans-serif;padding-bottom:5px;color:#878e83;'>S=
i cet e-mail ne s'affiche pas correctement, veuillez <a href=3D'http://xxxxxxx/online.php?i=3D'=
43&list_id=3D1&email_addr=3Dweb-dx2o2b@m=
ail-tester.com&h=3Df08b4807b3115fd444ec53a4296d81cb'> cliquer ici</a><br =
/>Ajoutez news@kolagui.com &agrave; votre carnet d'adresses pour &ecirc;t=
re s&ucirc;r de recevoir toutes nos newsletters !<br /><hr noshade=3D'' c=
olor=3D'#D4D4D4' width=3D'90%' size=3D'1'></div><!DOCTYPE html> <html> <h=
ead> </head> <body>
bonjour,<br /><br />comment vas tu ?<br /><br />n'h=C3=
=A9site pas a m'appeler salut. </body> </html><br /><br /><div align=3D'c=
enter' style=3D'padding-top:10px;font-size:10pt;font-family:arial,helveti=
ca,sans-serif;padding-bottom:10px;color:#878e83;'>
                               <hr noshade=3D'' color=3D'#D4D4D4' width=3D=
'90%' size=3D'1'>Je ne souhaite plus recevoir la newsletter : <a href=3D'=
http://xxxxxx/subscription.php?i=3D43&list_id=3D1&op=3Dleave=
&email_addr=3Dweb-dx2o2b@mail-tester.com&h=3Df08b4807b3115fd444ec53a4296d=
81cb' style=3D'' target=3D'_blank'> d=C3=A9sinscription</a><br /></div></=
body></html><img style=3D'border:0' src=3D'http://xxxxxxx/trc=
.php?i=3D43&h=3Df08b4807b3115fd444ec53a4296d81cb' width=3D'1'  height=3D'=
1 alt=3D'1' />


Je prends le temps de créer un outil pour tous, de niveau professionnel, mais simple !
Il n'est pas encore parfait, soyez indulgents, ça vient...
Si vous avez des questions, n'hésitez pas ! Mais soyez précis pour une réponse plus rapide  wink

Hors ligne

#7 08-11-2016 15:30:22

johnny
Modérateur

Re : DKIM FAIL si HTML dans envois

Je devrai avoir le même soucis non ?


Poser une question c'est être idiot 5 minutes, ne pas la poser c'est le rester toute sa vie.

Hors ligne

#8 08-11-2016 15:33:04

Arnaud
Administrateur

Re : DKIM FAIL si HTML dans envois

oui, sauf si tu n'as pas 2 fois de head et body.
Vérifie un code source avec l'icône "<>"


Je prends le temps de créer un outil pour tous, de niveau professionnel, mais simple !
Il n'est pas encore parfait, soyez indulgents, ça vient...
Si vous avez des questions, n'hésitez pas ! Mais soyez précis pour une réponse plus rapide  wink

Hors ligne

#9 08-11-2016 15:46:03

johnny
Modérateur

Re : DKIM FAIL si HTML dans envois

J'ai copié/collé mon code du template qui démarre comme ça :

<html><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
  body {font-family:Verdana;font-size:11pt;
   padding-top: 0 !important;
   padding-bottom: 0 !important;
   padding-top: 0 !important;
   padding-bottom: 0 !important;
   margin:0 !important;
   width: 100% !important;
   -webkit-text-size-adjust: 100% !important;
   -ms-text-size-adjust: 100% !important;
   -webkit-font-smoothing: antialiased !important;
 }
 .tableContent img {
   border: 0 !important;
   outline: none !important;
 }
 a{
  color:#382F2E;
 }
tr td{border:0;padding:0;margin:0}

 p, h1{
  color:#382F2E;
 }
</style></head>
<body>

et pourtant pas de body en double dans l'archive d'un envoi. Un test fait à l'instant confirme la chose, 10/10 chez mail tester.


Poser une question c'est être idiot 5 minutes, ne pas la poser c'est le rester toute sa vie.

Hors ligne

#10 08-11-2016 18:35:03

Skygui
Membre

Re : DKIM FAIL si HTML dans envois

En réalité, c'est Tinymce qui rajoute tout seul le doctype et les balises html et body... j'ai modifié en BO une archive, en l'ouvrant et en allant dans éditer la source, il me les remets d'office  mad

J'ai donc triché en modifiant en BO l'entrée dans la table autosave, j'envoi le mailing... et bien c'est pareil. Ma signature est toujours HS. Donc le problème ne vient pas de là. glasses

Le problème se situe très probablement dans la déclaration de l'entête du mail... je fais des test en HTML / TEXTE pour voir la différence...

Dernière modification par Skygui (08-11-2016 18:41:55)

Hors ligne

#11 08-11-2016 18:59:50

Skygui
Membre

Re : DKIM FAIL si HTML dans envois

Bon, solution trouvé... si je coche encoder base64, ben j'ai 10/10 au test. Allez comprendre........

Bon par contre, Hotmail => mail en spams. Pourtant, dans la source du message chez eux je suis en "PASS" sur les 3 critères... Et chez Gmail, mes mails arrivent carrément plus, du moins ceux qui sont envoyé via PHPMyNewsletter  monkey   une cordeeeeeee SVP

Dernière modification par Skygui (08-11-2016 19:31:22)

Hors ligne

#12 09-11-2016 09:56:22

johnny
Modérateur

Re : DKIM FAIL si HTML dans envois

Très étrange tout ça. Chez moi quand je copie/colle mon code html y compris doctype, balises html, head etc... rien ne s'ajoute en plus de ce que j'ai moi même inséré.


Poser une question c'est être idiot 5 minutes, ne pas la poser c'est le rester toute sa vie.

Hors ligne

#13 09-11-2016 11:25:58

Skygui
Membre

Re : DKIM FAIL si HTML dans envois

En faite, j'anime à moi tout seul le forum ! LOL !
Bon, après avoir décortiquer les sources, j'observe plusieurs chose, notamment que dans send.php, la condition "si tracking = oui", et bien l'image 0 pixels de track se retrouve APRES les fermetures de balises </body></html>    ===> Première erreur, que j'ai corrigé.

En suite, j'ai créer un script pour echo la variable de session $message, et là ben je m'appercoie en réalité que c'est JS qui rajoute tout seul <!DOCTYPE html> <html> <head> </head> <body>  juste avant le corp de message ($message) et il rajoute même </body> </html>. Du coup, code HTML foireux complet... donc ces problèmes ne viennent pas de moi, ni du fait que j'ai un sous-domaine, mais simplement d'une erreur dans compose.php au niveau JS.


Voilà ce que génère le JS de compose.php :

<html><head></head><body><div align='center' style='font-size:10pt;font-family:arial,helvetica,sans-serif;padding-bottom:5px;color:#878e83;'>Si cet e-mail ne s'affiche pas correctement, veuillez <a href='http://mailing.xxx.com/online.php?i=&list_id=1&email_addr=news@xxx.com&h=fake_hash'> cliquer ici</a><br />Ajoutez news@xxx.com &agrave; votre carnet d'adresses pour &ecirc;tre s&ucirc;r de recevoir toutes nos newsletters !<br /><hr noshade='' color='#D4D4D4' width='90%' size='1'></div><!DOCTYPE html> <html> <head> </head> <body> LE CONTENU DE MON MESSAGE </body> </html><br /><br /><div align='center' style='padding-top:10px;font-size:10pt;font-family:arial,helvetica,sans-serif;padding-bottom:10px;color:#878e83;'>
                        <hr noshade='' color='#D4D4D4' width='90%' size='1'>Je ne souhaite plus recevoir la newsletter : <a href='http://mailing.xxx.com/subscription.php?i=&list_id=1&op=leave&email_addr=news@xxx.com&h=fake_hash' style='' target='_blank'> désinscription</a><br /></div></body></html><img style='border:0' src='http://mailing.xxx.com/trc.php?i=&h=fake_hash' alt='' width='1'  height='1' />

Je buche dessus  big_smile


Edite:

J'ai simplement ajouter une petite str_replace pour faire le ménage et c'est réglé.

Dernière modification par Skygui (09-11-2016 12:07:29)

Hors ligne

#14 09-11-2016 12:06:49

Skygui
Membre

Re : DKIM FAIL si HTML dans envois

big_smile  big_smile  big_smile  Problème réglé, mes emails arrivent ben chez Gmail, Outlook, en HTML, et pas en spams........ Par contre, j'ai une information importante à vous passer: le code de tracking qui permet d'afficher une "image" 1x1px, et bien Gmail doit savoir la reconnaitre, car si présente = email supprimé tout bonnement, il n'arrive même pas dans les spams. Information capitale donc, qui pourrait être indiqué en PMN...

A+............

Hors ligne

#15 09-11-2016 12:09:56

johnny
Modérateur

Re : DKIM FAIL si HTML dans envois

Mes mails avec tracking arrivent chez gmail, comme chez les autres d'ailleurs. As tu vérifié dans l'onglet promotion de gmail ? Il est peut être reconnu comme mail commercial et classé là de ce fait.


Poser une question c'est être idiot 5 minutes, ne pas la poser c'est le rester toute sa vie.

Hors ligne

#16 09-11-2016 12:59:24

Arnaud
Administrateur

Re : DKIM FAIL si HTML dans envois

Bonjour,

Je te rassure Skygui, tu n'es pas tout seul !
Mauvaise nouvelle : mon Git m'ennuie avec un conflit sur le fichier install et ma station pro a planté.
Donc réinstallation complète, mais sauvegarde de la machine complète en cours.... Suis très énervé !!!  devil

Toutes tes remarques sont intéressantes, et pour une bonne information, je redonne les send.php et compose.php qui ont changé depuis ce qui est en ligne sur Github :
compose.php (avec les changements en JS ) :

<?php
$subject = ( !empty($_POST['subject']) ) ? $_POST['subject'] : '';
$message = ( !empty($_POST['message']) ) ? $_POST['message'] : '';
$format  = ( !empty($_POST['format']) )  ? $_POST['format']  : '';
$encode  = ( !empty($_POST['encode']) ) ? 'base64'  : '8bit';
switch($op){
    case 'init':
        $newsletter=getConfig($cnx,$list_id,$row_config_globale['table_listsconfig']);
        $newsletter_autosave=getConfig($cnx,$list_id,$row_config_globale['table_sauvegarde']);
        if (!empty($_POST['import_id'])) {
            $import_id  =  $_POST['import_id'];
        }
        $reset  = (!empty($_GET['reset'])&&$_GET['reset']=='true') ? 'true' : 'false';
        $ft  = (!empty($_GET['ft'])) ? $_GET['ft'] : '';
        if(getSubscribersNumbers($cnx,$row_config_globale['table_email'],$list_id)){
            if (isset($import_id) && is_numeric($import_id)) {
                $row = $cnx->query("SELECT date, type, subject, message, list_id FROM "
                    . $row_config_globale['table_archives']." WHERE id='$import_id'")->fetch(PDO::FETCH_ASSOC);
                $textarea = addslashes(@htmlspecialchars($row['message']));
                $subject  = addslashes(@htmlspecialchars($row['subject']));
                $type     = $row['type'];
                $cnx->query("INSERT INTO "
                    . $row_config_globale['table_sauvegarde']."(list_id,subject,textarea,type) VALUES ('$list_id','$subject','$textarea','$type')");
            } elseif(isset($newsletter_autosave['textarea'])&&trim($newsletter_autosave['textarea'])!=''&&$reset=='false') {
                $textarea = $newsletter_autosave['textarea'];
                $type    = 'html';
                $subject = @htmlspecialchars($newsletter_autosave['subject']);
            } else {
                $textarea = addslashes($newsletter['header']."\n\n\n".$newsletter['footer']);
                $subject = @addslashes(htmlspecialchars($newsletter['subject']));
                $type    = 'html';
                $cnx->query("INSERT INTO "
                    . $row_config_globale['table_sauvegarde']."(list_id,subject,textarea,type) VALUES ('$list_id','$subject','$textarea','$type')");
            }
            echo "<form id='mailform' name='mailform' method='post' action='' class='post_message'>";
            echo "<div align='center'><h4 class='alert_info'>".tr("COMPOSE_AND_PREVIEW").".</h4></div>";
            echo '<article class="module width_3_quarter">';
            echo '<header><h3 class="tabs_involved">'.tr("COMPOSE_NEW").'</h3></header>';
            echo tr("COMPOSE_SUBJECT")." : ".tr("RFC_2822")."<br><br>
                <input type='text' name='subject' value=\"".  stripslashes($subject)  
                . "\" size='50' maxlength='255' id='subject' />&nbsp;<span id='chars'>78</span>
                <br><br>".tr("COMPOSE_MSG_BODY")." :";
            /*
            if($ft=="") {
                echo " (<a href='".$_SERVER['PHP_SELF']
                    . "?page=compose&token=$token&list_id=$list_id&ft=else'>".tr("CLICK_TO_COMPOSE_HTML")."</a>)<br><br>";
            } elseif($ft=='else') {
                echo " (<a href='".$_SERVER['PHP_SELF']
                    . "?page=compose&token=$token&list_id=$list_id'>".tr("CLICK_TO_COMPOSE_WITH_EDITOR")."</a>)<br><br>";
            }
            */
            echo "<textarea name='message' id='redac' rows='20' cols='70'>".   stripslashes($textarea)  ."</textarea>";
            echo "<div id='as'><h4 class='alert_info'>".tr("START_INITIALISATION")."...</h4></div><br>&nbsp;</article>";
            echo '<article class="module width_quarter"><div class="sticky-scroll-box">';
            echo '<header><h3>'.tr("ACTIONS").' :</h3></header><div align="center">';
            echo "<input type='button' value='".tr("SAVE_THIS_MESSAGE")."' id='rec' type='button' class='button' />"
                ."<br><br><input type='button' value='".tr("COMPOSE_RESET")."' onClick=\"parent.location='".$_SERVER['PHP_SELF'] 
                ."?page=compose&token=$token&list_id=$list_id&reset=true'\" />"
                ."<br><br><input type='button' value='".tr("COMPOSE_PREVIEW")." &gt;&gt;' onclick='Soumettre()' disabled id='send_preview' />";
            echo "<br><br><input type='checkbox' name='encode' value='base64'><b>".tr("COMPOSE_ENCODE")." ?</b>";
            echo "</div>";
            echo '<header></header>';
            echo '<header><h3>'.tr("ATTACHMENTS").'</h3></header>';
            echo "<div id='pjs'></div>";
            echo "<div align='center'><a href='upload.php?token=$token&list_id=$list_id' class='iframe'>".tr("ADD_ONE_OR_MORE_ATTACHMENT")."</a></div>";
            echo "</div></article>";
            echo "<script>$(function(){function pjs(){ $.ajax({type:\"POST\", url:\"include/pjq.php\", 
                data:\"token=$token&list_id=$list_id\",success:function(data){ $('#pjs').html(data);}});setTimeout(pjs,10000);}pjs();});</script>";
            echo "<input type='hidden' id='type' name='format' value='html' />
            <input type='hidden' name='op' value='preview' />
            <input type='hidden' name='action' value='compose' />
            <input type='hidden' name='page' value='compose' />
            <input type='hidden' id='list_id' name='list_id' value='$list_id' />
            <input type='hidden' id='token' name='token' value='$token' />
            </form>";
            if($ft==""){
                echo "<script src='/".$row_config_globale['path']."js/tinymce/tinymce.min.js'></script>
                    <script>
                    tinymce.init({
                        selector : 'textarea#redac',
                        plugins : [
                            'fullscreen fullpage visualblocks, preview searchreplace print insertdatetime hr',
                            'charmap  anchor code link image paste pagebreak table contextmenu',
                            'filemanager table code media autoresize textcolor emoticons'
                        ],
                        /*toolbar1 : 'insertfile undo redo | bold italic | forecolor colorpicker backcolor | alignleft aligncenter alignright alignjustify | bullist numlist outdent indent',
                        toolbar2 : 'styleselect | fontselect fontsizeselect | emoticons | link image | filemanager | template',*/
                        toolbar1 : 'newdocument,print,|,bold,italic,underline,|,strikethrough,superscript,subscript,|,forecolor,backcolor,|,bullist,numlist,outdent,indent,|,visualchars,visualblocks,|,charmap,|,hr,',
                        toolbar2 : 'table,|,cut,copy,paste,searchreplace,|,blockquote,|,undo,redo,|,link,unlink,anchor,|,image,emoticons,media,|,inserttime,|,preview,fullscreen,code,',
                        toolbar3 : 'styleselect,|,formatselect,|,fontselect,|,fontsizeselect,',
                        style_formats: [
                            {title: 'Open Sans', inline: 'span', styles: { 'font-family':'Open Sans'}},
                            {title: 'Arial', inline: 'span', styles: { 'font-family':'arial'}},
                            {title: 'Book Antiqua', inline: 'span', styles: { 'font-family':'book antiqua'}},
                            {title: 'Comic Sans MS', inline: 'span', styles: { 'font-family':'comic sans ms,sans-serif'}},
                            {title: 'Courier New', inline: 'span', styles: { 'font-family':'courier new,courier'}},
                            {title: 'Georgia', inline: 'span', styles: { 'font-family':'georgia,palatino'}},
                            {title: 'Helvetica', inline: 'span', styles: { 'font-family':'helvetica'}},
                            {title: 'Impact', inline: 'span', styles: { 'font-family':'impact,chicago'}},
                            {title: 'Symbol', inline: 'span', styles: { 'font-family':'symbol'}},
                            {title: 'Tahoma', inline: 'span', styles: { 'font-family':'tahoma'}},
                            {title: 'Terminal', inline: 'span', styles: { 'font-family':'terminal,monaco'}},
                            {title: 'Times New Roman', inline: 'span', styles: { 'font-family':'times new roman,times'}},
                            {title: 'Verdana', inline: 'span', styles: { 'font-family':'Verdana'}}
                        ],
                        templates : [
                            {title: 'Basic',url: '/".$row_config_globale['path']."js/tinymce/templates/basic.html',description: 'MODULE EN TEST !'},
                            {title: 'Hero',url: '/".$row_config_globale['path']."js/tinymce/templates/hero.html',description: 'MODULE EN TEST !'},
                            {title: 'Newsletter',url: '/".$row_config_globale['path']."js/tinymce/templates/newsletter.html',description: 'MODULE EN TEST !'}
                        ],
                        cleanup : true,
                        cleanup_on_startup : true,
                        convert_urls : true,
                        custom_undo_redo_levels : 20,
                        doctype : '<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">',
                        entity_encoding : 'named',
                        external_filemanager_path:'/".$row_config_globale['path']."js/tinymce/plugins/filemanager/',
                        external_plugins: { 'filemanager' : '/".$row_config_globale['path']."js/tinymce/plugins/filemanager/plugin.min.js'},
                        extended_valid_elements: 'pre[*],style[*]',
                        filemanager_title:'Responsive Filemanager' ,
                        fontsize_formats : '8px 9px 10px 11px 12px 13px 14px 18px 24px',
                        forced_root_block : false,
                        force_br_newlines : true,
                        force_p_newlines : false,
                        height : '350',
                        image_advtab: true ,
                        inline_styles : true,
                        language : '".tr("TINYMCE_LANGUAGE")."',
                        relative_urls: false,
                        remove_script_host : false,
                        theme: 'modern',
                        valid_children : '+body[style|section],pre[section|div|p|br|span|img|style|h1|h2|h3|h4|h5],+*[*]',
                        valid_elements : '+*[*]',
                        verify_html : false,
                        menu: {
                            edit: {title: 'Edit', items: 'undo redo | cut copy paste | selectall'},
                            insert: {title: 'Insert', items: 'media image link | pagebreak'},
                            view: {title: 'View', items: 'visualaid'},
                            format: {title: 'Format', items: 'bold italic underline strikethrough superscript subscript | formats | removeformat'},
                            table: {title: 'Table', items: 'inserttable tableprops deletetable | cell row column'},
                            tools: {title: 'Tools', items: 'code'}
                        }
                        /* http://stackoverflow.com/questions/10290121/how-to-prevent-tinymce-from-stripping-the-style-attribute-from-input-element */
                        /* valid_elements : '@[id|class|style|title|dir<ltr?rtl|lang|xml::lang],'
                                + '+body[style],'
                                + 'a[rel|rev|charset|hreflang|tabindex|accesskey|type|name|href|target|title|class],strong/b,em/i,strike,u,'
                                + '#p[style],-ol[type|compact],-ul[type|compact],-li,br,img[longdesc|usemap|src|border|alt=|title|hspace|vspace|width|height|align],-sub,-sup,'
                                + '-blockquote,-table[border=0|cellspacing|cellpadding|width|frame|rules|'
                                + 'height|align|summary|bgcolor|background|bordercolor],-tr[rowspan|width|height|align|valign|bgcolor|background|bordercolor],tbody,thead,tfoot,'
                                + '#td[colspan|rowspan|width|height|align|valign|bgcolor|background|bordercolor|scope],#th[colspan|rowspan|width|height|align|valign|scope],caption,-div,'
                                + '-span,-code,-pre,address,-h1,-h2,-h3,-h4,-h5,-h6,hr[size|noshade],-font[face|size|color],dd,dl,dt,cite,abbr,acronym,del[datetime|cite],ins[datetime|cite],'
                                + 'object[classid|width|height|codebase|*],param[name|value|_value],embed[type|width|height|src|*],map[name],area[shape|coords|href|alt|target],bdo,'
                                + 'button,col[align|char|charoff|span|valign|width],colgroup[align|char|charoff|span|valign|width],dfn,fieldset,form[action|accept|accept-charset|enctype|method],'
                                + 'input[accept|alt|checked|disabled|maxlength|name|readonly|size|src|type|value],'
                                + 'kbd,label[for],legend,noscript,optgroup[label|disabled],option[disabled|label|selected|value],'
                                + 'q[cite],samp,select[disabled|multiple|name|size],small,'
                                + 'textarea[cols|rows|disabled|name|readonly],tt,var,big',*/
                    });
                    var elem=$('#chars');
                    $('#subject').limiter(78,elem);
                    $(document).ready(function() { Si=setInterval(save,10000); });
                    function save(){
                        tinyMCE.triggerSave();
                        var ds=$('#mailform').serialize();
                        $.ajax({
                            type: 'POST',
                            url: 'autosave.php',
                            data: ds,
                            cache: false,
                            success: function(msg) {
                                $('#as').html(msg).show();
                                $('#send_preview').removeAttr('disabled');
                            },
                            error: function() {
                                $('#as').html('<h4 class=alert_error>".tr("UNSAVED_MESSAGE")." !</h4>').show();
                            }
                        });
                    }
                    $('#rec').click(function(){ save(); });
                    </script>";
            } elseif($ft=='else') {
                echo "<script>var elem=$('#chars');$('#subject').limiter(78,elem);
                        $(document).ready(function() { Si=setInterval(save,10000); });
                        function save(){";
                            echo ($ft=='else'?"":"tinyMCE.triggerSave();");
                            echo "
                            $('#as').html('".tr("SAVE_PROCESS")."...').show();
                            var ds=$('#mailform').serialize();
                            $.ajax({
                                type: 'POST',
                                url: 'autosave.php',
                                data: ds,
                                cache: false,
                                success: function(msg) {
                                    $('#as').html(msg).show();
                                },
                                error: function() {
                                    $('#as').html('<h4 class=alert_error>".tr("UNSAVED_MESSAGE")." !</h4>').show();
                                }
                            });
                        }
                        $('#rec').click(function(){ save(); });
                    </script>";
            }
            echo "<script>
            function Soumettre(){
                if ( (document.mailform.subject.value=='') || (document.mailform.message.value=='') )
                    alert('".tr("ERROR_ALL_FIELDS_REQUIRED")."');
                else {
                    document.mailform.submit();
                }
            }
            </script>";
        } else {
            echo "<h4 class='alert_error'>".tr("ERROR_UNABLE_TO_SEND")."</h4>";
        }
    break;
    case "preview":
        $up = @($_GET['up']=='false' ? false : true);
        if($up){
            $cnx->query("UPDATE ".$row_config_globale['table_sauvegarde']." 
                    SET textarea = '".addslashes($message)."',
                        subject='".addslashes($subject)."',
                        type='$format' 
                WHERE list_id='$list_id'");
        }
        $newsletter     = getConfig($cnx,$list_id,$row_config_globale['table_listsconfig']);
        $msg            = getConfig($cnx,$list_id,$row_config_globale['table_sauvegarde']);
        $format         = $msg['type'];
        if(empty($message)){
            $message    = stripslashes($msg['textarea']);
        }
        if(empty($subject)){
            $subject    = stripslashes($msg['subject']);
        }
        $subj           = htmlspecialchars($subject);
        if($format == "html"){
            $msg        = $message;
        } else {
            $msg        = htmlspecialchars($message);
        }
        echo "<form method='get' action='send_preview.php' id='mailform' name='mailform'>";
        echo "<div align='center'><h4 class='alert_info'>".tr("STEP_SEND_PREVIEW", $newsletter['preview_addr']).".</h4></div>";
        echo "<article class='module width_full'><div style='margin:3px;'>";
        echo "Preview for : <a href='' onClick='xx(320);return false;'>iPhone 4/5 (320x480),</a> "
                         . "<a href='' onClick='xx(360);return false;'>Nexus 5 (360x598),</a> "
                         . "<a href='' onClick='xx(375);return false;'>iPhone 6 (375x667),</a> " 
                         . "<a href='' onClick='xx(384);return false;'>Nexus 4 (384x598),</a> " 
                         . "<a href='' onClick='xx(414);return false;'>iPhone 6 Plus (414x736),</a> "
                         . "<a href='' onClick='xx(600);return false;'>Nexus 7 2013 (600x960),</a> "
                         . "<a href='' onClick='xx(750);return false;'>iPhone 6S (750x1334),</a> "
                         . "<a href='' onClick='xx(768);return false;'>iPad 3 (768x1024),</a> "
                         . "<a href='' onClick='xx(800);return false;'>Nexus 10 (800x1280)</a> ";
        echo "</div></article>";
        echo '<article class="module width_3_quarter">';
        echo '<header><h3 class="tabs_involved">'.tr("COMPOSE_PREVIEW_TITLE").' : ' . $subj . '</h3></header>';
        echo "<iframe src='preview.php?list_id=$list_id&token=$token' width='100%' height='650px' style='border:0;' id='_preview'><p>".tr("ERROR_IFRAME")."...</p></iframe></div>";
        echo "<input type='hidden' name='list_id' value='$list_id'>
              <input type='hidden' name='encode' value='$encode'>
              <input type='hidden' name='op' value='send_preview'>
              <input type='hidden' id='token' name='token' value='$token'>";
        echo "</article>";
        echo '<article class="module width_quarter"><div class="sticky-scroll-box">';
        echo '<header><h3>Actions :</h3></header><div align="center">';
        echo "<input type='button' onClick=\"window.location.href='".$_SERVER['PHP_SELF']."?page=compose&token=$token&list_id=$list_id&op=init'\" 
            value=\"".tr("COMPOSE_BACK")."\" />";
        echo "<br><br><input type='submit' value='".tr("COMPOSE_SEND")."  (Mode PREVIEW)' />";
        echo "</div>";
        echo '<header></header>';
        echo '<header><h3>'.tr("ATTACHMENTS").'</h3></header>';
        echo "<div id='pjs'></div>";
        echo "<div align='center'><a href='upload.php?token=$token&list_id=$list_id' class='iframe'>".tr("ADD_ONE_OR_MORE_ATTACHMENT")."</a></div>";
        echo '</article>';
        echo "</form>";
        echo "<script>";
        echo "$(function(){function pjs(){ $.ajax({type:\"POST\", url:\"include/pjq.php\", data:\"token=$token&list_id=$list_id\",success:function(data){ $('#pjs').html(data);}});setTimeout(pjs,10000);}pjs();});";
        echo "</script>";
        echo "<script>
            function Soumettre(){
                document.mailform.submit();
            }
            </script>";
    break;
    case "send_preview":
        $newsletter     = getConfig($cnx,$list_id,$row_config_globale['table_listsconfig']);
        $msg            = getConfig($cnx,$list_id,$row_config_globale['table_sauvegarde']);
        $format         = $msg['type'];
        if(empty($message)){
            $message    = stripslashes($msg['textarea']);
        }
        if(empty($subject)){
            $subject    = stripslashes($msg['subject']);
        }
        $subj           = htmlspecialchars($subject);
        if($format == "html"){
            $msg = $message;
        } else {
            $msg = htmlspecialchars($message);
        }
        $error          = ( empty($_GET['error']) ? "" : $_GET['error'] );
        $encode         = ( !empty($_GET['encode']) && $_GET['encode'] == 'base64' ) ? 'base64'  : '8bit';
        echo '<div class="archmsg">';
        if($error==""){
            echo "<div align='center'><h4 class='alert_success'>".tr("PREVIEW_SEND_OK").".</h4>";
            if(isset($code_mailtester) && $code_mailtester!='') {
                echo "<h4 class='advt alert_success' align='center'><a href='https://www.mail-tester.com/" . $code_mailtester . "' target='_blank'>" 
                    . tr("CHECK_SPAM_SCORE_MAIL_TESTER")."</a></h4>";
            } 
            echo "<h4 class='advt alert_info' align='center'>".tr("PREVIEW_OK")." ?<br>"
                . tr("CLICK_TO_SEND", tr("COMPOSE_SEND")).", ".tr("COMPOSE_ELSE_BACK")."</h4></div>";
        } else {
            echo "<div align='center'><h4 class='alert_error'>Attention ! Le message de preview est en erreur. Motif : "
                . $error ." ! Merci de corriger, puis relancer le message de preview en cliquant ici : <a href='"
                . $_SERVER['PHP_SELF']."?page=compose&op=init&list_id=$list_id&token=$token'>".tr("RE_SEND_PREVIEW")."</a></h4></div>";
        }
        echo '<article class="module width_3_quarter">';
        echo '<header><h3 class="tabs_involved">'.tr("COMPOSE_PREVIEW_TITLE").' :</h3></header>';
        echo "<iframe src='preview.php?list_id=$list_id&token=$token' width='100%' height='400px' style='border:0;'><p>"
            . tr("ERROR_IFRAME")."...</p></iframe>";
        echo "</article>";
        echo '<article class="module width_quarter"><div class="sticky-scroll-box">';
        echo '<header><h3>Actions :</h3></header><div align="center">';
        echo "<br><br><input type='button' value='".tr("COMPOSE_BACK")."' onClick=\"parent.location='"
            . $_SERVER['PHP_SELF']."?page=compose&token=$token&list_id=$list_id&op=preview&up=false&encode=$encode'\" />";
        if($error==""){
            echo "<br><br><input type='button' value='".tr("COMPOSE_SEND")."' class='button' id='SendIt'>";
        } else {
            echo "<h4 class='alert_error'>".tr("STOP_ON_PREVIEW_ERROR")." !</h4>";
        }
        if($type_serveur=='dedicated'&&$exec_available){
        echo "<br><br><form method='post' action=''>
            <input type='submit' value='".tr("SCHEDULE_THIS_SEND")."' />
            <input type='hidden' name='NEWTASK' value='SCHEDULE_NEW_TASK' />
            <input type='hidden' name='list_id' value='$list_id' />
            <input type='hidden' name='encode' value='$encode'>
            <input type='hidden' name='page' value='task' />";
        }
        echo '</div>';
        echo "<script>$(function(){function pjs(){ $.ajax({type:\"POST\", url:\"include/pjq.php\", data:\"token="
            . $token . "&list_id=" . $list_id . "\",success:function(data){ $('#pjs').html(data);}});setTimeout(pjs,10000);}pjs();});
        </script>";
        echo '<header></header>';
        echo '<header><h3>'.tr("ATTACHMENTS").'</h3></header>';
        echo "<div id='pjs'></div>";
        echo "<div align='center'><a href='upload.php?token=$token&list_id=$list_id' class='iframe'>".tr("ADD_ONE_OR_MORE_ATTACHMENT")."</a></div>";
        echo '</article></div>';
        ?>
        <script type="text/javascript">
            $("#SendIt").click(function(){
                $('.advt').hide('slow');
                $('.archmsg').hide('slow');
                $('.button').hide('slow');
                $('html,body').animate({scrollTop:'0px'},500);
                $('#msg').show();
                $('#smail').html("<?php echo tr("PROGRESSION_OF_CURRENT_SEND");?>");
                $(function(){
                    var begin   = 0;
                    var sn      = 0;
                    var step    = '';
                    var pct     = 0;
                    var list_id = <?php echo (($list_id)+0);?>;
                    var token   = '<?php echo $token;?>';
                    var msg_id  = 0;
                    var tts     = 0;
                    var encode  = '<?php echo $encode;?>';
                    function progresspump(){ 
                        $.ajax({
                            url:"send.php",
                            type: "GET",
                            dataType:"json",
                            data:'list_id=' + list_id + '&token=' + token + '&begin=' + begin + '&sn=' + sn + '&step=' + step + '&msg_id=' + msg_id + '&encode=' + encode,
                            success:function(rj){
                                begin = rj.begin;
                                sn    = rj.sn;
                                step  = rj.step;
                                pct   = (rj.pct!=''?rj.pct:0);
                                msg_id= rj.msg_id;
                                tts   = (typeof rj.TTS!='undefined'?rj.TTS:0);
                                $("#pct").css('width',pct+'%');
                                $("#done").html(pct+'%');
                                $("#total_to_send").html(sn);
                                $("#ch_last").html(tts);
                                if(pct > 99.999) {
                                    clearInterval(progresspump);
                                    $("#send_title").text("<?php echo tr("SEND_ENDED");?>...");
                                    $("#all_done").html("<?php echo tr("REDIRECT_NOW");?>...");
                                    $('#smail').html("<?php echo tr("SCHEDULE_END_PROCESS");?>");
                                    setTimeout(function() {
                                        window.location.href='?page=tracking&list_id=<?php echo $list_id;?>&token=<?php echo $token;?>';
                                    },1000);
                                }
                            }
                        });
                        setTimeout(progresspump,5000);
                    }progresspump();
                });
            });
        </script>
        <div id='msg' style='display:none'>
            <article class="module width_full">
            <header><h3 id='send_title'><?php echo tr("PROGRESSION_OF_CURRENT_SEND");?></h3></header>
                <div class="module_content">
                    <article class='stats_graph' style='height:143px;'>
                        <div class='record' style='height:30px;border: 1px solid #9BA0AF;'><div id='pct' class='bar' style='width:0%'></div></div>
                        <h4 id='all_done'></h4>
                    </article>
                    <article class="stats_overview">
                        <div class="overview_today">
                            <p class="overview_day"><?php echo tr("COMPOSE_SENDING");?></p>
                            <p class="overview_count" id='done'>0,00%</p>
                            <p class="overview_type">% <?php echo tr("SENDED");?></p>
                            <p class="overview_count" id='total_to_send'>0</p>
                            <p class="overview_type"><?php echo tr("TOTAL_TO_SEND");?></p>
                        </div>
                        <div class="overview_previous">
                            <p class="overview_day"><?php echo tr("CHRONO");?></p>
                            <p class="overview_count" id='ch_last'>0</p>
                            <p class="overview_type"><?php echo tr("LAST_TIME_SEND");?></p>
                        </div>
                    </article>
                    <div class="clear"></div>
                </div>
            <div id='if' style="height:0;"></div>
            </article>
        </div>
        <?php
    break;
    /*case "done":
        echo "<div align='center' class='info'>".tr("COMPOSE_SENDING")."</div>";
        $error=(empty($_GET['error']) ? "0" : $_GET['error']);
        $errorlog=(empty($_GET['errorlog']) ? "0" : $_GET['errorlog']);
        if($error!=0){
            echo "<h4 class=alert_error>".tr("ERROR_SENDING")."</h4>";
        } else {
            echo "<h4 class=alert_success>".tr("COMPOSE_SENT").".</h4>";
        }
        if($errorlog) {
            echo "<h4 class=alert_error>".tr("ERROR_LOG_CREATE")."</h4>";
        }
        echo "<br><div align='center'><img align='middle' src='css/puce.gif'> <a href='?page=compose&list_id=".$list_id."&token=$token'>".tr("BACK")."</a></div>";
    break;*/
    default :
        echo 'oups !';
    break;
}
?>

et send.php :

<?php
header('Access-Control-Allow-Origin: *');
header('Cache-Control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
header('Content-type: application/json');
if(!file_exists("include/config.php")) {
    header("Location:install.php");
    exit;
} else {
    session_start();
    include("_loader.php");
    if(isset($_POST['token'])){$token=$_POST['token'];}elseif(isset($_GET['token'])){$token=$_GET['token'];}else{$token='';}
    if(!tok_val($token)){
        quick_Exit();
        die();
    }
}
$cnx->query("SET NAMES UTF8");
$row_config_globale = $cnx->SqlRow("SELECT * FROM $table_global_config");
(count($row_config_globale)>0)?$r='SUCCESS':$r='';
if($r != 'SUCCESS') {
    include("include/lang/english.php");
    echo "<div class='error'>" . tr($r). "<br>";
    echo "</div>";
    exit;
}
if(empty($row_config_globale['language']))$row_config_globale['language']="english";
include("include/lang/" . $row_config_globale['language']. ".php");
require('include/lib/PHPMailerAutoload.php');
require('include/lib/Html2Text.php');
$step    = (empty($_GET['step']) ? "" : $_GET['step']);
$subject = (!empty($_SESSION['subject'])) ? $_SESSION['subject'] : '';
$message = (!empty($_SESSION['message'])) ? $_SESSION['message'] : '';
$format  = (!empty($_SESSION['format'])) ? $_SESSION['format'] : '';
$list_id = (!empty($_POST['list_id'])) ? (($_POST['list_id'])+0) : '';
$list_id = (!empty($_GET['list_id']) && empty($list_id)) ? (($_GET['list_id'])+0) : (($list_id)+0);
$begin   = (!empty($_POST['begin'])) ? $_POST['begin'] : '';
$begin   = (!empty($_GET['begin']) && empty($begin)) ? (($_GET['begin'])+0) : 0;
$msg_id  = (!empty($_GET['msg_id'])) ? (($_GET['msg_id'])+0) : '';
$sn      = (!empty($_GET['sn'])) ? (($_GET['sn'])+0) : '';
$error   = (!empty($_GET['error'])) ? $_GET['error'] : '';
$encode  = (!empty($_GET['encode'])&&$_GET['encode']=='base64')  ? 'base64' : 'quoted-printable';
switch ($step) {
    case "send":
        $tts = 0;
        $start = microtime(true);
        $dontlog = 0;
        if (!$handler = @fopen('logs/list' . $list_id . '-msg' . $msg_id . '.txt', 'a+')){
            $dontlog = 1;
        }
        $daylog = @fopen('logs/daylog-' . date("Y-m-d") . '.txt', 'a+');
        $limit            = $row_config_globale['sending_limit'];
        $mail             = new PHPMailer();
        $mail->SMTPOptions = array(
            'ssl' => array(
                'verify_peer' => false,
                'verify_peer_name' => false,
                'allow_self_signed' => true
            )
        );
        $mail->CharSet    = $row_config_globale['charset'];
        $mail->ContentType= "text/html";
        //$mail->Encoding   = $encode;
        $mail->PluginDir  = "include/lib/";
        $newsletter       = getConfig($cnx, $list_id, $row_config_globale['table_listsconfig']);
        $mail->From       = $newsletter['from_addr'];
        $mail->FromName   = ( strtoupper($row_config_globale['charset']) == "UTF-8" ? 
                                $newsletter['from_name'] : 
                                    iconv("UTF-8", $row_config_globale['charset'], $newsletter['from_name']) 
                            );
        $addr             = getAddress($cnx, $row_config_globale['table_email'],$list_id,$begin,$limit,$msg_id);
        if ( $type_env == 'dev' ) {
            $daylogmsg        ="LIST_ID : $list_id\tBEGIN : $begin\tLIMIT : $limit\tMSG_ID : $msg_id\n";
            fwrite($daylog, $daylogmsg, strlen($daylogmsg));
        }
        if ( $row_config_globale['sending_method'] != 'php_mail_infomaniak' ) {
            $mail->Sender    = $newsletter['from_addr'];
            $mail->SetFrom($newsletter['from_addr'],$newsletter['from_name']);
        }
        $msg             = get_message($cnx, $row_config_globale['table_archives'], $msg_id);
        $format          = $msg['type'];
        $list_pj = $cnx->query("SELECT * 
            FROM " . $row_config_globale['table_upload']. " 
                WHERE list_id=$list_id 
                AND msg_id=$msg_id 
            ORDER BY id ASC")->fetchAll(PDO::FETCH_ASSOC);
        if(count($list_pj)>0){
            foreach  ($list_pj as $item) {
                $mail->AddAttachment('upload/'.$item['name']);
            }
        }
        $message    = stripslashes($msg['message']);
        $to_replace = array( "  ", "\t", "\n", "\r", "\0", "\x0B", "\xA0" );
        $message    = str_replace( $to_replace , " " , $message );
        $message    = str_replace( "  "," ",$message );
        $subject    = stripslashes( $msg['subject'] );
        if ( $format == "html" ){
            $mail->IsHTML(true);
        }
        $mail->WordWrap = 76;    
        if ( file_exists("DKIM/DKIM_config.php")&&($row_config_globale['sending_method']=='smtp'||$row_config_globale['sending_method']=='php_mail') ) {
            include("DKIM/DKIM_config.php");
            $mail->DKIM_domain     = $DKIM_domain;
            $mail->DKIM_private    = $DKIM_private;
            $mail->DKIM_selector   = $DKIM_selector;
            $mail->DKIM_passphrase = $DKIM_passphrase;
            $mail->DKIM_identity   = $DKIM_identity;
        }
        $to_send = count($addr);
        require_once("include/lib/class.valideMail.php");
        for ($i = 0; $i < $to_send; $i++) {
            $last_id_send = $addr[$i]['id'];
            $cnx->query("UPDATE " . $row_config_globale['table_send_suivi']. " 
                    SET nb_send=nb_send+1,last_id_send=" . $last_id_send . " 
                        WHERE `msg_id`='" . $msg_id. "' AND `list_id`='" . $list_id. "'");
            
            include("include/lib/switch_smtp.php");
            $time_info = "";
            $begintimesend = microtime(true);
            $unsubLink = "";
            $headtrc   = "";
            $body      = "";
            $mail->ClearAllRecipients();
            $mail->ClearCustomHeaders();
            $mail->AddAddress($addr[$i]['email']);
            $mail->XMailer = ' ';
            if ( $row_config_globale['active_tracking'] == '1' ) {
                $trac = "<img style='border:0' src='" . $row_config_globale['base_url'] . $row_config_globale['path'] . "trc.php?i=" .$msg_id. "&h=" 
                      . $addr[$i]['hash'] . "' width='1'  height='1 alt='" . $list_id. "' />";
            } else {
                $trac = "";
            }
            if ( $format == "html" ){
                $headtrc = "<div align='center' style='font-size:10pt;font-family:arial,helvetica,sans-serif;padding-bottom:5px;color:#878e83;'>";
                $headtrc .= tr("READ_ON_LINE", "<a href='" . $row_config_globale['base_url']
                      .$row_config_globale['path']. "online.php?i=$msg_id&list_id=$list_id&email_addr="
                      .$addr[$i]['email']. "&h=" . $addr[$i]['hash']. "'>"). "<br />";
                $headtrc .= tr("ADD_ADRESS_BOOK", $newsletter['from_addr']). "<br />";
                $headtrc .= "<hr noshade='' color='#D4D4D4' width='90%' size='1'></div>";
                if(strpos($message,'<body>')===false) {
                    $message = "<html><head></head><body>" . $headtrc . $message ;
                } else {
                    $message = str_replace( '<body>' , '<body>' . $headtrc , $message );
                }
                $new_url = 'href="' . $row_config_globale['base_url'] . $row_config_globale['path'] .'r.php?m='.$msg_id.'&h='.$addr[$i]['hash'].'&l='.$list_id.'&r=';
                $message = preg_replace_callback(
                    '/href="(http[s]?:\/\/)([^"]+)"/',
                    function($matches) {
                        global $new_url;
                        return $new_url . (urlencode(@$matches[1] . $matches[2])) . '"';
                    },$message);
                $unsubLink = "<br /><div align='center' style='padding-top:10px;font-size:10pt;font-family:arial,helvetica,sans-serif;padding-bottom:10px;color:#878e83;'>
                           <hr noshade='' color='#D4D4D4' width='90%' size='1'>"
                           . tr("UNSUBSCRIBE_LINK", "<a href='" . $row_config_globale['base_url'] . $row_config_globale['path']
                           . "subscription.php?i=$msg_id&list_id=$list_id&op=leave&email_addr=" . $addr[$i]['email'] 
                           . "&h=" . $addr[$i]['hash']. "' style='' target='_blank'>")
                           . "<br /><a href='http://www.phpmynewsletter.com/' style='' target='_blank'>Phpmynewsletter 2.0</a></div></body></html>";
            } else {
                $body = tr("READ_ON_LINE", "<a href='" . $row_config_globale['base_url'].$row_config_globale['path']
                      . "online.php?i=$msg_id&list_id=$list_id&email_addr=" . $addr[$i]['email']. "&h=" . $addr[$i]['hash']. "'>"). "<br />";
                $body .= tr("ADD_ADRESS_BOOK", $newsletter['from_addr']). "<br />";
                $unsubLink = $row_config_globale['base_url'] . $row_config_globale['path'] . "subscription.php?i=" .$msg_id
                           . "&list_id=$list_id&op=leave&email_addr=" . urlencode($addr[$i]['email']). "&h=" . $addr[$i]['hash'];
            }
            $AltBody = new \Html2Text\Html2Text($body.$message.$unsubLink);
            $mail->AltBody = quoted_printable_encode($AltBody->getText());
            $subject = (strtoupper($row_config_globale['charset']) == "UTF-8" ? $subject : iconv("UTF-8", $row_config_globale['charset'], $subject));
            $body = str_replace( '</body>' , $unsubLink . $trac .'</body>', $message );
            $mail->Subject = $subject;
            $mail->Body    = $body;
            $mail->addCustomHeader("List-Unsubscribe",'<'. $row_config_globale['base_url'] . $row_config_globale['path'] 
                  . 'subscription.php?i='.$msg_id.'&list_id='.$list_id.'&op=leave&email_addr=' . $addr[$i]['email'] . '&h=' . $addr[$i]['hash'] . '>');
            @set_time_limit(300);
            $ms_err_info = '';
            if (!$mail->Send()) {
                $cnx->query("UPDATE " . $row_config_globale['table_send']. " 
                                SET error=error+1 
                            WHERE `id_mail`='" . $msg_id. "' 
                                AND `id_list`='" . $list_id. "'");
                $ms_err_info = $mail->ErrorInfo;
                $cnx->query("UPDATE " . $row_config_globale['table_email']. " 
                                SET error='Y',long_desc='" . $cnx->CleanInput($ms_err_info). "',campaign_id='" . $msg_id. "' 
                            WHERE email='" . $addr[$i]['email']. "' 
                                AND list_id='" . $list_id. "'");
                $daylogmsg=date("Y-m-d H:i:s") . " : envoi à " . $addr[$i]['email']. " en erreur $ms_err_info\n";
                fwrite($daylog, $daylogmsg, strlen($daylogmsg));
            } else {
                $cnx->query("UPDATE " . $row_config_globale['table_email']. " 
                                SET campaign_id='" . $msg_id. "' 
                            WHERE email='" . $addr[$i]['email']. "' 
                                AND list_id='" . $list_id. "'");
                $cnx->query("UPDATE " . $row_config_globale['table_send']. " 
                                SET cpt=cpt+1 
                            WHERE `id_mail`='" . $msg_id. "' 
                                AND `id_list`='" . $list_id. "'");
                $ms_err_info = 'OK';
                $daylogmsg=date("Y-m-d H:i:s") . " : envoi à " . $addr[$i]['email']. " OK\n";
                fwrite($daylog, $daylogmsg, strlen($daylogmsg));
            }
            $cnx->query("UPDATE " . $row_config_globale['table_send_suivi']. " 
                        SET nb_send=nb_send+1,last_id_send=" . $addr[$i]['id']. " 
                            WHERE `msg_id`='" . $msg_id. "' AND `list_id`='" . $list_id. "'");
            $endtimesend = microtime(true);
            $time_info = substr(($endtimesend-$begintimesend),0,5);
            $errstr = date("Y-m-d H:i:s"). "\tID : " .$addr[$i]['id'] . "\t" . $time_info . "\t\t " .$ms_err_info. " \t" . $addr[$i]['email'] . "\r\n";
            if (!$dontlog){
                fwrite($handler, $errstr, strlen($errstr));
            }
            $daylogmsg=date("Y-m-d H:i:s") . " : envoi à " . $addr[$i]['email']. " OK\n";
            fwrite($daylog,  $errstr, strlen($errstr));
        }
        $end = microtime(true);
        $tts = substr(($end - $start),0,5);
        $begin=$begin+$limit;
        if ($begin < $sn) {
            $arr=array(
                'step'   => 'send',
                'error'  => $error,
                'begin'  => $begin,
                'list_id'=> $list_id,
                'msg_id' => $msg_id,
                'sn'     => $sn,
                'token'  => $token,
                'pct'    => number_format((($begin/$sn)*100),2),
                'TTS'    => $tts
               );
            echo json_encode($arr);
            $cnx->query("UPDATE " . $row_config_globale['table_send_suivi']. " 
                        SET tts=tts+'" . $tts. "',last_id_send='" . $last_id_send. "',nb_send=nb_send+" . $to_send. " 
                            WHERE list_id='" . $list_id. "' 
                                AND msg_id='" . $msg_id. "'");
        } else {
            $errstr = "------------------------------------------------------------\r\n";
            $errstr .= "Finished at " . date("Y-m-d H:i:s"). "\r\n";
            $errstr .= "============================================================\r\n";
            if (!$dontlog){
                fwrite($handler, $errstr, strlen($errstr));
                fclose($handler);
            }
            $daylogmsg=date("Y-m-d H:i:s") . " : fin globale de l envoi du message $msg_id, sujet \"$subject\", sur liste $list_id\n";
            fwrite($daylog, $daylogmsg, strlen($daylogmsg));
            $arr=array(
                    'step'   => 'send',
                    'error'  => $error,
                    'begin'  => $sn,
                    'list_id'=> $list_id,
                    'msg_id' => $msg_id,
                    'encode' => $encode,
                    'sn'     => $sn,
                    'token'  => $token,
                    'pct'    => 100,
                    'TTS'    => $tts
                   );
            echo json_encode($arr);
        }
        fclose($daylog);
        break;
    default:
        $message = $_SESSION['message'];
        $subject = $_SESSION['subject'];
        $format  = $_SESSION['format'];
        $date    = date("Y-m-d H:i:s");
        $msg_id  = save_message($cnx, $row_config_globale['table_archives'], addslashes($subject), $format, addslashes($message), $date, $list_id);
        $dontlog = 0;
        if (!$handler = @fopen('logs/list' . $list_id . '-msg' . $msg_id . '.txt', 'a+')){
            $dontlog = 1;
        }
        $daylog = @fopen('logs/daylog-' . date("Y-m-d") . '.txt', 'a+');
        $daylogmsg=$date. " : message sauvegardé sous Numéro d'envoi : $msg_id\n";
        fwrite($daylog, $daylogmsg, strlen($daylogmsg));
        $cnx->query("UPDATE " . $row_config_globale['table_upload']. " 
                SET msg_id=" . $msg_id. "
                WHERE list_id=" . $list_id. "
                    AND msg_id=0");
        $daylogmsg="\r\n**********************************************************\r\n" . $date. " : initialisation envoi message $msg_id liste $list_id\n";
        fwrite($daylog, $daylogmsg, strlen($daylogmsg));
        $num    = get_newsletter_total_subscribers($cnx, $row_config_globale['table_email'],$list_id,$msg_id);
        $cnx->query("INSERT into " . $row_config_globale['table_send']. " (`id_mail`, `id_list`, `cpt`) VALUES ('" . $msg_id. "','" . $list_id. "','0')");
        $cnx->query("INSERT into " . $row_config_globale['table_send_suivi']. " (`list_id`, `msg_id`, `total_to_send`) VALUES ('" . $list_id. "','" . $msg_id. "','" . $num. "')");
        $errstr =  "=GLOBAL=ENVIRONNEMENT=======================================\r\n";
        if (version_compare(PHP_VERSION, '5.3.0', '>')) {
            $errstr .= "PHP : " . phpversion(). " " . tr("OK_BTN"). "\r\n";
        } else {
            $errstr .= "PHP : " . phpversion(). " " . tr("INSTALL_OBSOLETE"). "<\r\n";
        }
        if (extension_loaded('imap')) {
            $errstr .= "imap " . tr("OK_BTN"). "\r\n";
        } else {
            $errstr .= "imap " . tr("NOT_FOUND"). "\r\n";
        }
        if (extension_loaded('curl')) {
            $errstr .= "curl " . tr("OK_BTN"). "\r\n";
        } else {
            $errstr .= "curl " . tr("NOT_FOUND"). "\r\n";
        }
        if (is_exec_available()){
            $errstr .= "exec " . tr("OK_BTN"). "\r\n";
        } else {
            $errstr .= "exec " . tr("NOT_FOUND"). "\r\n";
        }
        $errstr .= "============================================================\r\n";
        $errstr .= date("d M Y") . "\r\n";
        $errstr .= "Started at " . date("Y-m-d H:i:s"). "\r\n";
        $errstr .= "N° \t Date \t\t Time \t\t Status \t\t Recipient  \r\n";
        $errstr .= "------------------------------------------------------------\r\n";
        if (!$dontlog){
            fwrite($handler, $errstr, strlen($errstr));
            fclose($handler);
        }
        fwrite($daylog, $errstr, strlen($errstr));
        fclose($daylog);
        DelMsgTemp($cnx, $list_id, $row_config_globale['table_sauvegarde']);
        echo json_encode(
            array(
                'step'    => 'send',
                'error'   => 0,
                'begin'   => 0,
                'list_id' => ( ($list_id)+0 ),
                'msg_id'  => ( ($msg_id)+0 ),
                'encode'  => $encode,
                'sn'      => ( ($num)+0 ),
                'token'   => $token,
                'pct'     => 0)
            );
        break;
}

Je prends le temps de créer un outil pour tous, de niveau professionnel, mais simple !
Il n'est pas encore parfait, soyez indulgents, ça vient...
Si vous avez des questions, n'hésitez pas ! Mais soyez précis pour une réponse plus rapide  wink

Hors ligne

#17 09-11-2016 13:00:09

Arnaud
Administrateur

Re : DKIM FAIL si HTML dans envois

A noter que c'est compliqué de gérer la balise body en ouverture, car elle peut avoir des règles css appliquée dans la balise...


Je prends le temps de créer un outil pour tous, de niveau professionnel, mais simple !
Il n'est pas encore parfait, soyez indulgents, ça vient...
Si vous avez des questions, n'hésitez pas ! Mais soyez précis pour une réponse plus rapide  wink

Hors ligne

#18 09-11-2016 17:37:43

Skygui
Membre

Re : DKIM FAIL si HTML dans envois

Arnaud, dans le code que tu a posté concernant send.php, il y a une erreur, tu ferme </div></body></html> en plein milieu du lien d'unsubsribe  glasses
Ce qui à l'envoi donnera forcément un code HTML :

<a href=3D'http://xxx.com/subscription.php?i=3D&list_id=
=3D1&op=3Dleave&email_addr=3Dxxx@xxx.com&h=3Dfake_hash' style=3D'' tar=
get=3D'_blank'></body></html> d=C3=A9sinscription</a>

Hors ligne

Pied de page des forums

Propulsé par FluxBB