Mise à jour de debian Wheezy

Lors d’un simple apt-get update de ma debian wheezy j’ai eu un soucis de clef et donc ça n’a pas été. Heureusement d’autres ont eu le même problème.

La solution rapide a été l’installation d’un paquet de clefs :

apt-get install debian-archive-keyring

Il suffit de refaire l’update puis l’ugrade et c’est parti.

Pour ceux que ça intéresse de passer sous Jessie, quelqu’un a écrit un très bon tuto.

Badawok 7.x ne meurt jamais

Pourquoi diable un article sur Badawok 7.x ? Car en fait je l’utilise encore et continue de faire progresser sa branche, même si la 8 a été démarrée. D’un côté car il est en prod et qu’il faut suivre parfois les petits couacs potentiels, et puis, surtout, car je développe un nouveau site client, et donc, avec une version stable et pas en dev, comme je peux me le permettre avec Comitards.

Que dire ? Plein de trucs !

Depuis le début de la 7, une page peut prévoir des remplacements, textes pour 99% de l’utilisation mais également d’insertion de module, via les accolades ( {class:method|params|...} ). Une erreur a été corrigée au niveau de la détection des params, jamais utilisé jusqu’ici, et très fortement utilisé dans mon projet actuel. Quatre ans plus tard, une fonctionnalité voit son plein potentiel, et ça fait plaisir !

De même, une bonne surprise de conception, l’ordre des étapes de rendu permet de passer des arguments via PHP : {class:method|params|<?php echo $maVar ?>}.

Ainsi une problématique récurrente a pu trouver une nouvelle solution : la traduction de données.

Le système de langue étant dynamique, le nombre de langue varie et la maintenance de formulaires est pénible, coté front et coté code avec les checks etc. On découpe tout ça autrement.

Brutalement on imagine une table avec un seul id, mettez ce que vous voulez comme champs, excepté du texte. Coté formulaire vous ne vous occupez que de vos champs et vous insérez là où vous voulez l’appel au système de traduction ({trad:displayOne|params}) les params pouvant définir, dans un ordre définis, l’id du champs, son maxlength, etc. Je vous passe les détails.

Dynamiquement le formulaire sera complété de vos champs et ceux-ci seront pré-rempli si existant. Côté back, 2 méthodes, une de check des required et langue par défaut et une de sauvegarde multi-lingue.

Maintenance plus aisée, tant pour l’utilisateur que le développeur 🙂 !

Avec le même système d’insertion de module, et sur retour d’expérience du site terragusto.be, où la colonne de gauche devait être préparée par chaque action, ici notre menu/sous-menu principal est composé de 3 insertions, un par menu. Ainsi on ne met pas de code dans le layout non nécessaire et le rendu de manière centralisée avec les appels préparatoires qui vont bien et toujours les ACL qui vont avec.

Encore un autre usage et amélioration, la barre d’admin, d’habitude dans le layout sur condition ACL (Access Control List) et ici en centralisé avec config pour le global et la possibilité à chaque action de déclarer un menu potentiel, dont l’ACL activera ou pas l’affichage.

Enfin, un système de message d’erreur ou confirmation centralisé, inspiré de l’univers ZF. On envoie le message, on le configure pour son apparence et hop, le prochain affichage possible les affichera selon le template défini.

Cette version a encore du poil de la bête et n’a pas encore tout donné, c’est un plaisir personnel de voir son propre framework capable et fonctionnel :).

Nabaztag:tag sur Raspberry B r2

Le 13 janvier 2009 Fozzgog est arrivé, non sans mal. Et quelques années plus tard il se tût… Violet ayant fait faillite, racheté, re-faillite, abandonné et la communauté à réussi à obtenir les codes sources et le domaine nabaztag.com.

Je vous passes les détails de l’histoire, c’est long et internet en est gorgé. La question est, après autant de temps, puis-je encore le faire fonctionner comme « avant » ou presque ?

La réponse est « oui » !

En cherchant je suis tombé sur le tuto de Pierre Dandumont utilisant OpenJabNab avec l’aide de la communauté. L’article est déjà vieux et n’est plus tout à fait à jour, j’ai du bricoler un peu, d’où cet article pour en faire la mise à jour.

Je vais essentiellement reprendre ses étapes et retirer/ajouter la différence. Principalement je ne suis pas sous mac et n’utiliserais pas le service Bonjour. L’OS de base n’est plus tout à fait le même non plus.

Mon idée est de pouvoir promener mon lapin chez moi et en dehors moyennant une prise de courant. Il est quand même la mascotte de la Famille du Band Bleu 🙂

Mon matos :

  • Un Raspberry B (r2), alim etc.
  • Carte SD 4Go
  • Mon Nabaztag:tag, alim etc
  • Un routeur WI-FI
  • Clavier, souris, écran HDMI (ou adaptateur etc. dans mon cas)

Sur la carte SD j’ai mis une version de Raspian Jessie Lite, pour n’avoir que le nécessaire et sans interface graphique. J’ai essayé Noobs mais sur la 4Go, la mise à jour n’avait pas assez de place. Après de toute façon il ne nous faut que de la console :).

J’ai utilisé win32diskimager pour mettre l’image sur ma carte SD.

On branche et on allume. Oubliez pas que le login/pw de base sont pi/raspberry.

IMG_20160201_204545

Config de base

Un fois connectez on va mettre les bonne conditions de départ, tapez sudo raspi-config, vous aurez un bel écran d’interface avec un tas d’options :).

Activez SSH s’il ne l’est pas, réglez votre langue et étendez le file system à toute la carte. Dans notre cas on est déjà console, pas besoin de désactiver l’interface graphique au boot. Mais vous pouvez régler la mémoire vidéo à 16Mo.

Dans les options avancées il y a aussi hostname, ne l’oubliez pas, donnez un nom à votre terrier :). Ça évite de toucher aux fichiers (hosts, hostname) manuellement par la suite.

Là normalement vous pouvez ping, mais non ! Dans cette version il y a une erreur connue. Vous devrez d’abord exécuter : sudo chmod u+s /bin/ping .

Ensuite tentez un ping vers ce que vous voulez pour vérifier votre connexion réseau.

Maintenant qu’on a du réseau on met à jour.

sudo apt-get update
sudo apt-get upgrade

IMG_20160202_210457

Ensuite on fixe son IP. Dans mon projet de promener l’installation ça a d’autant plus d’importance.

sudo nano /etc/network/interfaces

Mon réseau est en 192.168.1.x, vous devrez adapter les configs selon votre cas. Vous devez modifier la ligne iface eth0 inet dhcp en :

auto eth0
iface eth0 inet static
address 192.168.1.150
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
dns-nameservers 192.168.1.150

On sudo reboot, on débranche clavier souris etc, on laisse juste alim et réseau. On retourne a son bureau, on s’installe confortablement, on prend putty et on se connecte :

ssh pi@192.168.1.150

Serveur DNS

Comme le dit le tuto de Pierre, le truc chiant c’est que le lapin a besoin d’un nom de domaine pour se connecter au serveur. Donc il nous faut notre propre serveur DNS local.

sudo apt-get install bind9
sudo /etc/init.d/bind9 start

C’est parti pour plein de config. Perso j’ai eu du mal sur cette partie du fait des mises en pages des contenus. Pour infos je me suis basé sur mes configs de domaines, le tuto de Pierre et une doc.

On va créer notre nom de domaine : terrier.loc avec son sous domaine ojn.terrier.loc .

sudo nano /etc/bind/named.conf.local

Attention la deuxième partie est l’envers de notre réseau.

zone "terrier.loc" {
  type master;
  file "/etc/bind/db.terrier.loc";
};

zone "1.168.192.in-addr.arpa" {
  type master;
  file "/etc/bind/db.192.168.1.inv";
};

Maintenant il nous faut les 2 fichiers précisés.

sudo nano /etc/bind/db.terrier.loc
$TTL 604800
@ IN SOA ojn.terrier.loc. root.terrier.loc. (
  1 ; serial
  604800 ; refresh
  86400 ; retry
  2419200 ; expire
  604800 ) ; negative cache TTL
;
@ IN NS ojn.terrier.loc.
@ IN A 192.168.1.150
;
ojn IN A 192.168.1.150
;192.168.1.150 IN A 192.168.1.150

Et l’autre.

sudo nano /etc/bind/db.192.168.1.inv
$TTL 604800
@ IN SOA ojn.terrier.loc. root.localhost. (
  2 ; serial
  604800 ; refresh
  86400 ; retry
  2419200 ; expire
  604800 ) ; negative cache TTL
;
        NS ojn.terrier.loc.
150     PTR ojn.terrier.loc.

Maintenant il faut dire au Rasp de l’utiliser.

sudo nano /etc/resolv.conf
# Generated by resolvconf
domain home
nameserver 192.168.1.1
nameserver 192.168.1.150

Particularités ici, si vous avez un soucis d’accès lors de test du domaine, commenté la 1.1. Si vous rebootez elle sera décommentée.

Enfin, on active le serveur de cache pour accéder au net. On décommente la partie forwarders et on met l’ip de la passerelle.

sudo nano /etc/bind/named.conf.options
options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        forwarders {
                192.168.1.1;
        };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        auth-nxdomain no;    # conform to RFC1035
        listen-on-v6 { any; };
};

Redémarrez et testez, ping google.com, ping ojn.terrier.loc. Cf. ma remarque d’avant avec les ligne nameserver.

Vous pouvez également tester depuis votre poste en modifiant votre connexion réseau et en précisant le serveur DNS à 192.168.1.150.

dns-win

Le serveur

On y est, on va mettre le serveur en place et on va utiliser un Apache, comme dit Pierre, il y aura pas des milliers de lapins.

sudo apt-get install apache2 php5 libapache2-mod-php5
sudo /bin/hostname -F /etc/hostname
sudo a2enmod rewrite
sudo /etc/init.d/apache2 restart

Ensuite OpenJabNab, il nous faudra Git.

sudo apt-get install git
cd /var/www
sudo git clone https://github.com/OpenJabNab/OpenJabNab.git

Et c’est reparti pour un peu de config.

sudo nano /etc/apache2/sites-available/000-default.conf

Là aussi j’ai du adapter la conf directement dans le default. j’ai retiré les commentaires.

<VirtualHost *:80>
        DocumentRoot /var/www/OpenJabNab/http-wrapper

        <Directory /var/www/OpenJabNab/http-wrapper>
                Options -Indexes +FollowSymLinks
                AllowOverride All
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

default est déjà actif par défaut, un simple apache restart devrait suffire, sinon comme le tuto de Pierre :

sudo a2dissite default
sudo a2ensite default
sudo /etc/init.d/apache2 restart

Tapez l’ip de votre OJN (dans mon cas 192.168.1.150) pour y accéder. Vous devriez avoir le message « Problem with OpenJabNab ! » signe que tout va bien 🙂 Si vous avez une page d’index c’est que votre mod rewrite n’est pas activé.

Maintenant c’est compilation ! Yeah 🙂

sudo apt-get install qt4-qmake qt4-qtconfig qt4-designer qt4-dev-tools libqwt5-qt4-dev build-essential
cd /var/www/OpenJabNab/server
sudo qmake -r
sudo make

On configure, encore et toujours 🙂

sudo cp openjabnab.ini-dist bin/openjabnab.ini
sudo nano bin/openjabnab.ini
[Config]
httpListener = true
httpApi = true
httpVioletApi = true
xmppListener = true
RealHttpRoot = /var/www/OpenJabNab/http-wrapper/ojn_local/
HttpRoot = ojn_local
HttpPluginsFolder = plugins
StandAloneAuthBypass = true
AllowAnonymousRegistration=true
AllowUserManageBunny=true
AllowUserManageZtamp=true
SessionTimeout=300
TTS=acapela
MaxNumberOfBunnies=64
MaxBurstNumberOfBunnies=72

[OpenJabNabServers]
PingServer=ojn.terrier.loc
BroadServer=ojn.terrier.loc
XmppServer=ojn.terrier.loc
ListeningHttpPort=8080
ListeningXmppPort=5222

[Log]
LogFile=openjabnab.log
LogFileLevel=Debug
LogScreenLevel=Warning
DisplayCronLog=false

On change le RealHttpRoot, on met true à StandAloneAuthBypass et les 3 suivants, on change my.domain.com en ojn.terrier.loc.

Au tour des plugins :

sudo nano bin/plugins/plugin_auth.ini
[global]
authMethod=full

On donne les accès en écriture :

sudo chmod 777 /var/www/OpenJabNab/http-wrapper/ojn_admin/include

On ajoute les voix et humeurs :

cd /var/www/OpenJabNab/http-wrapper/ojn_local/plugins/
sudo wget http://down.dandu.be/nabaz-lang-mp3-fr.tar.gz
sudo wget http://down.dandu.be/nabaz-ojn-mp3-fr.tar.gz
sudo tar xvfz nabaz-lang-mp3-fr.tar.gz
sudo tar xvfz nabaz-ojn-mp3-fr.tar.gz

Et on lance !

sudo ./bin/openjabnab

Techniquement ça devrait démarrer sans erreur. Du coup on va dans l’admin du terrier 192.168.1.150/ojn_admin.

terrierloc-01En bas de page on peut voir les infos, ce qui montre ce qui a été chargé, preuve que ça fonctionne.

Il vous faudra créer un compte, le premier sera mit en admin automatiquement.

Le lapin

Ensuite il faut ajouter le lapin, dans account, donnez lui un nom en suivant les contraintes et entrez sa mac.

Prenez votre lapin, allumez le en appuyant sur son bouton de tête, il devient bleu. Connectez vous à son Wi-Fi et rendez-vous sur son ip 192.168.0.1.

IMG-20160203-WA0072

Le lapin a du mal à se connecter en Wi-Fi (peut-être mon lapin), déjà le WPA il a du mal mais y arrive parfois (nabaztag:tag), le v1 lui ne sait faire que du WEP. Je n’ai pas envie de chipoter, j’ai un routeur, une connexion invisible, ça suffira, j’ai désactivé la sécurité. Faites en fonction de votre projet et de votre lapin !

Dans la config avancée, désactivez le DHCP, donnez lui une IP fixe (192.168.1.151) ensuite renseignez le serveur ojn.terrier.loc/vl.

On sauve, le lapin redémarre et si tout va bien ça s’allume ! Le lapin bouge les oreilles et vous sautez dans tous les sens, votre lapin se reconnecte !

IMG-20160203-WA0070

Lancement automatique

J’ai essayé en vain la solution du daemon. Je n’ai peut-être pas trouvé de solution suffisamment à jour. J’ai donc utilisé la solution barbare mais fonctionnelle de Pierre :

sudo nano /etc/rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

sudo /var/www/OpenJabNab/server/bin/openjabnab

exit 0

Le lien déjà mentionné de la doc en parle.

Fin

IMG_20160203_173847

Fozzgog est prêt à reconquérir le monde… ou pas 🙂

Dans les possibilités de suites, car OJN ne gère pas/plus les chorégraphies ça serait de développer le plugin le permettant, tout à l’air d’être à disposition pour y arriver. Il n’y a quasi pas de doc donc ça sera empirique mais pourquoi pas essayer.

En local TTS et Taïchi fonctionnent bien. L’API pour le coucher, lever, TTS aussi. C’est déjà une bonne base pour redévelopper avec. Reste à voir si il peut le faire en autonomie.

Affaire à suivre 🙂

IE10:page-break-inside vs print

J’ai développé une application web de gestion des évaluations du personnel. Ceux-ci impriment leur évaluation, et dans toutes grandes entreprises, il n’y a pas un type de poste mais autant que d’employé 🙂 , surtout quand ils accèdent depuis l’extérieur.

J’ai opté pour Bootstrap sur un Zend Framework 2 et une impression naturelle de la page web plutôt que de générer un PDF. Pourquoi faire 2 fois le travail quand il suffit d’un peu de CSS :).

C’est là qu’on me dit que rien ne va quand on imprime, que le nombre de pages est infini, etc. L’utilisateur dans sa splendeur 🙂 rien ne va mais tout va SAUF l’impression sous Windows 8.0 et IE10.

Après une recherche dichotomique pour isoler le méchant code, voici le meurtrieur de navigateur avec sa solution, hop tout en un.

.container .tab-pane {
    page-break-after: always;
    page-break-inside: avoid;
}
.ie10 .container .tab-pane {
    page-break-inside: auto;
}

Le page-break-inside, qui date de IE8 en terme de support, a une belle régression ici et ne s’y retrouve plus, générant ainsi une infinité de page, pète la mémoire et fin de l’histoire, ça ne sort jamais.

Il vous faudra également un petit JS trouvé sur le net qui aidera à la détection de IE10 qui ne peut plus se faire avec les commentaires conditionnés (<!–[if lt IE 9]><![endif]–>).

if (/*@cc_on!@*/false && document.documentMode === 10) {
    document.documentElement.className+=' ie10';
}

Source : http://www.impressivewebs.com/ie10-css-hacks/

Remettre la propriété en auto lui permettra de reprendre ses esprits et de faire son impression.

Nombre de Nim (nimber)

Une collègue m’a lancé un petit défis suite au travail de sa fille (future développeuse) : le jeu de Nim, dans sa version une grille, un puit et 4 pions. La partie défi résidait dans la question qui vise à calculer la valeur d’une cellule de la grille, le nimber, en donnant juste la colonne et la ligne en entrée.

$array = [];
define('N', 7); //Lignes
define('M', 10); //Colones

function getNim($x, $y) {
    return (((M - $x) % 3) ^ ((N - $y) % 3)) % 4;
}

//Remplir la grille
for ($y = 1; $y <= N; $y++) {
    $array[$y] = [];
    for ($x = 1; $x <= M; $x++) {
        $array[$y][$x] = getNim($x, $y);
    }
}

Le but étant d’obtenir une valeur sur base de coordonnées, la fonction passera par l’usage de $x et $y.

Ce jeu de Nim part de la dernière case inférieure droite (le puit) avec une valeur 0, on devra remonter d’où l’usage de la valeur max – index.

Comme la valeur de case ne peut avoir que comme valeurs possibles le nombre de cases où l’on peut se déplacer, dans le cas de l’énoncé, chaque pion peut se déplacer potentiellement dans maximum 4 cases. Nous aurons les valeurs [0, 3], le modulo (%) 4 nous y aidera (jouez avec le modulo).

Dernière astuce, le modèle (pattern) trouvé à la main, réside en un tableau de 3×3 se répétant indéfiniment. Ainsi, le modulo (%) 3 permettra cette répétition.

La partie complexe de ce calcul se trouve dans le rapport en x et y. Si on additionne x et y et qu’on applique le modulo 4 une partie des cellules seulement sont bonnes (une sur 2). Si on fait une soustraction, c’est l’inverse. Faire un + et un – en même temps c’est là que le xor est survenu (jouez donc avec le XOR).

Ainsi après une belle prise de tête empirique la solution est là 🙂 !

nimbers

[jQuery] Self clic & child force click

$('.category-blocs li').click(function(e){
    if (!$(e.target).is('a')) {
        $(this).find('a')[0].click();
    }
}).addClass('clickable');

L’idée est une liste avec du contenu, contenant un lien, et on veut que tout le <li> soit clickable. Hors on ne mettra pas des éléments bloc dans notre lien <a>.

Une solution javascript serait de dire au <li>, lors du click, de chercher l’enfant <a> (considéré seul ici, ou le premier trouvé) et de forcer le click de ce lien.

Too much recursion

Premier problème, ça boucle sur lui même et pète. Un effet de propagation (bubbling) que l’on échappe grâce à un test sur le target.

http://stackoverflow.com/questions/5967923/jquery-trigger-click-gives-too-much-recursion

Force click

Si vous targetez directement l’événement du lien comme ceci :

$(this).find('a').click();

cela ne donnera rien, vous devez prendre l’élément du DOM et non l’objet jQuery.

http://stackoverflow.com/questions/5838241/jquery-force-click-href

OVH, GMail et l’envoie de mail

Prenons le cas où vous avez votre domaine, vous configurez un compte mail et le raccordez à un compte GMail pour plus de facilité. Classique.

D’un autre côté vous avez votre serveur et vous envoyez des mails avec le même compte mail.

Et bim, vous voilà avec un compte bloqué !

OVH sécurise vos comptes mails en surveillant la provenance de connexion. GMail est en Amérique et votre VPS (par exemple) en France, du coup, en même temps vous êtes connecté à 2 endroits = piratage de compte détecté.

Une fois que ça vous arrive, ils vous suffit de déclarer un incident chez OVH et de leur expliquer la situation. Ainsi, plus de soucis.

Évidemment, cela n’arrive que dans le cas où votre GMail rapatrie ou envoie des mails pendant que votre serveur effectue également un envoie de mail. Mais c’est toujours bon à savoir.

Notez que pour débloquer votre compte il vous faudra vous rendre dans votre manager et saisir un nouveau mot de passe (ou le même). 5 à 10 minutes plus tard le statu sera revenu à la normal.

Curl, PHP et Synchrone

Contexte

Dans un projet d’assemblage de PDF (j’en parlerai surement dans un autre article) je devais pouvoir envoyer différentes pages et une structure pour établir une table des matières. Je pensais mettre à jour la structure à chaque envoie mais le résultat obtenu n’était pas celui attendu, il me manquait des choses. Je recevais bien toutes les données, le curl fonctionnait bien, mais la structure était incorrecte.

Après analyse de mon code, remise en question etc, il s’avère que c’est au niveau du curl que ça coince. En effet, faite une vingtaine de call curl à la chaîne avec transfert de fichier à taille variable et vous comprendrez que c’est entré en conflit. Droit d’écriture sur le fichier ? Verrou de fichier ? Rien n’y fait.

Un call curl (méthode PHP et consort) n’est juste pas bloquant dans la complétion de son action.

Pensez autrement

Oui, au final, vous devrez revoir votre manière de vous y prendre, l’idée a été d’envoyer les fichiers, sans se soucier de la structure, de la maintenir coté client et de l’envoyer par une méthode supplémentaire du service avant d’appeler la génération finale. Le projet reste le même, juste le quand on reçoit l’info.

PHPMailer sur OVH en SMTP/POP3

Suite au fait que les emails envoyés par certains de mes sites ne sont plus reçus, j’ai cherché et trouvé une solution qui fonctionne conformément à mes attentes.

Contexte : VPS sur OVH, domaine OVH qui pointe vers ce VPS.

Première chose, j’utilisais déjà PHPMailer, une version précédente et domaine configuré pour SPF et DKIM. Donc mise à jour vers la source github de PHPMailer.

OVH n’est pas clair dans sa documentation quand vous en trouvez une qui est cohérente avec le reste et à jour. Basez vous sur le mail reçus lorsque vous créez votre compte. Le mail vous donne les ports et adresses à utiliser ainsi que l’indication très importante : connexion POP3 avant SMTP.

Par bonheur, la doc de PHPMailer fourni un exemple complet en ce sens.

//Authenticate via POP3.
//After this you should be allowed to submit messages over SMTP for a while.
//Only applies if your host supports POP-before-SMTP.
$pop = POP3::popBeforeSmtp('pop3.example.com', 110, 30, 'username', 'password', 1);

//Create a new PHPMailer instance
//Passing true to the constructor enables the use of exceptions for error handling
$mail = new PHPMailer(true);
try {
    $mail->isSMTP();
    //Enable SMTP debugging
    // 0 = off (for production use)
    // 1 = client messages
    // 2 = client and server messages
    $mail->SMTPDebug = 2;
    //Ask for HTML-friendly debug output
    $mail->Debugoutput = 'html';
    //Set the hostname of the mail server
    $mail->Host = "mail.example.com";
    //Set the SMTP port number - likely to be 25, 465 or 587
    $mail->Port = 25;
    //Whether to use SMTP authentication
    $mail->SMTPAuth = false;
    //Set who the message is to be sent from
    $mail->setFrom('from@example.com', 'First Last');
    //Set an alternative reply-to address
    $mail->addReplyTo('replyto@example.com', 'First Last');
    //Set who the message is to be sent to
    $mail->addAddress('whoto@example.com', 'John Doe');
    //Set the subject line
    $mail->Subject = 'PHPMailer POP-before-SMTP test';
    //Read an HTML message body from an external file, convert referenced images to embedded,
    //and convert the HTML into a basic plain-text alternative body
    $mail->msgHTML(file_get_contents('contents.html'), dirname(__FILE__));
    //Replace the plain text body with one created manually
    $mail->AltBody = 'This is a plain-text message body';
    //Attach an image file
    $mail->addAttachment('images/phpmailer_mini.png');
    //send the message
    //Note that we don't need check the response from this because it will throw an exception if it has trouble
    $mail->send();
    echo "Message sent!";
} catch (phpmailerException $e) {
    echo $e->errorMessage(); //Pretty error messages from PHPMailer
} catch (Exception $e) {
    echo $e->getMessage(); //Boring error messages from anything else!
}

Il vous suffit de mettre les valeurs qui vous sont transmise et … ça n’ira pas encore.

Il va vous falloir vous connecter également à SMTP.

//Whether to use SMTP authentication
$mail->SMTPAuth = true;
//Username to use for SMTP authentication
$mail->Username = "yourname@example.com";
//Password to use for SMTP authentication
$mail->Password = "yourpassword";

Il vous suffit de modifier SMTPAuth de false à true et d’ajouter les 2 lignes et c’est fini !

Badawok

Note à ceux qui utilisent le framework badawok (v7 dans mon cas), vous aurez un conflit entre votre classe mailer et base_mailer car badawok utilise déjà un PHPMailer.

Supprimez l’extend de la classe base_mailer et ajouter les require_once des classes : phpmailer, smtp et pop3. Créez un répertoire vendor dans votre projet pour y mettre proprement les 3 classes de PHPMailer et le tour sera facilement joué.

La v7 étant uniquement patchée pour le moment, cette modification ne sera pas répercutée.