Bonjour, (question de débutant) j'ai un fichier PHP sur Raspberry que je peux lancer via un script :
#!/bin/bash
# script de lancement du code php
echo "Execution de surveillance_donnees.php"
php -f surveillance_donnees.php
echo "c'est fait!"
ce fichier contient ceci :
<?php
$file = fopen("/home/pi/script/contenu_mail.ini", "a");
fwrite($file,"DEST=adresse mail du destinataire
SUBJECT=Alerte
TITLE=Alerte problème réception données ruche
TEXT=Salut,<br>Ici le raspberry. C'est la ruche n° donnees['id_ruche'] Il y a un problème de réception de données!
FILELIST=");
fclose($file); ?>
A la fin du fichier surveillance_donnees.php je souhaiterais (si c'est possible) exécuter un autre fichier PHP (nommé sendmail_simple.php)
j'ai réussi depuis le script en rajoutant la ligne suivante :
echo"on envoie le mail"
php -f /home/pi/script/sendmail_simple.php /home/pi/script/contenu_mail.ini
Mais j'aurais voulu savoir si et comment on pouvait directement dans surveillance_donnees.php lancer à la suite l'exécution du fichier sendmail_simple.php avec comme paramètre le fichier contenu_mail.ini (qui a été généré par surveillance_donnees.php)
Merci
- Edité par GillesMangin-Voirin 23 mai 2022 à 13:54:04
Ben sur celui -là je ne veux pas trop le faire le second code php (sendmail_simple.php) n'est pas de moi et est assez complexe, il gère l'envoi d'email avec phpmailer...
De plus j'ai essayé sans succès pour le moment de rajouter du code PHP a mon premier et cela ne tourne plus du tout (encore une fois je ne sais pas trop ou je merdois...). Rajout de code d'une requête pour déclencher l'envoie de l'email!
le code complet qui ne fonctionne pas est :
<?php
// ouverture base de données ruches
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
/* Connexion à une base MySQL avec l'invocation de pilote */
$dsn = 'mysql:dbname=ruches;host=127.0.0.1';
$user = 'abeille';
$password = 'password';
try {
$bdd = new PDO($dsn, $user, $password);
// Activation des erreurs PDO
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
$bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
echo 'Connexion échouée : ' . $e->getMessage();
}
// requête de surveillance
$reponse = $bdd->query("SELECT M1.id_ruche, MAX( M1.horodatage ) AS derniere_mesure FROM Telemesures_ruches M1 GROUP BY M1.id_ruche HAVING MAX( M1.horodatage ) < NOW() - INTERVAL 10 MINUTE ORDER BY M1.id_ruche");
$donnees = $reponse->fetch();
// création du fichier d'envoie d'email
$file = fopen("/home/pi/script/contenu_mail.ini", "a");
fwrite($file,"DEST=adresse mail du destinataire
SUBJECT=Alerte
TITLE=Alerte problème réception données ruche
TEXT=Salut,<br>Ici le raspberry. C'est la ruche n° $donnees['id_ruche'] Il y a un problème de réception de données!
FILELIST=");
fclose($file);
?>
Je ne sais même pas comment suivre le déroulement du code, puisque je le lance directement sur le Raspberry...
On peut supposer que pour lancer le programme sur le PI tu es connecté d'une manière ou d'une autre : console, ssh, cockpit, etc
Donc pour suivre le déroulement du programme, il te suffit de faire des instructions echo dans ton programme.
Tu peux aussi écrire dans un fichier de log soit en redirigeant la sortie standard soit écrire dans un fichier soit utiliser une bibliothèque de log comme monolog.
Bonjour, actuellement je lance "manuellement" le script qui lance PHP (via une demande d'exécution du script depuis le Raspberry) dans le futur une fois tout opérationnel c'est la crontab qui lancera la tache!
Pour ce qui est de faire de mon fichier sendmail_simple une fonction j'avoue ne pas du tout connaitre...
Comment doit-on procéder?
Merci
PS: j'ai modifié le titre qui du coup est un peu redondant avec le sous-titre...
Ben sur celui -là je ne veux pas trop le faire le second code php (sendmail_simple.php) n'est pas de moi et est assez complexe, il gère l'envoi d'email avec phpmailer...
Ton fichier sendmail recoit les donnees a envoyer par post/get ?
Sinon, si il faut inclure le code de sendmail comme l'a dit @monkey3d dans ton surveillance on pourrait avoir:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\OAuth;
use PHPMailer\PHPMailer\Exception;
/////
/////
$mail->isHTML(true);
$mail->setFrom($sender, $name);
$mail->addReplyTo($sender);
$mail->addAddress($receiver);
$mail->Subject = $subject;
$mail->Body = $msg;
//$mail->AltBody = $msg;
if (!$mail->send()) {
//echo 'Mailer Error: '.$mail->ErrorInfo;
}
// Puis ton code initial
$file = fopen("/home/pi/script/contenu_mail.ini", "a");
fwrite($file,"DEST=adresse mail du destinataire
SUBJECT=Alerte
TITLE=Alerte problème réception données ruche
TEXT=Salut, Ici le raspberry. C'est la ruche n° $donnees['id_ruche'] Il y a un problème de réception de données!
FILELIST=");
fclose($file);
GillesMangin-Voirin a écrit:
De plus j'ai essayé sans succès pour le moment de rajouter du code PHP a mon premier et cela ne tourne plus du tout (encore une fois je ne sais pas trop ou je merdois...). Rajout de code d'une requête pour déclencher l'envoie de l'email!
Je ne sais même pas comment suivre le déroulement du code, puisque je le lance directement sur le Raspberry...
Merci
A quel niveau as tu des erreurs ? Et pour suivre le deroulement, si echo affiche du texte quelque part, fais des die() un peu partout progressivement dans ton code pour voir ces messages.
GillesMangin-Voirin a écrit:
Pour ce qui est de faire de mon fichier sendmail_simple une fonction j'avoue ne pas du tout connaitre...
Comment doit-on procéder?
Merci
PS: j'ai modifié le titre qui du coup est un peu redondant avec le sous-titre...
Si ultérieurement ton script sera lancé par un crontab alors à mon sens le mieux est de créer un fichier et de mettre les traces dedans.
Le plus simple tu rediriges l'entrée standard et l'erreur dans le fichier dans ta commande de crontab ... ce qui nécessite quand même de mettre des traces dans tes fichiers actuels.
DEST=adresses mail des destinataires
SUBJECT=Alerte ruche 6
TITLE=Alerte problème réception données ruche
TEXT=Salut,<br>Ici le raspberry. <br>C'est la ruche n° 6 <br>Il y a un problème de réception de données.<br> Cela fait plus de 10 minutes qu'elle n'a rien émis!
FILELIST=
puis il supprime le fichier une fois lu et procède à l'envoi du mail!
voici le contenu de sendmail_simple :
<?php
#Reçoit en entrée un fichier contenant tout le nécessaire pour envoyer l'email sans accès à la base de données.
require_once ("./libmail.php");
function readparam($paramfile)
{
$result=new stdclass();
$result->DEST=array();
$result->SUBJECT="";
$result->TITLE="";
$result->TEXT="";
$result->ATTACHEMENTLIST=array();
$result->CR="0";
$result->MSG="";
if (!file_exists($paramfile))
{
$result->MSG="Fichier ".$paramfile." absent\r\n";
$result->CR=-1;
return $result;
}
$hdl=fopen($paramfile,"r");
if (!$hdl)
{
$result->MSG="Fichier ".$paramfile." impossible à ouvrir\r\n";
$result->CR=-2;
return $result;
}
$d=""; //DESTINATAIRES//
$listefile=""; //LISTE PJ//
while (($line = fgets($hdl)) !== false)
{
$line = str_replace(array("\r", "\n"), '', $line);
$t=explode("=",$line);
if (count($t)>=2)
{
$varname=strtoupper($t[0]);
//parce que la valeur peut contenir des =
array_shift($t);
$varval=trim(implode("=",$t));
if ($varname=="DEST") $d=$varval;
elseif ($varname=="SUBJECT") $result->SUBJECT=$varval;
elseif ($varname=="TEXT") $result->TEXT=$varval;
elseif ($varname=="FILELIST") $listefile=$varval;
}
}
fclose($hdl);
$i=0;
$td=explode(",",$d);
foreach($td as $bcc)
{
if (filter_var($bcc, FILTER_VALIDATE_EMAIL) === false) { $bcc=""; }
if ($bcc!="")
{
if (!in_array($bcc,$result->DEST)) $result->DEST[$i]=$bcc; $i++;
}
}
/*****************************/
$tf=explode("|",$listefile);
$i=0;
foreach($tf as $fic)
{
if (file_exists($fic) === false) { $fic=""; }
if ($fic!="")
{
if (!in_array($fic,$result->ATTACHEMENTLIST)) $result->ATTACHEMENTLIST[$i]=$fic; $i++;
}
}
/*****************************/
if (($listefile!="") and (count($result->ATTACHEMENTLIST)==0))
{
$result->MSG=$listefile." ne contient pas de fichiers existant !\n";
$result->CR=-2;
return $result;
}
if (count($result->DEST)==0)
{
$result->MSG="DEST ne contient aucune adresse email valide\n";
$result->CR=-2;
return $result;
}
elseif ($result->SUBJECT=="")
{
$result->MSG="SUBJECT vide\n";
$result->CR=-2;
return $result;
}
elseif ($result->TEXT=="")
{
$result->MSG="Texte vide\n";
$result->CR=-2;
return $result;
}
return $result;
}
$SMTPSERVER="smtp.gmail.com";
$SMTPPORT="587";
$SMTPUSER="mon adresse mail";
$SMTPPASS="kmon mot de passe";
$SMTPAUTH="y"; // ou n
$SMTPSECURE="tls"; // ou tls ou vide
$ACUSERECEPTION="N"; // ou Y
$DESTLIST=array();
$COPYLIST=array();
$FROM="mail expéditeur";
$msg="";
$infile="";
if (($msg=="") and (!isset($argv[1]))) $msg="Absence du nom du fichier a traiter";
else $infile=$argv[1];
if (($msg=="") and (!file_exists($infile))) $msg="Fichier ".$infile." a traiter inexistant ";
if ($msg!="")
{
echo("\r\nmsg:".$msg."\r\n");
die();
}
$r=readparam($infile);
if ($r->CR!="0") $msg=$r->MSG;
if ($msg!="")
{
echo("\r\nmsg:".$msg."\r\n");
die();
}
else
echo("CTRL OK\r\n");
if ($msg=="")
{
$title=$r->TITLE;
$subject=$r->SUBJECT;
$tbto=array_merge($r->DEST,$COPYLIST);
$hbody ="<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'><html>";
$hbody.="<head><title>".$title."</title></head>";
$hbody.="<body>".$r->TEXT."<br><br>";
$hbody.="<p><i>Ce courrier électronique est envoyé automatiquement</i>";
$hbody.="</body></html>";
$r=envoie_mail_secure($SMTPSERVER,$SMTPPORT,$SMTPUSER,$SMTPPASS,$SMTPAUTH,$SMTPSECURE,$r->DEST,$FROM,$COPYLIST,$subject,$hbody,$r->ATTACHEMENTLIST,$ACUSERECEPTION);
if ($r->CR!="0")
{
echo ($r->MSG);
//@unlink($infile);
}
else
{
echo ("Envoie réussi de ".$subject." à ".implode(";",$tbto)."\r\n");
@unlink($infile);
}
}
?>
et il inclue le fichier libmail.php dont voici le contenu :
<?php
require_once ("./phpmailer/PHPMailerAutoload.php");
//transforme : nom<mail>
// en : $result->name et $result->mail
function MkAddressName($str)
{
$r=new stdclass();
$r->NAME="";
$r->EMAIL="";
$pos1 = strpos($str, "<");
$pos2 = strpos($str, ">");
//pas de séparateur <>
if (($pos1===FALSE) and ($pos2===FALSE))
$r->EMAIL=$str;
else
{
$r->NAME=substr($str,0,$pos1);
$r->EMAIL=substr($str,($pos1+1),strlen($str)-$pos1-2);
}
$pos3=strpos($str, "@");
if (($r->NAME=="") and ($pos3!==FALSE)) $r->NAME=substr($str,0,$pos3);
return $r;
}
/**********************************************************/
/* EMAIL */
/**********************************************************/
function envoie_mail_secure($smtpserver,$smtpport,$smtplogin,$smtppass,$smtpauth,$smtpsecure,$listdestinataire,$from,$copy,$subject,$body,$filenamelist,$withar="N")
{
$result=new stdclass();
$result->CR="0";
$result->MSG="";
if (count($listdestinataire)==0)
{
$result->CR=-1;
$result->MSG="Il manque un destinataire au mail";
return $result;
}
$f=MkAddressName($from);
$mail = new PHPMailer(true);
$mail->CharSet = 'utf-8';
$mail->isSMTP();
$mail->SMTPDebug = 4;
$mail->Host = $smtpserver;
$mail->Port = $smtpport;
$mail->SMTPAuth = ((strtoupper($smtpauth)=="Y") and ($smtplogin!="") and ($smtppass!=""));
$mail->SMTPSecure = ($mail->SMTPAuth===TRUE?$smtpsecure:"");
$mail->Username = $smtplogin;
$mail->Password = $smtppass;
//Emetteur
$mail->addReplyTo($f->EMAIL, $f->NAME);
$mail->setFrom($f->EMAIL, $f->NAME);
//Accusé réception :
if ($withar!="N") $mail->ConfirmReadingTo = $f->EMAIL;
//destinataire, si plusieurs : en BCC
if (count($listdestinataire)>1)
{
foreach($listdestinataire as $dest)
{
$d=MkAddressName($dest);
$mail->addBCC($d->EMAIL, $d->NAME);
}
}
else
{
$d=MkAddressName($listdestinataire[0]);
$mail->addAddress($d->EMAIL, $d->NAME);
}
//copie (destinataires en clair)
if (count($copy)>0)
{
foreach($copy as $dest)
{
$c=MkAddressName($dest);
$mail->addCC($c->EMAIL, $c->NAME);
}
}
$mail->Subject = $subject;
$i=strripos($body,"<body>");
$mailversion="TEXTE";
if ($i===FALSE)
$body="<body>".nl2br($body)."</body>";
else $mailversion="HTML";
$mail->msgHTML($body, dirname(__FILE__), true); //Create message bodies and embed images
// on attache le fichier au mail
foreach ($filenamelist as $filename)
{
$mail->addAttachment($filename, basename ($filename));
}
$ret=TRUE;
$ret=@$mail->send();
if ($ret!=TRUE)
{
$result->CR=-1;
$result->MSG="Erreur : lors de l'envoie du mail Veuillez réessayer plus tard ou contacter directement votre structure";
return $result;
}
return $result;
}
?>
Alors un include "/home/pi/script/sendmail_simple.php"; fonctionne sauf que le fichier sendmail_simple.php on doit lui passer le chemin du fichier contenant (contenu_mail.ini) la liste des destinataires, le sujet, le texte,... et du coup il le trouve pas puisque je n'ai pas réussi à lui passer dans l'include.
il me retourne le message suivant provenant de sendmail_simple.php:
il me semble qu'il n'est pas possible de faire un include "chemin/fichier"+ paramètres (ici le nom du fichier qui contient les variables utiles)
A moins que?
sinon il faudrait réécrire le code complet pour ne plus passer par un fichier mais transmettre directement les infos dans le programme lui même avant l'include... un sacré boulot (surtout pour moi) sachant que les fichiers d'envois d'email ne sont bien évidemment pas de moi!
Par rapport à ta question d'origine, il te faut inclure à la fin de ton fichier de surveillance les lignes de 105 à 160 de sendmail_simple. Il faut aussi bien sûr ajouter la ligne 3 de sendmail_simple dans ton fichier de surveillance et inclure la fonction readparam.
Alors ce n'est pas très complexe mais c'est vrai que cela fait un peu modifié tes fichiers d'origine.
Sinon tu en restes à ton option de début de lancement par bash avec 2 lignes de commandes php et au passage tu rediriges comme je t'ai indiqué ci-dessus les traces pour avoir une log de tes traitements.
Si je résume, je dois inclure la ligne 3 (include de libmail.php)
le fonction readparam lignes 6 à 101 et les lignes 105 à 160
bref faire à part le<?php de début et la balise de fin ?> qui existe déjà dans mon fichier d'origine, je fais un copié collé de tout le code!
Bon j'avais déjà eu l'idée ...
Je l'ai essayé mais cela ne fonctionne malheureusement pas mieux : j'ai toujours le message d'erreur issu de cette ligne 119 de code :
if (($msg=="") and (!isset($argv[1]))) $msg="Absence du nom du fichier a traiter";
Sinon oui l'option de rester avec mon code lancé depuis le fichier script existe toujours mais pour la suite (gestion de plusieurs ruches en problème elle ne fonctionnera plus) d'où ma quête d'une autre solution ou je puisse boucler sur l'envoi de plusieurs emails...
Merci
Bon c'est enfin bon grâce à vos conseils et ceux d'autres personnes bien avisées (le créateur du code d'origine : piper)!
J'ai intégré le code directement dans mon fichier et supprimé tout ce qui ne servait pas la fonction readparam, et fait quelques ajustements.
Merci
- Edité par GillesMangin-Voirin 24 mai 2022 à 9:13:00
comment lancer un fichier PHP depuis PHP?
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Pas d'aide concernant le code par MP, le forum est là pour ça :)