E-mail en PHP – Accents dans les sujets

Problème : Transmettre les accents dans les sujets d’e-mail via la fonction mail() de PHP.

Une solution apparemment efficace ici : http://pilgrim.maleo.net/2008/02/fonction-mail-envoyer-un-sujet-avec-des-accents

Extrait :

[…]

// Message
$recipient = 'you@example.com';
$subject = '=?UTF-8?B?'.base64_encode('Sujet : éèàïî').'?=';
$sender = '"=?UTF-8?B?'.base64_encode('Nom : éèàïî').'?=" <me@example.com>';
$body = 'Corps du message avec des accents aussi : éèàïî';

// Entêtes du message
$headers = array();
$headers[] = 'From: '.$sender;
$headers[] = 'Content-Type: text/plain; charset=UTF-8; format=flowed;';
$headers[] = 'MIME-Version: 1.0';
$headers[] = 'Content-Transfer-Encoding: 8bit';
$headers = join("\n", $headers);

// Envoi du mail
mail($recipient, $subject, $body, $headers);

« Ce code utilise l’UTF-8, c’est l’encodage par défaut de tout mon code en général que ca soit pour les fichiers, la base de données ou le « Content-Type » envoyé au navigateur. L’UTF-8 permet de faire des applications qui acceptent et utilisent n’importe quel caractère de n’importe quelle langue et sera en plus l’encodage par défaut pour le PHP6 à venir ce qui est une bonne chose.

Bien sûr, il faut mettre dans dans une fonction pour une meilleure factorisation, si je laisse ce code tel quel, c’est pour mieux en comprendre le mécanisme. Une visite de la documentation de la fonction mail() et des commentaires associés apportent de meilleures solutions. On y voit par exemple l’utilisation d’un code tel que celui-ci :

$subject= mb_encode_mimeheader($subject,"UTF-8", "B", "\n");

Je n’ai pas poussé mes investigations plus loin à ce niveau mais la lecture de la documentation de la fonction mb_encode_mimeheader() ne pourrait être que bénéfique. […] »

Importer WordPress sur des pages externes

Source : http://vogsphere.fr/importer-wordpress-sur-des-pages-externes/

Pour utiliser une installation WordPress sur une page externe, il faut importer les fichiers suivants :

wp-config.php, wp-load.php, wp-db.php (voir détails sur page source en référence).

Par exemple, pour récuprérer l’url du site WordPress dans une page test.php à la racine du site et ne faisant pas partie de l’installation WordPress, on écrira en tête du fichier :

<?php
define('WP_USE_THEMES', false);
include_once('wp-config.php');
include_once('wp-load.php');
include_once('wp-includes/wp-db.php');

$accueil =  home_url( '/' );
?>

Restriction d’accès simple en PHP

d’après la source : forum.pluxml.org/viewtopic.php?id=1873

<?php
if ( !isset($_SERVER['PHP_AUTH_USER'])
	|| !isset($_SERVER['PHP_AUTH_PW'])
	|| ($_SERVER['PHP_AUTH_USER'] !== 'toto' )
	|| ($_SERVER['PHP_AUTH_PW'] !== 'passe') )
{
	header('WWW-Authenticate: Basic realm="Identification :"');
	header('HTTP/1.0 401 Unauthorized');
	echo '<html><head>';
	echo '<title>Acc&egrave;s Refus&eacute</title></head><body>';
	echo '<h1>Acc&egrave;s Refus&eacute</h1>';
	echo '</body>';
	exit;
}
?>

voir aussi : php.net/manual/fr/features.http-auth.php

Rechercher – remplacer dans une base MySQL

La syntaxe est de la forme :

UPDATE table SET colonne_de_la_table = replace(colonne_de_la_table,'texte_à_remplacer','texte_de_remplacement');

Exemple :

UPDATE wp_links SET link_name = replace(link_name,'Documentation','Références');

Note : c’est un « rechercher-remplacer » systématique (i.e. toutes les occurrences du terme à remplacer seront traitées dans la table visée, pour toutes les entrées de la table).

REGEXP – Expression régulière pour les requêtes SQL

Avec REGEXP, il est possible de rechercher un terme ou une chaîne particulière à l’intérieur d’un champ d’une base MySQL, selon les méthodes des expressions régulières.

Exemple :

mysql_query("SELECT * FROM table WHERE champ1 REGEXP 'bout'");

La chaîne de caractères « bout » est recherchée à l’intérieur du champ « champ1 ».

Voir aussi cette page : http://blogs.developpeur.org/poppyto/archive/2005/11/15/14581.aspx

Voir aussi :

Guillemets simples ou doubles (' ou ")

Avec des guillemets simples pour echo, la chaîne de caractères est transcrite telle quelle, alors qu’avec des guillemets doubles, les variables ou des caractères spéciaux (ex. caractère d’échappement) peuvent être interprétés.

Exemple :

<?php
$a = 'test';
echo '<p>$a\n</p>'; // exemple 1
echo "<p>\n$a\n</p>"; // exemple 2
?>

« exemple 1 » écrira :
<p>$a\n</p>

« exemple 2 » écrira :
<p>
test
</p>

E-mail « multi-part » (texte + html)

Le script ci-dessous envoie un e-mail « multi-part » (texte + html) : selon le logiciel de messagerie et/ou les réglages de l’utilisateur, le contenu de l’un ou l’autre format est affiché.
Pour la gestion de newsletter, voir aussi wanewsletter.

Une autre source pour les mails multipart en php : www.vulgarisation-informatique.com/mail.php.

<?php
$destinataire = "destinataire@exemple.com";
$sujet = "Le sujet";
$messtxt = "message format texte";
$messhtml = "<html>code source html... </html>";
$from = "moi@exemple.com";

$boundary = "_parties_".md5 (uniqid (rand())); // génération d'une limite (boundary)
$limite = "--" . $boundary; // les parties du message ne sont reconnues que si le délimiteur (boundary) est précédé de 2 tirets

$entete = "Reply-to: $from\n";
$entete .= "From:$from\n";
$entete .= "Date: ".date("l j F Y, G:i")."\n";
$entete .= "MIME-Version: 1.0\n";
$entete .= "Content-Type: multipart/alternative;\n";
$entete .= "    boundary=\"$boundary\"\n\n"; // une tabulation (ou une espace) est indispensable ici avant "boundary" !

$corps = "This is a multi-part message in MIME format.\n";
$corps .= "Ceci est un message \"multi-part\" au format MIME.\n\n";

//Le message en texte simple pour les navigateurs qui n'acceptent pas le HTML
$corps .= "$limite\n";
$corps .= "Content-Type: text/plain; charset=\"ISO-8859-1\"\n";
$corps .= "Content-Transfer-Encoding: 7bit\n\n";
$corps .= $messtxt;
$corps .= "\n\n";

//le message en html original
$corps .= "$limite\n";
$corps .= "Content-Type: text/html; charset=\"ISO-8859-1\"\n";
$corps .= "Content-Transfer-Encoding: 7bit\n\n";
$corps .= $messhtml;
$corps .= "\n\n$limite\n";

if(mail($destinataire,$sujet,$corps,$entete))
{
echo 'Le mail a été envoyé';
}
else
{
echo 'Le mail n\'a pu être envoyé';
}
?>

Pour upload de fichier par le web

La taille maximum autorisée pour uploader un fichier par le web varie en fonction de l’offre d’hébergement (ex. 2, 8 à 16 Mo chez OVH).
Pour connaître cette limite, créer un fichier php avec le code suivant :

<?php phpinfo(); ?>

Ouvrir le fichier avec le navigateur, et chercher la ligne : upload_max_filesize pour connaître la taille maximum.

Sélection d’entrées dans une table (requête SQL avec SELECT, FROM, WHERE…)

réf MySQL :
http://dev.mysql.com/doc/refman/5.0/fr/ix01.html

mysql_query("SELECT * FROM images WHERE type=’photo’ AND (ext=’jpg’ OR ext=’png’) OR type=’dessin’ ORDER BY date DESC LIMIT 0,10")

L’astérisque après SELECT indique « tous les champs ».

FROM précise la table dans la base sélectionnée au préalable (par « mysql_select_db »).

WHERE précise les valeurs à sélectionner dans un champ donné (valeur « photo » dans le champ « type »).

Opérateur logique AND : idem WHERE – ajoute un critère de recherche.

Opérateur logique OR : idem WHERE – critère de recherche alternatif.

Les parenthèses sont utiles pour grouper les valeurs recherchées en évitant des incohérences entres AND et OR

ORDER BY propose un classement selon un champ donnée (ex. ici par le champ « date »).

LIMIT suivi de 2 valeurs : première valeur indique la première entrée à sélectionner ; seconde valeur indique le nombre d’entrées à sélectionner.

Forcer le téléchargement

Forcer le téléchargement d’un fichier au clic, plutôt que son ouverture automatique dans le navigateur.

Exemple 1 :

référence : fr.openclassrooms.com/informatique/cours/…

Dans cet exemple, le fichier demandé est indiqué par un formulaire (transmission de la requête par méthode « post »).

Contenu du fichier de téléchargement que l’on nommera « telecharger.php » :

<?php
$erreur = "Votre requ&ecirc;te n'a pu aboutir ; veuillez v&eacute;rifier vos informations.";

if ($_POST) {
	if ($_POST['codeSecret']=="toto") {
		$chemin = realpath('toto.pdf');
	}
	else goto message;

	// Les données reçues sont un fichier à télécharger :
	header('Content-Description: File Transfer');
	header('Content-Type: application/octet-stream');
	// Trouve le nom du fichier à télécharger afin de nommer le fichier téléchargé :
	header('Content-Disposition: attachment; filename=' . basename($chemin));
	// Transfert en mode binaire - les données ne seront tansférées telles quelles (non interprétées) :
	header('Content-Transfer-Encoding: binary');
	// 3 lignes suivantes : pas de mise en cache
	header('Expires: 0');
	header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
	header('Pragma: public');
	// Trouve la taille du fichier : permet au navigateur de calculer le taux de chargement :
	header('Content-Length: ' . filesize($chemin));
	// Lit enfin le fichier :
	readfile($chemin);
	// On quitte afin d'éviter tout ajout de donnée risquant de corrompre le fichier :
	exit;
}
?>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>What Wonderful Wine</title>
</head>
<body>
<p><?php message: echo $erreur; ?></p>
</body>
</html>

Exemple de formulaire appelant le téléchargement de toto.pdf via le fichier « telecharger.php » :

<form action="telecharger.php" method="post">
<input type="hidden" name="codeSecret" value="toto" />
<button type="submit">Envoi Toto</button>
</form>

 

 

Exemple 2 : Par « QUERY_STRING »

Le lien d’appel du fichier (depuis n’importe quelle page du site autre que la page « appel.php ») doit être du type () :

<a href="appel.php?file=exemple.mp3">exemple.mp3</a>

En tête de la page « appel.php », avant le Doctype :

<?php
$file=$_GET['file'];

$taille=filesize("fichiers/$file");
header("Content-Type: application/force-download; name=\"$file\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: $taille");
header("Content-Disposition: attachment; filename=\"$file\"");
header("Expires: 0");
header("Cache-Control: no-cache, must-revalidate");
header("Pragma: no-cache");
readfile("fichiers/$file");
exit();
?>

Remarques :
– le chemin au fichier est ici précisé dans le script PHP (« exemple.mp3 » est dans le sous-dossier « fichiers »)

Changer la date de modification et de dernier accès d’un fichier

Source : http://fr.php.net/manual/fr/function.touch.php

bool touch ( string filename [, int time [, int atime]] )

touch() tente de forcer la date de modification du fichier désigné par le paramètre filename à la date de spécifiée par le paramètre time. Si time est omis, c’est l’heure courante qui est utilisée. Si le troisième paramètre time est fourni, il est utilisé comme date de dernier accès. Notez bien que la date de dernier accès est modifiée, quelque soit le nombre de paramètres.

Si le fichier n’existe pas, PHP tente de le créer. Cette fonction retourne TRUE en cas de succès, FALSE en cas d’échec.

AVERTISSEMENT : Il n’est pour le moment pas possible de changer la date de modification d’un dossier avec cette fonction sous Windows.

Exemple avec touch() :

<?php
if ( touch($NomDeFichier) ) {
echo "La date de modification de $NomDeFichier a été fixée à maintenant";
} else {
echo "Désolé, il est impossible de changer la date de modification de $NomDeFichier";
}
?>

Crypter (un mot de passe…)

Différentes méthodes : crypt() ; sha1() ; md5()

md5() est considérée la moins sûre et crypt() la plus sûre.

Syntaxe de crypt() :
crypt('chaine_a_crypter','clé');

La « clé » (ou « salt », « sel ») permet :

  1. d’obtenir chaque fois la même chaine de caractères résultante
  2. d’éviter les caractères spéciaux (autres que chiffres ou lettres)

E-mail avec pièce jointe

d’après www.phpcs.com/codes/ENVOI-MAIL-AVEC-PIECE-JOINTE_26501.aspx (+ exemple d’envoi de 2 pièces-jointes) :

<?php

// function mail_attachement($to , $sujet , $message , $fichier , $typemime , $nom , $reply , $from){
$to = "destinataire@domaine.tld";
$sujet = "test envoi pj";
$message = "un test";
$fichier = "test.jpg";
$typemime = "image/jpeg";
$nom = "test.jpg";
$reply = "expediteur@domaine.tld";
$from = "expediteur@domaine.tld";

$limite = "_parties_".md5(uniqid (rand()));

$mail_mime = "Date: ".date("l j F Y, G:i")."\n";
$mail_mime .= "MIME-Version: 1.0\n";
$mail_mime .= "Content-Type: multipart/mixed;\n";
$mail_mime .= " boundary=\"----=$limite\"\n\n";

// Le message en texte simple pour les navigateurs qui n acceptent pas le HTML
$texte = "This is a multi-part message in MIME format.\n";
$texte .= "Ceci est un message est au format MIME.\n";
$texte .= "------=$limite\n";
$texte .= "Content-Type: text/plain; charset=\"iso-8859-1\"\n";
$texte .= "Content-Transfer-Encoding: 7bit\n\n";
$texte .= $message;
$texte .= "\n\n";

// le fichier
$attachement = "------=$limite\n";
$attachement .= "Content-Type: $typemime; name=\"$nom\"\n";
$attachement .= "Content-Transfer-Encoding: base64\n";
$attachement .= "Content-Disposition: attachment; filename=\"$nom\"\n\n";

$fd = fopen( $fichier, "r" );
$contenu = fread( $fd, filesize( $fichier ) );
fclose( $fd );
$attachement .= chunk_split(base64_encode($contenu));

$attachement .= "\n\n\n------=$limite\n";
// return mail($to, $sujet, $texte.$attachement, "Reply-to: $reply\nFrom: $from\n".$mail_mime);
mail($to, $sujet, $texte.$attachement, "Reply-to: $reply\nFrom: $from\n".$mail_mime);
// }

?>

Récupérer url et ses paramètres

Récupérer url et paramètres passés dans l’url (REQUEST_URI, QUERY_STRING…)

Pour récupérer l’url de la page :<?php echo $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>
<?php echo $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI']; ?>

Pour récupérer la chaîne de caractères (valeurs de variables…) passés dans l’url après le  » ? » : $_SERVER['QUERY_STRING'] :

exemple :

<?php
if ( ($_SERVER['QUERY_STRING']) == '' ) {
// si l'url ne contient aucun parametre (donnees apres un point d'interrogation),
// on fait une redirection :
header('Location: index.php?rubrique1');
}
?>

Redirection

<?php
if ( ($_SERVER['QUERY_STRING']) == '' ) {
// si l'url ne contient aucun parametre (donnees apres un point d'interrogation),
// on fait une redirection :
header('Location: index.php?rubrique1');
}
?>

La commande pour rediriger une url est simplement :

header('Location: chemin_souhaite')

header() doit être appelée avant que le moindre contenu ne soit envoyé, soit par des lignes HTML habituelles dans le fichier, soit par des affichages PHP.