Publipostage (zip et mel)

Soyez le premier à donner votre avis sur cette source.

Vue 10 425 fois - Téléchargée 1 101 fois

Description

Ce code permet la création d'un publipostage à partir d'un document .rtf (Microsoft ou OpenOffice) et de données extraite d'un fichier .csv et de paramétrer les documents en sortie
Etape 1 : Chargement des deux fichiers. Un aperçu sera afficher pour voir si le contenu est correct. En option la possibilité de protéger ces données par identifiant et mot de passe (utile si l'application est ouverte à plusieurs personnes ou en accès libre)
Etape 2 : Paramétrage avec une sélection des enregistrements a publier, la création du lien entre les données et les champs de fusion disponible, la définition du/des nom(s) du fichier à éditer (très utile pour créer 1 document par enregistrement et le nommer en fonction des ) ou encore le paramétrage de l'option d'envoi de mel
Etape 3 : La génération du/des documents qu'il sera possible de lire, d'envoyer par mel ou de récupérer dans un ZIP

Il y a en plus un bouton d'aide à chaque étape.
J'ai mis un jeu de test à votre disposition.

Source / Exemple :


<?php
  error_reporting (E_ERROR|E_PARSE);
  session_start();
?>
<HTML>
<HEAD>
<TITLE>Publipostage Dam's Prod - Etape 1</TITLE>
<STYLE>
	BODY {background:url('images/fond.png')}
	A {cursor:pointer; text-decoration:none;}
	button {font-size:16pt;}
</STYLE>
</HEAD>
<BODY>
<CENTER>
<TABLE border=0 width="100%"><TR><TD width="10%" style='vertical-align:middle; text-align:center; font-size:18pt;'>ETAPE<br>1/3<TD><CENTER><H1>CHARGEMENT DES FICHIERS</H1><TD width="10%"><A href='aide/1-.html' target=aide><IMG src='aide/images/aide.png' border="0" /></TABLE>

<?php

// Définition de la session
$ip=$_SERVER["REMOTE_ADDR"];
$i=1;
while (is_dir("_SESS_".$ip."_".$i))
	$i++;
$_SESSION['session']="_SESS_".$ip."_".$i;
mkdir ($_SESSION['session'], 0777);
mkdir ($_SESSION['session']."/exports", 0777);

echo "<i>SESSION : <b>".$_SESSION['session']."</b></i><br><br>";

// Définition du séparateur
if (!$_SESSION['sep']) {
	$_SESSION['sep']=";";
}

?>

<TABLE border="0" width="100%">
<TR><TD width="20%" style="text-align:right;"><IMG src="images/OpenOffice writer 3D.png" />
<TD><CENTER><IFRAME src="chargement_rtf.php" width="80%" height="170" style="border:solid 1px #646D1D;"></IFRAME> <br><br>
<TD width="20%"><IMG id=img_rtf src="" />

<TR><TD width="20%" style="text-align:right;"><IMG src="images/openoffice tableur 3D.png" />
<TD><CENTER><IFRAME src="chargement_csv.php" width="80%" height="170" style="border:solid 1px #646D1D;"></IFRAME> <br><br>
<TD width="20%"><IMG id=img_csv src="" />
</TABLE>
<CENTER><FORM method="post" action="param.php">
Protection : Identifiant <INPUT type=text name=ident size=15 value=""> Mot de passe <INPUT type=text name=mdp size=15 value=""> (Laisser à vide si vous ne vous pas de protection)
<br><br><INPUT type=hidden id=fich_rtf name=fich_rtf size=50 value="rien">Séparateur dans fichier CSV &nbsp;<INPUT type=text name=sep value="<?php echo $_SESSION['sep'];?>" style="font-size:20pt;width:20px;">
<INPUT type=hidden id=fich_csv name=fich_csv size=50 value="rien"><br><br>
<INPUT id=suivant type=submit style="display:none;" value="Passer à l'étape suivante" />
</FORM>
<SCRIPT LANGUAGE="JavaScript"> 

var fich_rtf=document.getElementById("fich_rtf");
var fich_csv=document.getElementById("fich_csv");
var img_rtf=document.getElementById("img_rtf");
var img_csv=document.getElementById("img_csv");
var suivant=document.getElementById("suivant");
		
	function suite() {
		if ( (fich_rtf.value != "rien") && (fich_csv.value != "rien") ) {
			suivant.style.display="block";
		}
	}

	function maj_rtf(v) {
		fich_rtf.value=v
		if (v != "rien")
			img_rtf.src="images/button_ok.png";
		else
			img_rtf.src="images/button_cancel.png";
		suite();
	}

	
	function maj_csv(v) {
		fich_csv.value=v
		if (v != "rien")
			img_csv.src="images/button_ok.png";
		else
			img_csv.src="images/button_cancel.png";
		suite();
	}
</SCRIPT>
</center>
</BODY>
</HTML>

Conclusion :


J'attends vos remarques

Codes Sources

A voir également

Ajouter un commentaire Commentaires
Messages postés
6
Date d'inscription
lundi 8 août 2005
Statut
Membre
Dernière intervention
17 juin 2010

salut super script bvo!
par contre peux tu me dire comment changer le nom du fichier dans le mail (le.doc) car il met ip_session+export.doc en fichier joint...
Messages postés
487
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
1 septembre 2011

Salut,
Alors pour faire cour, l'importance des entêtes HTML est crutiale par rapport au comportement que va avoir le navigateur. Si tu utilise le HTML4 (c'est ton cas), il faut savoir que tout les navigateurs ne le supporte pas forcément pleinement. En fait, celà joue surtout sur l'interprétation des balises. En HTML1, tu ne pouvais pas faire les mêmes choses qu'en HTML2 ou 3.
Perso, je te conseillerais d'aller visiter le site du W3C et récupérer un entête type que eux recommendent. Comme ça tu sera sûr de pas te planter.
"c'est parce que je ne l'ai pas mis dans le code HTML directement ? ou alors il y a mieux ?" ((oui et non) et oui). Il faut absolument que tu prennes l'habitude de séparer les languages. Encore une fois, je ne critique pas le fonctionnement du programme mais bien la syntaxe et la grammaire. Alors je pleure parceque le code 'echo "= PHP5 uniquement
$newmail = new CMailFile($ligne[2],$ligne[0],$mon_mel,$ligne[3]."\n\nCi-joint un fax. Enregistrez sur votre ordinateur pour le lire, merci.","../".$ligne[4],"base 64");
$newmail->sendfile();
$buffer .= " Envoyé ";
} else {
$buffer . = " Pas un mel";
}

}

fclose($m);

$buffer .= "
<center> FERMER ";

// Affichage du temps
$time_end = getMicroTime();
$time = round($time_end - $time_start,4);
$buffer .= "
Exécution en $time secondes";
?>

<!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>
<SCRIPT type='text/javascript'>
//<![CDATA[
var res=document.getElementById("res");

function cacher() {
alert("Envoi effectué");
}

//]]>
</SCRIPT>
</HEAD>

<?php
echo $buffer;
?>

</HTML>
/********************************
**********************************/

Voilà, ce n'est pas parfait, mais c'est beaucoup plus propre comme ça. Force toi à respecter les indentation pour visualiser tout de suite où sont les débuts et fins de crochets

Renseigne toi bien sur ce que fait une instruction avant de l'utiliser. (cf www.php.net)

Enfin, pour avoir des exemples je te conseil de regarder les codes de certaines bêtes du php (coucou47, malalam... j'en passe , mais la liste est plutot longue, commence par regarder les codes de ceux là et tu suis le fils des conversation pour trouver les autres) qui rodent dans le coin. Tu verra que tout est structuré. Comme ça, c'est plus facile à maintenir.
Messages postés
24
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
4 juin 2008

Bonjour,

Merci pour tout ton commentaire masternico.

Je suis contient que mon code n'est pas très aux "normes", MAIS ça marche et c'est ce que je cherchais jusqu'à aujourd'hui on peut, et je ne suis pas contre quelques trucs et conseils pour améliorer mon code et pourquoi pas améliorer la rapidité.
Pour cela, je n'ai jamais mis de DOCTYPE car je ne voyais pas pourquoi il fallait le mettre, une idée ?

Sinon pour ce que tu me conseil de mettre dans le php.ini cela ne poserait pas un problème pour ceux qui prendrait mon code et ne l'aurait pas gérer dans leur php.ini ?

"""echo ""; // passez moi les mouchoirs, je pleure""" c'est parce que je ne l'ai pas mis dans le code HTML directement ? ou alors il y a mieux ?

En effet j'ai fais des testes et la mémoire "gonfle" un peut je vais suivre ton conseil. Bien sur si après tu as de 128K en connexion c'est encore + long pour l'envoi, je vais peut être voir pour une version qui n'enverrais qu'un lien vers le document.

Enfin, non ça ne passe pas trop le W3C, mais comme je te le disais mon code fonctionne, là tu testé ?
Messages postés
487
Date d'inscription
dimanche 5 octobre 2003
Statut
Membre
Dernière intervention
1 septembre 2011

Salut,
il veut juste dire qu'il est plus judicieux de commencer par mettre le code php en début de script avant de commencer à afficher du HTML.
A moins, évidemment d'utiliser la buffurisation de sortie ob_start() (très pratique d'ailleur) puis de récupérer le contenu du buffer en fin de page et d'envoyer le contenu au navigateur.
Il a aussi voulu dire que la gestion du temps d'execution maximal de script se gère dans le fichier php.ini. Il en va de même pour la gestion de ce que php doit afficher comme erreur à l'écran.
En dévellopement, c'est bien pratique de faire afficher les erreurs, mais dès que ton script est en production, il faut impérativement désactiver l'affichage des erreurs. Les erreurs doivent êtres 'logguée' dans un fichier que tu pourras consulter quand tu veux. Gros avantage, tu récupères les messages d'erreurs de TOUT le monde. Super gain de temps pour le debuggage et surtout, super gain en sécurité car les messages d'erreurs sont des mines d'information pour les petits malins et un tels script exposé aux menaces d'Internet ne résiste pas longtemps. Alors, évidemment, il semblerais que ton script ne soit destiné qu'à un usage local ou intranet mais bon, quand même.

j'ai lu en diagonale mais j'ai vu des prb d'analyse de scipt (je ne critique pas le fonctionnement, mais la syntaxe). Les includes de class se font en début de script (cf remarque précédente). Tu mélanges alègrement php et HTML.


/*************************************
****************************************/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<?php
error_reporting (E_ERROR|E_PARSE); //à supprimer et à gérer dans php.ini

session_start(); //ne fonctionne pas puisque tu as déjà envoyé du code html

set_time_limit(3600); //à supprimer et à gérer dans php.ini

$mon_mel= "";

//temps d'execution
function getMicroTime() {
$microsecondes=microtime();
list($micro,$time)=explode(' ',$microsecondes);
return($micro+$time);
}
$time_start = getmicrotime(); //??? tu mélange les nom de proc??? en déclaration on a getMicroTime et maintenant getmicrotime en minuscule??? j'ai pas testé, mais il marche ton code?

/* Insert de la class qui envoie la pièce jointe */
require "CMailFile.php"; // à mettre en début de page

echo ""; // passez moi les mouchoirs, je pleure



$fileLines=file("../".$_SESSION['session']."/exports/mels.txt");
echo count($fileLines)." mels à envoyer";

$fic=fopen("../".$_SESSION['session']."/exports/mels.txt","r");

for ($ligne fgetcsv($fic, 1024, ";"); !feof($fic); $ligne fgetcsv($fic, 1024, ";")) {
echo "
".$ligne[0];
if (filter_var($ligne[0], FILTER_VALIDATE_EMAIL)) { // !!! >= PHP5 uniquement
//************************************************************//
// heuuu... tu instancie un nouvel objet pour chaque mail??? t'as déja fait tourné ton programme avec une base de plusieurs miliers de mails??? je vois le plantage mémoire à l'horizon... l'objet doit être instancié une fois puis réutilisé pour tous les mails. Ou bien il faut détruire l'objet avant d'en créer un nouveau. Sinon, l'utilisation de ta mémoire gonfle, gonfle, puis tout explose...
//************************************************************//
$newmail = new CMailFile($ligne[2],$ligne[0],$mon_mel,$ligne[3]."\n\nCi-joint un fax. Enregistrez sur votre ordinateur pour le lire, merci.","../".$ligne[4],"base 64");
$newmail->sendfile();
echo " Envoyé ";
} else {
echo " Pas un mel";
}

}

fclose($m);

echo "
<center>FERMER";

// Affichage du temps
$time_end = getmicrotime();
$time = round($time_end - $time_start,4);
echo "
Exécution en $time secondes";
?>

<SCRIPT language=JavaScript>
<!--
var res=document.getElementById("res");

function cacher() {
alert("Envoi effectué");
}

//-->
</SCRIPT>
/********************************
***********************************/
/*???????????????????????????????????????
et la balise de fin de corps et de fin de html??? ton script ne passe certainement pas la validation du W3C
*/
Messages postés
24
Date d'inscription
samedi 18 mai 2002
Statut
Membre
Dernière intervention
4 juin 2008

2/ Pourquoi ne fais-tu pas tes traitements PHP avant le code HTML ?

Je ne comprends pas ce que tu veux dire.
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Du même auteur (ddempt)