Support et annonces PhpMyNewsLetter.
Vous n'êtes pas identifié(e).
Durs les travaux !
L'intérêt de la fusion de ces listes est de conserver d'une part les listes initiales, et d'autre part de créer une liste complète (temporaire pourquoi pas !) de tous les mails pour une campagne spécifique...
Si ce sont les stats complètes que tu cherches, je pencherais pour un cumul stats à afficher à la demande...
Bonjour Johnny,
Réponse tardive, milles excuses.
Fusionner, mixer deux ou plusieurs listes ne sert qu'à mixer (dédoublonnage inclus) les listes des emails.
Chaque liste est maintenue, entretenue individuellement et conserve ses spécificités.
Une liste issue de fusions, mixages, est crée comme une nouvelle liste et aura ses propres spécifictés.
Si une liste A a été épurée par des désinscriptions, les désinscrits ne seront pas ajoutés à la nouvelle liste obtenue.
Voilà voilà... Bien en retard...
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...
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é !!!
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' /> <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> </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")." >>' 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;
}Bonjour Titi,
J'avoue que je ne sais plus trop ce que j'avais fait...
L'idée était de repasser en IPv4, et il fallait donc modifier tout le système.
Une recherche pour t'aider :
https://www.centos.org/forums/viewtopic.php?t=7989
http://linoxide.com/linux-how-to/disabl … dora-rhel/
et
https://wiki.centos.org/FAQ/CentOS7#hea … 67f2fcd8ee
Je sais, c'est une lecture un peu complexe.
Après il faut revoir postfix.
Pour vérifier si ton IP est blacklistée ou pas, :
http://mxtoolbox.com/blacklists.aspx
Note bien ton IP v4 depuis ton manager, et bon courage !
Parce que archive n'est pas mis à jour des paramètres nécessaires à un envoi.
Je me dépêche...
oui, sauf si tu n'as pas 2 fois de head et body.
Vérifie un code source avec l'icône "<>"
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
)
- Tes clés sont correctement installées, pas de soucis ! encore un emoticon tiens :
- 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 à votre carnet d'adresses pour êt=
re sû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' />
Avec un envoi de combien de mails ?
Et sur quel navigateur ?
Car voilà ce qu'il se passe : en fonction d'un navigateur, d'une version, d'un paramétrage, d'un OS, etc,... le navigateur peut arrêter de tourner et de faire tourner javascript en background.
Javascript n'est alors actif que si la fenêtre est active et devant l’administrateur de la liste !
L'envoi manuel est très bien pour les listes modestes, jusqu'environ 1000 mails.
Au delà, j'invite vivement à utiliser la planification
Répondu par mail
Sincèrement, oui !
Sinon, en me connectant avec mon compte Linkedin, voici le screen qui montre bien ce que je te dis :
????
Honnêtement, je ne vois pas d'où cela peut sortir, sauf à ce que soit des liens créés manuellement pour tester ton portail...
A partir du moment où tu as un traceur de liens, tout est possible...
Il faut vérifier ton error log de php.
Et vérifier quel est ton max upload de php.ini
Vérifier également ce qui a été importé en base, et voir si la base est toujours OK.
Oui, mais toujours comme ça.
Je ne connais pas les services, je n'y suis pas abonné, et c'est un template de présentation.
Si tu es abonné, tu pourras avoir surement d'autres couleurs ;-)
Le mien :
ajout dans GESTION DU TRACKING
* Détection des clients sur ouverture d'un mail (Outlook, Icedove, Thunderbird, Lotus,...)
Je vais mettre le sujet directe en résolu !
Les cadres sont rouges pour présentation dans l'interface senderscore et ne présument en rien de la qualité de ta campagne
En bref, c'est pour attirer les clients !
Et bravo pour le 10/10, voilà qui me fait vraiment plaisir ! Un petit screen ?
Le sous domaine, c'est bien pour gérer tout ça, mais en fonction des hébergeurs, OS et cie, détecter le bon sous répertoire de sous-domaine est parfois un peu compliqué.
J'étais sur la route, un peu difficile de répondre davantage, mais vu que c'est réglé, je suis content :-)
Bon usage, et n'oublie pas : une question, une demande d'aide = un nouveau topic ;-)
ATTENTION : 2.0.4 n'est pas officiellement ouverte !
Bonjour Skygui et bienvenue sur le forum
Nouveau bug, nouveau post merci ;-)
C est une installation en sous domaine ?
Oui, vais regarder...
Vu et répondu
Bonjour Johnny,
tu as changé le script compose.php ?
Et OK pour envoyer les identifiants sur ton test, via MP STP
A.
Sinon, le problème de retour en arrière, je n'ai pas réussi à le reproduire... Donc sauf si tu as été jusqu'à envoyer ta campagne, le retour devrait se faire sans problèmes.
Bonjour,
voici le code de la nouvelle compose.php, à remplacer entièrement (https://raw.githubusercontent.com/Arnau … ompose.php)
- suppression du switch entre code html et usage de l'éditeur
- import de code html possible comme tu l'as décrit
- amélioration de tinymce avec de belles toolbar et ajouts de fonctions.
<?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' /> <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> </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")." >>' 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 colorpicker anchor code link image paste pagebreak table contextmenu',
'filemanager table code media autoresize textcolor emoticons'
],
/*toolbar1 : 'insertfile undo redo | bold italic | forecolor 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,colorpicker,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 : 'raw',
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>";
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;
}
?>Ouch !
Oui c est du bug je vais corriger
C'est tout à fait vrai, sauf que l'on fait de la newsletter, avec des images destiées évidemment aux lecteurs, et pour la gestion de ces images, on a parfois besoin de créer des répertoires.
Une fois fait à la main, c'est bon.
Sauf que dans le filemanager on peut créer des répertoires (normalement), pour gérer les différentes news par exemple, et avec cette restriction, tu ne pourras plus...