Formulaire d'email, chroot et pelican

Mon blog tout fraichement migré sur pelican, il m'a fallu un formulaire d'email.

Le site étant dans un chroot, et ne souhaitant pas y installer sendmail, j'ai choisi d'utiliser la class Mail de PEAR.

Pour commencer, le formulaire de contact au format markdown.

Fichier /nyx_cx/content/pages/contact.md

Title: Nos coordonnées
Date: 1970-01-01
Category: nyx-network
Author: nyx-network
save_as: contact.html

<div class="contact">
<strong>Nyx-Network</strong><br />
182 rue Carnot<br />
30600 Vauvert, France<br />
<br />
<span class="fa fa-phone fa-center"></span>+33 972 448 899<br />
<span class="fa fa-mobile fa-center"></span>+33 649 982 278<br />
<br />
<h1 class="content-subhead">Contactez-nous par email</h1>
<form class="pure-form pure-form-stacked" action="/api/contact.php" method="post">
<fieldset class="pure-group">
<input type="text" name="firstname" id="firstname" placeholder="Prénom">
<input type="text" name="name" id="name" placeholder="Nom">
<input type="email" name="email" id="email" placeholder="Adresse email" required>
</fieldset>
<fieldset>
<input type="text" class="pure-input-1" name="subject" placeholder="Sujet">
<textarea class="pure-input-1" name="message" placeholder="Votre message ..."></textarea>
</fieldset>
<button type="submit" class="pure-button pure-button-primary">Envoyer</button>
</form>
</div>
<script>
if(window.location.href.indexOf("#confirm-true") != -1) alert("Votre message a été envoyé.");
if(window.location.href.indexOf("#confirm-false") != -1) alert("Une erreur est survenue.");
</script>

Et le code php pour envoyer l'email.

Fichier /nyx_cx/content/api/contact.php

<?php

  include("Mail.php");

  $params["host"] = "127.0.0.1";
  $params["port"] = "25";

  $name = (empty($_POST['name'])) ? "none" : utf8_decode($_POST['name']);
  $firstname = (empty($_POST['firstname'])) ? "none" : utf8_decode($_POST['firstname']);
  $email = (empty($_POST['email'])) ? "none" : utf8_decode($_POST['email']);
  $subject = (empty($_POST['subject'])) ? "Contact nyx.cx" : utf8_decode($_POST['subject']);
  $message = (empty($_POST['message'])) ? "none" : utf8_decode($_POST['message']);

  $recipients="none@none";
  $headers["To"]="\"none\" <none@none>";
  $headers["From"]="\"none\" <none@none>";
  $headers["Subject"]=$subject;

  $body="Nom : $name\nPrenom : $firstname\nEmail : $email\nSujet : $subject\nMessage : \n$message\n";

  if($email != "none") {
    $mail_object =& Mail::factory("smtp", $params);
    $mail = $mail_object->send($recipients, $headers, $body);

    if (PEAR::isError($mail)) { header('Location: /contact.html#confirm-false'); }
    else { header('Location: /contact.html#confirm-true'); }
  } 
  else { header('Location: /contact.html#confirm-false'); }

?>

Il vous faut rajouter la ligne suivante dans pelicanconf.py afin de ne pas parser le fichier contact.php lors du publish.

STATIC_PATHS = ['api']

Ainsi que mettre en place PEAR dans le chroot.

aptitude install php-mail
rsync -avHP --delete /usr/share/php/ /{chroot directory}/usr/share/php/

2 commentaire(s) pour Formulaire d'email, chroot et pelican

  • Avatar

    Nicolas K.

    C'est quand même dommage que ça nécessite du PHP, on perd un des intérêt du site statique. Visiblement il y a des solutions pour envoyer les mails via un service tiers, mais il faut avoir confiance dans ce service. formspree.io a l'air d'être sympa.

    • Avatar

      Nyx-Network

      Solution intéressante, il est également possible de chiffrer le message avec javascript avant l'envoi.


Laisser un commentaire