Envoi mail après un reboot

Bonjour,
Afin d’être informé que le rapsberry a effectué un reboot suite à l’action du chien de garde, j’ai crée le fichier « pymail » suivant et je l’ai mis dans le répertoire : « /home/pi/pythons »
#!/usr/bin/python3

coding: utf-8

email smtp server credentials

SMPT = ‹ smtp.sfr.fr ›#‹ –your-smtp-server-url– ›
SRC = ‹ azertyu@sfr.fr ›#‹ –your-smtp-user-name– ›
PWD = ‹ 123456 › #‹ –your-smtp-password– ›
PORT = 465 # usual

setup a default message

TGT = ‹ abcde@sfr.fr › #‹ –your-email-address– ›
OBJ = ‹ reboot Raspberry Montigny ›
MSG = ‹ Raspberry Pi rebooted ›

Import smtplib for the actual sending function

import smtplib, ssl

Import the email modules we’ll need

from email.mime.text import MIMEText

Allow for command line options to set the subject, target email and message

import argparse

parser = argparse.ArgumentParser(description=‹ Send short email. ›)
parser.add_argument(‹ -s ›, ‹ –subject ›)
parser.add_argument(‹ -t ›, ‹ –to ›)
parser.add_argument(‹ -m ›, ‹ –msg ›)

args = parser.parse_args()

if args.subject: OBJ = args.subject
if args.to: TGT = args.to
if args.msg: MSG = args.msg

debug arguments

#print(args)
#print(‹ OBJ ›, OBJ)
#print(‹ TGT ›, TGT)
#print(‹ MSG ›, MSG)
#exit

Create the message

msg = MIMEText(MSG)
msg[‹ Subject ›] = OBJ
msg[‹ From ›] = SRC
msg[‹ To ›] = TGT

Send it

context = ssl.create_default_context()
with smtplib.SMTP_SSL(SMPT, PORT, context=context) as server:
server.login(SRC, PWD)
server.sendmail(SRC, TGT, msg.as_string())

lorsque j’exécute : gibus@rarrypi:~ $ /home/gibus/pythons/pymail
le mail me parvient
Dans /etc/crontab -e j’ai ajouté à la fin le texte suivant ,au dessus du #:
@reboot sleep 60 && /home/gibus/pythons/pymail &
Quand je reboot le raspberry aucun mail me parvient.
MERCi de bien vouloir m’aider à résoudre mon problème

Bonjour,

Déjà, votre script est illisible, pouvez le mettre en forme en le sélectionnant et en cliquant sur l’icone de mise en forme « </> ».

Quelques pistes de recherche:

  • Vérifier le contenu de la crontab : $ crontab -l
  • C’est la crontab de quel utilisateur gibus ou root ?
  • Essayer de voir si la crontab est lue en la modifiant comme suit (dernière ligne du fichier crontab)
@reboot sleep 300 && date >> ~/date.txt
  • Si oui, essayer d’ajouter une log dans la commande crontab pour voir ce qui se passe au lancement du script
@reboot sleep 300 &&  /home/gibus/pythons/pymail 2>&1 >> /home/gibus/pythons/pymail.log

Consulter le fichier de log

Bonne investigations.
A+

Bonjour,
Merci pour ce retour rapide
Voici le fichier pymail:

#!/usr/bin/python3
# coding: utf-8

# email smtp server credentials

SMPT = 'smtp.sfr.fr'#'--your-smtp-server-url--'
SRC  = 'azerty@sfr.fr'#'--your-smtp-user-name--'
PWD  = '12345' #'--your-smtp-password--'
PORT = 465 # usual 

# setup a default message
TGT = 'azerty@sfr.fr' #'--your-email-address--'
OBJ = 'reboot Raspberry Montigny'
MSG = 'Raspberry Pi rebooted'

# Import smtplib for the actual sending function
import smtplib, ssl

# Import the email modules we'll need
from email.mime.text import MIMEText

# Allow for command line options to set the subject, target email and message
import argparse

parser = argparse.ArgumentParser(description='Send short email.')
parser.add_argument('-s', '--subject')
parser.add_argument('-t', '--to')
parser.add_argument('-m', '--msg') 

args = parser.parse_args()

if args.subject: OBJ = args.subject
if args.to:      TGT = args.to
if args.msg:     MSG = args.msg

# debug arguments  
#print(args)
#print('OBJ', OBJ)
#print('TGT', TGT)
#print('MSG', MSG)
#exit

# Create the message
msg = MIMEText(MSG)
msg['Subject'] = OBJ
msg['From'] = SRC
msg['To'] = TGT

# Send it 
context = ssl.create_default_context()
with smtplib.SMTP_SSL(SMPT, PORT, context=context) as server:
    server.login(SRC, PWD)
    server.sendmail(SRC, TGT, msg.as_string())

`# ref: https://realpython.com/python-send-email`

voici le résultat de :
gibus@raspberrypi:~ $ sudo crontab -l
no crontab for root
gibus@raspberrypi:~ $

pour votre info, pour editer le crontab je lance la commande suivante:
sudo nano /etc/crontab -e
la ligne
@reboot sleep 300 && date >> ~/date.txt
est sans effet. je ne trouve pas de fichier date.tx. Il en est de même pour l’autre ligne
@reboot sleep 300 && home/gibus/pythons/pymail 2>&1 >> /home/gibus/pythons/pymail.log
voici le fichier crontab sur lequel j’ai commenté les 2 lignes d’essais.
merci de vos conseils

Bonjour,

J’avais oublié cette crontab là, celle du système et je ne sais pas si l’instruction @reboot est effective dans cette crontab.
En fait il y a une crontab par utilisateur + une pour le système. En général, j’ai pour habitude de ne pas modifier les crontab du système.
Dans votre cas, le fichier exécutable étant dans le $HOME de l’utilisateur gibus, je trouve cohérent que ce soit lui qui envoie le mail, car entre autre, c’est probablement avec cet utilisateur qu’a été testé et validé la commande pymail.

Donc dans un premier temps, remettre le fichier /etc/crontab dans son état initial. Puis éditer la crontab de l’utilisateur avec crontab -e (sans sudo) et copier/coller la ligne @reboot… en dernière ligne du fichier. Sauvegarder et rebooter. Si ça ne fonctionne pas, essayer avec la ligne contenant date.

A+

bonsoir,
J’espère que les fêtes de fin et de nouvelle année se sont bien passées. Je vous prie d’accepter mes meilleurs vœux.
Suite à vos conseils j’ai fait les démarches suivantes :
gibus@raspberrypi:~ $ crontab -e
j’ai mis ceci:
#@reboot sleep 120 && /home/gibus/pythons/pymail 2>&1 >> /home/gibus/pythons/pymail.log
Résultat négatif
j’ai ajouté les ligne suivantes:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
Le fichier pymail.log était bien créé mais vide et n’était pas mis à jour au reboot suivant. Le mail n’était toujours pas émis.
J’ai alors eu l’idée que le fichier pymail pouvait ne pas avoir l’autorisation adéquate. Ne sachant pas le niveau autorisation a lui mettre je lui donné la totale.
Le mail est alors bien émis , le fichier log est toujours vide et pas mis à jour.
Après avoir cherché sur le net j’ai fait cette modification :
@reboot sleep 120 && /home/gibus/pythons/pymail > /home/gibus/pythons/pymail.log 2>&1
Le fichier est alors bien mis à jour mais reste vide.
Le mail est bien émis et c’est le principal. Cependant pourriez vous me préciser les permissions exactes qu’il me faut donner au fichier pymail et cerise sur le gâteau me dire de ce faudrait modifier pour que le fichier ne reste pas vide.
Voici mon fichier crontab actuel:
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
#@reboot sleep 120 && /home/gibus/pythons/pymail 2>&1 >> /home/gibus/pythons/pymail.log
@reboot sleep 120 && /home/gibus/pythons/pymail > /home/gibus/pythons/pymail.log 2>&1

UN GRAND MERCI

Je pense que ces lignes n’apportent rien dans votre cas de figure car votre programme n’est ni un shell ni un programme contenu dans le PATH. D’autant plus que vous avez spécifié le chemin complet à votre script.

En théorie votre fichier doit être exécuté par l’utilisateur gibus
Vérifier que ce fichier appartient bien à cet utilisateur avec
$ ls -l /home/gibus/pythons/pymail

Alors, changer les droits pour que l’utilisateur puisse exécuter ce script et que tous les autres utilisateurs ne voient ce fichier qu’en lecture.

$ chmod 744 /home/gibus/pythons/pymail

La signification de la redirection 2>&1 signifie :
2 redirection des erreurs
1 redirction de la sortie standard (exécution normale du fichier)

& redirection du premier vers le second
Donc 2>&1 : redirection de la sortie des erreurs vers la sortie normale.
Le fichier est vide c’est qu’il n’y a pas d’erreur d’éxecution. Pour avoir un affichage dans la sortie standard, il faut qu’il y ai des commandes du style print("texte a affcher") dans le programme.

En espérant que cela réponde à vos questions.
Bonne continuation

A+