diff --git a/conf.php b/conf.php index 091292d..a0f1fe4 100755 --- a/conf.php +++ b/conf.php @@ -7,39 +7,33 @@ // Home : http://poubelle.zici.fr //----------------------------------------------------------- -//error_reporting(0); define('DEBUG', true); +// Domain email (separe with ;) +define('DOMAIN', 'exemple.com;zici.fr'); +#define('DOMAIN', 'exemple.com'); +// PDO stucture +// Exemple pour MYSQL : +// define('DB', 'mysql:host=127.0.0.1;dbname=baseMysql'); +// define('DBUSER', 'utilisateurMysql'); +// define('DBPASS', 'motdepassedefou'); +// Exemple pour Sqlite : +// define('DB', 'sqlite:./data/emailPoubelle.sqlite'); +define('DB', 'mysql:host=localhost;dbname=c1_demo'); +#define('DB', 'sqlite:./database.sdb'); +define('DBUSER', 'c1_demo'); +define('DBPASS', 'sqdf2csd4rvn45548'); +define('DBTABLEPREFIX', 'ep_'); - -// Domaine email -define('DOMAIN', 'zici.fr'); - -// Deux options : -// PLAIN : plaintext, pas de base, simple mais des fonctionnalités en moins -// DB : pdo usage -define('BACKEND', 'DB'); - -if (BACKEND == 'DB') { - // PDO stucture - // Exemple pour MYSQL : - // define('DB', 'mysql:host=127.0.0.1;dbname=baseMysql'); - // define('DBUSER', 'utilisateurMysql'); - // define('DBPASS', 'motdepassedefou'); - // Exemple pour Sqlite : - // define('DB', 'sqlite:./data/emailPoubelle.sqlite'); - define('DB', 'mysql:host=localhost;dbname=c1_demo'); - #define('DB', 'sqlite:./database.sdb'); - define('DBUSER', 'c1_demo'); - define('DBPASS', 'sqdf2csd4rvn45548'); -} +// writable for script +define('DATA', './data'); // Fichier d'alias postfix -define('FICHIERALIAS', './data/virtual'); +define('FICHIERALIAS', DATA.'/virtual'); define('BIN_POSTMAP', '/usr/sbin/postmap'); -define('URLPAGE', 'http://'.$_SERVER["SERVER_NAME"].'/'.$_SERVER["REQUEST_URI"]); +define('URLPAGE', 'http://'.$_SERVER["SERVER_NAME"].$_SERVER["SCRIPT_NAME"]); // A indiquer si vous utiliser les URL's rewriting // Exemple avec un htaccess @@ -51,12 +45,9 @@ define('URLREWRITE_DEBUT', false); define('URLREWRITE_FIN', false); // - Email -// Sujet de l'email pour la confirmation -define('EMAIL_SUJET_CONFIRME', '[EmailPoubelle] Confirmation alias '); -// Sujet de l'email pour la liste des alias -define('EMAIL_SUJET_LISTE', '[EmailPoubelle] Liste des alias '); +define('EMAILTAGSUJET', '[EmailPoubelle]'); // From de l'email -define('EMAIL_FROM', '"NO REPLAY emailPoubelle" '); +define('EMAILFROM', '"NO REPLAY emailPoubelle" '); // Alisas interdit : (regex ligne par ligne) - commenter pour désactiver define('ALIASDENY', './aliasdeny.txt'); @@ -73,4 +64,6 @@ if (CHECKMX) { define('NS2', '8.8.8.8'); } +define('CHECKUPDATE', true); + ?> diff --git a/emailPoubelle.php b/emailPoubelle.php index b45ed6f..81d90da 100644 --- a/emailPoubelle.php +++ b/emailPoubelle.php @@ -1,17 +1,17 @@ Erreur : Problème de configuration'); +} +// check writable work directory +if (!is_writable(DATA)) { + exit('
Erreur : le répertoire de travail ne peut pas être écrit. Merci de contacter l\'administrateur
'); +} // check alias file is_writable if (!is_writable(FICHIERALIAS)) { exit('
Erreur : le fichier d\'alias ne peut pas être écrit. Merci de contacter l\'administrateur
'); @@ -38,17 +45,32 @@ if (defined('ALIASDENY') && !is_readable(ALIASDENY)) { } // Connect DB -if (BACKEND == 'DB') { - try { - if (preg_match('/^sqlite/', DB)) { - $dbco = new PDO(DB); - } else { - $dbco = new PDO(DB, DBUSER, DBPASS); - } - $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); - } catch ( PDOException $e ) { - die('Connexion à la base '.$e->getMessage()); - } +try { + if (preg_match('/^sqlite/', DB)) { + $dbco = new PDO(DB); + } else { + $dbco = new PDO(DB, DBUSER, DBPASS); + } + $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); +} catch ( PDOException $e ) { + die('Connexion à la base '.$e->getMessage()); +} +// Create DB if not exists +try { +// status : 0=not verified - 3=disable - 5=active +$create = $dbco->query("CREATE TABLE IF NOT EXISTS ".DBTABLEPREFIX."alias ( + id INTEGER PRIMARY KEY AUTO_INCREMENT, + status INTEGER(1) NOT NULL, + alias CHAR(150) NOT NULL UNIQUE, + email CHAR(150) NOT NULL, + dateCreat DATETIME NOT NULL, + dateExpir DATETIME, + comment TEXT);"); +} catch ( PDOException $e ) { + echo '
Erreur à l\'initialisation des tables. Merci de contacter l\'administrateur '; + if (DEBUG) { $e->getMessage(); } + echo '
'; + die(); } ////////////////// @@ -77,30 +99,51 @@ function VerifMXemail($email) { // postmap command function UpdateVirtualDB() { - echo exec(BIN_POSTMAP.' '.FICHIERALIAS,$output,$return); + // @todo : créer le ficheir à partir de la base + //echo exec(BIN_POSTMAP.' '.FICHIERALIAS,$output,$return); } -//// A FAIRE (chian) : - // add new alias -function AjouterAlias($alias,$email) { - if (BACKEND == 'DB') { - // A faire mais $alais doît changer - } else { - $fichier=fopen(FICHIERALIAS,'a+'); - fputs($fichier, $alias.'@'.DOMAIN.' '.$email."\n"); - fclose($fichier); - } +function AjouterAlias($status, $alias,$email, $life, $comment) { + global $dbco; + $dateCreat=date('Y-m-d H:i:s'); + if ($life == 0) { + $dateExpir=NULL; + } else { + $dateExpir=date('Y-m-d H:i:s', time()+$life); + } + $insertcmd = $dbco->prepare("INSERT INTO ".DBTABLEPREFIX."alias (status, alias, email, dateCreat, dateExpir, comment) + VALUES ($status, '$alias', '$email', '$dateCreat', '$dateExpir', '$comment')"); + $insertcmd->execute(); + if (!$insertcmd) { + echo '
Erreur pendant l\'ajout dans la base. Merci de contacter l\'administrateur '; + if (DEBUG) { + print_r($dbco->errorInfo()); + } + echo '
'; + } else { + return $dbco->lastInsertId(); + } + // @todo : a faire UpdateVirtualDB(); } -//// A FAIRE : - // delete new alias function SupprimerAlias($alias,$email) { - file_put_contents(FICHIERALIAS, preg_replace('#\n\#[0-9]+ '.$alias.'@'.DOMAIN.' '.$email.'#U', '', file_get_contents(FICHIERALIAS)/*, 1*/)); - file_put_contents(FICHIERALIAS, preg_replace('#\n'.$alias.'@'.DOMAIN.' '.$email.'#U', '', file_get_contents(FICHIERALIAS)/*, 1*/)); - # http://www.siteduzero.com/forum-83-542138-p1-supprimer-une-ligne-d-un-fichier-texte-avec-regex.html + // @todo : a faire + UpdateVirtualDB(); +} + +// update alias status +function UpdateStatusAlias($id, $alias_full, $status) { + global $dbco; + try { + $updatecmd = $dbco->prepare("UPDATE ".DBTABLEPREFIX."alias SET status = $status WHERE id = $id AND alias = '$alias_full'"); + $updatecmd->execute(); + } catch ( PDOException $e ) { + echo "DB error : ", $e->getMessage(); + die(); + } UpdateVirtualDB(); } @@ -144,39 +187,58 @@ function AliasDeny($alias) { // list alias function ListeAlias($email) { - $handle = fopen(FICHIERALIAS, 'r'); - while (!feof($handle)) { - $buffer = fgets($handle); - if ($buffer) { - $bufferExplode = explode(' ', $buffer); - if (!preg_match('/^(#|$|;)/', $buffer) && preg_match('/^'.$email.'$/', $bufferExplode[1])) { - $alias[]=$bufferExplode[0]; - } - } - } - fclose($handle); + // @todo : a faire return ($alias); } +function SendEmail($recipient, $sujet, $message) { + $header = 'From: '.EMAILFROM.'\n'; + $header.= 'MIME-Version: 1.0\n'; + if (preg_match('#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#', $recipient)) { + $header = str_replace('\n', '\r\n', $header); + $message = str_replace('\n', '\r\n', $header); + } + mail($recipient,EMAILTAGSUJET.' '.$sujet,$message,$header); +} + +function urlGen($act,$id,$alias_full) { + $idUrl=base64_encode($id.';'.$alias_full); + if (URLREWRITE_DEBUT && URLREWRITE_FIN) { + return URLREWRITE_DEBUT.$idUrl.URLREWRITE_FIN; + } else { + return URLPAGE."?act=".$act."&value=".$idUrl; + } +} + +////////////////// +// Admin function +////////////////// + +function CheckUpdate() { + //$doc = file_get_contents('http://poubelle.zici.fr/ep_checkupdate'); + //echo $doc; +} + ////////////////// // Start program ////////////////// // Valid email process -if (isset($_REQUEST['Validemail'])) { - if (preg_match('/#'.$_REQUEST['Validemail'].' [a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+ [a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+/', file_get_contents(FICHIERALIAS),$res)) { - $data=explode(' ', $res[0]); - $aliasExplode=explode('@', $data[1]); - $alias=$aliasExplode[0]; - $email=$data[2]; - SupprimerAlias($alias,$email); - AjouterAlias($alias,$email); - echo '
Votre email poubelle '.$alias.'@'.DOMAIN.' > '.$email.' est maintenant actif
'; +if (isset($_GET['act']) && $_GET['act'] == 'validemail' && isset($_GET['value'])) { + $idUrl = explode(';', base64_decode($_GET['value'])); + echo $dbco->query("SELECT COUNT(*) FROM ".DBTABLEPREFIX."alias WHERE id = '".$idUrl[0]."' AND status = 0")->fetchColumn(); + if ($dbco->query("SELECT COUNT(*) FROM ".DBTABLEPREFIX."alias WHERE id = '".$idUrl[0]."' AND status = 0")->fetchColumn() != 0) { + UpdateStatusAlias($idUrl[0], $idUrl[1], 5); + echo '
Votre email poubelle '.$idUrl[1].' est maintenant actif
'; } else { - echo '
Erreur : ID introuvable
'; + echo '
Erreur : ID introuvable ou déjà validé
'; } +} elseif (isset($_GET['dis'])) { + // @todo fa faire +} elseif (isset($_GET['del'])) { + // @todo fa faire // list email process -} elseif (isset($_REQUEST['list'])) { +} elseif (isset($_GET['list'])) { $email=strtolower($_REQUEST['email']); if (! filter_var($email, FILTER_VALIDATE_EMAIL)) { echo '
Erreur : Adresse email incorrect
'; @@ -185,100 +247,181 @@ if (isset($_REQUEST['Validemail'])) { } else if (!preg_match('#\n[a-z0-9]+@'.DOMAIN.' '.$email.'#', file_get_contents(FICHIERALIAS))) { echo '
Vous n\'avez encore aucun alias d\'actif
'; } else { - # send email with alias list - if (!preg_match('#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#', $email)) { - $passage_ligne = "\r\n"; - } else { - $passage_ligne = "\n"; - } - $header = 'From: '.EMAIL_FROM.$passage_ligne; - $header.= 'MIME-Version: 1.0'.$passage_ligne; - $message= 'Liste de vos redirections poubelles : '.$passage_ligne; + $header = 'From: '.EMAIL_FROM.'\n'; + $header.= 'MIME-Version: 1.0\n'; + $message= 'Liste de vos redirections poubelles : \n'; foreach (ListeAlias($email) as $alias) { - $message.=' * '.$alias.$passage_ligne; + $message.=' * '.$alias.'\n'; } - $message.= 'Pour supprimer un email poubelle vous pouvez vous rendre sur le lien ci-dessou : '.$passage_ligne; - $message.= "\t * ".URLPAGE.$passage_ligne; - mail($email,EMAIL_SUJET_LISTE,$message,$header); + $message.= 'Pour supprimer un email poubelle vous pouvez vous rendre sur le lien ci-dessou : \n'; + $message.= "\t * ".URLPAGE.'\n'; + SendEmail($email,'Liste des alias',$message); echo '
Un email vous a été adressé avec la liste de vos emails poubelles actifs.
'; } -// -} elseif (isset($_REQUEST['email']) && isset($_REQUEST['alias'])) { - $alias=strtolower($_REQUEST['alias']); - $email=strtolower($_REQUEST['email']); +// Form +} elseif (isset($_POST['email']) && isset($_POST['alias'])) { + $alias=strtolower($_POST['alias']); + $email=strtolower($_POST['email']); + $domain=$_POST['domain']; + $life=$_POST['life']; + $comment=$_POST['comment']; + // Check form if (! filter_var($email, FILTER_VALIDATE_EMAIL)) { echo '
Erreur : Adresse email incorrect
'; } else if (! VerifMXemail($email)) { echo '
Erreur : Adresse email incorrect (2)
'; } else if (! preg_match('#^[\w.-]+$#',$alias)) { - echo '
Erreur : email poubelle incorrect
'; + echo '
Erreur : Format de l\'email poubelle incorrect
'; + } else if (! preg_match('#'.$domain.'#',DOMAIN)) { + echo '
Erreur : ce domain n\'est pas pris en charge
'; } else if (AliasDeny($alias)) { echo '
Erreur : email poubelle interdit
'; } else if (BlacklistEmail($email)) { echo '
Erreur : vous avez été blacklisté sur ce service
'; - } elseif (isset($_REQUEST['add'])) { - if (preg_match('#\n'.$alias.'@'.DOMAIN.'#', file_get_contents(FICHIERALIAS)) || preg_match('#\n\#[0-9]+ '.$alias.'@'.DOMAIN.'#', file_get_contents(FICHIERALIAS))) { + // add + } elseif (isset($_POST['add'])) { + if ($dbco->query("SELECT COUNT(*) FROM ".DBTABLEPREFIX."alias WHERE alias = '".$alias.'@'.$domain."'")->fetchColumn() != 0) { echo '
Erreur : cet email poubelle est déjà utilisé
'; } else { - if (preg_match('#\n[a-z0-9]+@'.DOMAIN.' '.$email.'#', file_get_contents(FICHIERALIAS))) { - AjouterAlias($alias,$email); - echo '
Votre email poubelle '.$alias.'@'.DOMAIN.' > '.$email.' est maintenant actif
'; + if ($dbco->query("SELECT COUNT(*) FROM ".DBTABLEPREFIX."alias WHERE email = '".$email."' AND status = 5")->fetchColumn() != 0) { + AjouterAlias(5, $alias.'@'.$domain, $email, $life, $comment); + echo '
Votre email poubelle '.$alias.'@'.$domain.' > '.$email.' est maintenant actif
'; } else { - $id=rand().date('U'); - $alias_desactive='#'.$id.' '.$alias; - AjouterAlias($alias_desactive,$email,0); - # Envoi de l'email : - if (!preg_match('#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#', $email)) { - $passage_ligne = "\r\n"; - } else { - $passage_ligne = "\n"; - } - $header = 'From: '.EMAIL_FROM.$passage_ligne; - $header.= 'MIME-Version: 1.0'.$passage_ligne; - $message= 'Confirmation de la création de votre redirection email poubelle : '.$passage_ligne; - $message= $alias.'@'.DOMAIN.' => '.$email.$passage_ligne; - $message= 'Cliquer sur le lien ci-dessous pour confirmer : '.$passage_ligne; - if (URLREWRITE_DEBUT && URLREWRITE_FIN) { - $message.= "\t * ".URLREWRITE_DEBUT.$id.URLREWRITE_FIN.$passage_ligne; - } else { - $message.= "\t * ".URLPAGE.'?Validemail='.$id.$passage_ligne; - } - $message.= 'Pour supprimer cet email poubelle vous pouvez vous rendre sur le lien ci-dessou : '.$passage_ligne; - if (URLREWRITE_DEBUT && URLREWRITE_FIN) { - $message.= "\t * ".URLPAGE.$passage_ligne; - } else { - $message.= "\t * ".URLPAGE.'?sup=true&email='.$email.'&alias='.$alias.$passage_ligne; - } - mail($email,EMAIL_SUJET_CONFIRME.$alias,$message,$header); + $lastId=AjouterAlias(0, $alias.'@'.$domain, $email, $life, $comment); + $message= "Confirmation de la création de votre redirection email poubelle : "; + $message= $alias.'@'.$domain.' => '.$email."\n"; + $message= "Cliquer sur le lien ci-dessous pour confirmer : \n"; + $message.= "\t * ".urlGen('validemail',$lastId,$alias.'@'.$domain)."\n"; + $message.= "Pour suspendre temporairement cet email poubelle vous pouvez vous rendre sur le lien ci-dessou : \n"; + $message.= "\t * ".urlGen('dis',$lastId,$alias.'@'.$domain)."\n"; + $message.= "Pour supprimer cet email poubelle vous pouvez vous rendre sur le lien ci-dessou : \n"; + $message.= "\t * ".urlGen('del',$lastId,$alias.'@'.$domain)."\n"; + SendEmail($email,'Confirmation alias '.$alias,$message); echo '
Votre email ('.$email.') nous étant inconnu, une confirmation vous a été envoyé par email.
'; } } - } else if (isset($_REQUEST['del'])) { - if (preg_match('#\n'.$alias.'@'.DOMAIN.' '.$email.'#', file_get_contents(FICHIERALIAS)) || preg_match('#\n\#[0-9]+ '.$alias.'@'.DOMAIN.' '.$email.'#', file_get_contents(FICHIERALIAS))) { - SupprimerAlias($alias,$email); - echo '
Votre email poubelle '.$alias.'@'.DOMAIN.' est maintenant supprimé !
'; + // delete + } else if (isset($_POST['del'])) { + if ($id = $dbco->query("SELECT id FROM ".DBTABLEPREFIX."alias WHERE email = '".$email."' AND alias = '".$alias.'@'.$domain."'")->fetchColumn()) { + $message= "Confirmation de la création de votre redirection email poubelle : "; + $message= $alias.'@'.$domain.' => '.$email."\n"; + $message= "Cliquer sur le lien ci-dessous pour confirmer la suppression : \n"; + $message.= "\t * ".urlGen('del',$id,$alias.'@'.$domain)."\n\n"; + $message.= "Sinon pour suspendre temporairement cet email poubelle vous pouvez vous rendre sur le lien ci-dessou : \n"; + $message.= "\t * ".urlGen('dis',$id,$alias.'@'.$domain)."\n"; + SendEmail($email,'Suppression de l\'alias '.$alias,$message); + echo '
Un email de confirmation vient de vous être envoyé.
'; } else { - echo '
Erreur : l\'email poubelle n\'existe pas
'; + echo '
Erreur : impossible de trouver cet email poubelle
'; } + // disable + } else if (isset($_POST['dis'])) { + // @todo a faire + if ($return=DisableAlias($alias.'@'.$domain,$email)) { + echo '
Votre email poubelle '.$alias.'@'.$domain.' est maintenant suspendu !
'; + } else { + echo '
Erreur : '.$return.'
'; + } + } + if (isset($_POST['memory'])) { + setcookie ("email", $email, time() + 31536000); + } else if (isset($_COOKIE['email'])) { + unset($_COOKIE['email']); } } // Close connexion DB -if (BACKEND == DB) { - $dbco = null; -} +$dbco = null; + ////////////////// // Printing form ////////////////// + ?> +
- - @ -
- - -
- ou - la redirection poubelle +
+ + id="input-email" size="24" border="0" onkeyup="printForm()" onchange="printForm()" /> + + /> Mémoriser +
+
+ + @'; + } else { + echo ''; + } + ?> + +
+
+ + +
+
+ - + - + +
+

Version - Créé par David Mercereau sous licence GNU GPL v3

Télécharger et utiliser ce script sur le site du projet emailPoubelle.php

diff --git a/index.php b/index.php index 680e604..32be2e9 100755 --- a/index.php +++ b/index.php @@ -21,7 +21,7 @@

Emails poubelle libre

-

Générer des emails poubelle sans contrainte de durée de vie.

+

Générer des emails poubelle sans contrainte de durée de vie.