./119 >
./config/mail/newAccount.txt :
__SUBJECT__ Élections ED : inscription
Bonjour,
Vous avez été inscrit sur la liste de votes de l’ED.
Votre nom de connexion est votre présente adresse mail, à savoir « __USERNAME__ ».
Votre mot de passe est « __PASSWORD__ ».
Bon vote !
./includes/init/functions.inc.php (qui j’include au chargement de la page) :
function startsWith( $subject, $prefix ) {
return ( substr( $subject, 0, strlen( $prefix ) ) == $prefix ) ;
}
function removePrefix( $subject, $prefix ) {
return substr( $subject, strlen( $prefix ) ) ;
}
[…]
function sendMail( $address, $textFile, $parameters = array () ) {
$mailContents = file_get_contents( './config/mail/' . $textFile . '.txt') ;
$subjectLine = strtok( $mailContents, "\r\n" ) ;
$subject = ( startsWith( $subjectLine, '__SUBJECT__' ) ? trim( removePrefix( $subjectLine, '__SUBJECT__' ) ) : '' ) ;
$mailContents = trim( removePrefix( $mailContents, $subjectLine ) ) ;
foreach( $parameters as $token => $value ) {
$mailContents = str_replace( '__' . $token . '__', $value, $mailContents ) ;
}
return @mail( $address, $subject, $mailContents, 'From: ' . MAIL_FROM ) ;
}
Avec « @mail » qui devient « mail » le temps de mes tests, et MAIL_FROM étant un define() venant du fichier de conf’.
./includes/checks/admin/addElectors.inc.php (qui est utilisé quand l’admin ajoute une liste de mails de votants) :
[…]
$password = generatePassword( $elector ) ;
$parameters = array ( 'USERNAME' => $elector, 'PASSWORD' => $password ) ;
if ( sendMail( $elector, 'newAccount', $parameters ) ) {
@$sqlLink->query( 'INSERT INTO ' . ELECTORS_TABLE . ' ( mail, cryptedPwd ) VALUES ( \'' .
@$sqlLink->real_escape_string( $elector ) . '\', \'' . cryptPassword( $elector, $password ) . '\' ) ;' ) ;
} else {
$invalidElectors[] = $elector ;
}
unset( $password ) ;
unset( $parameters ) ;
[…]
(Le passage à la ligne dans le query() n’est pas dans mon code, c’est juste pour éviter que le [pre][/pre] fasse 10km de large
.)
La fonction generatePassword crée un pass de 11 caractères en fonction du nom d’utilisateur ($elector) et de l’heure courante (un nouveau pass chaque seconde
), donné en clair dans le mail, et cryptPassword($x,$y) fait en fait un sha1(strtolower($x).$y), donc pas besoin de real_escape_string() (et je préfère faire faire le SHA1 par PHP plutôt que par MySQL).
Les unset() sont là pour éviter que $password se balade ensuite dans la nature, même si je sais que je ne l’affiche pas plus tard (mais si quelqu’un adapte mon code, mieux vaut mettre une petite protection au cas où, ça ne mange pas de pain).
Tiens d’ailleurs, je viens à l’instant de me rendre compte qu’au lieu de créer un $parameters qui ne sert qu’une seule fois, je pouvais déclarer directement l’array dans les paramètres de sendMail().
Hop hop, je vais faire ça pour tous mes sendMail()
…
Edit
./120 > En gros, ton tra(), c’est le foreach() de mon sendMail()
, sauf que je ne gère pas le Locale.
Edit² : oui je sais, mon removePrefix() n’est pas safe, je devrais normalement faire d’abord un startsWith() pour être sûr que j’ai le droit d’enlever le préfixe.
Dans mon code, c’est inutile puisque je n’appelle removePrefix() qu’après avoir d’abord validé avec startsWith(), mais bon, comme ça a pour vocation d’être réutilisable, je vais ajouter le check kivabien…
Edit³ :
Godzil (./119) :
(moi ce qui me manque c'est le '%' de python sur les chaines cf le topic : topics/116046-formatage-equivalent-a-python )
Voilà, répondu en
version non-pavéesque .