Envoyer des mails depuis le Raspberry?

Je cherche à programmer (en python) l’envoi de mails depuis le RPi. Je suis en Raspbian sans interface graphioque. Voici mon programme:`
#!/usr/bin/env python 3

-- coding: utf8 --

from email.mime.text import MIMEText

def send_email(subject, body, to_email):
smtp_server = ‹ smtp.xxxx.fr › # Remplacez par le serveur SMTP de votre fournisseur
smtp_port = 587
smtp_user = ‹ yyyy@xxxx.fr › # Remplacez par votre adresse e-mail
smtp_password = ‹ xyz › # Remplacez par votre mot de passe

    msg = MIMEText(body)
    msg['From'] = smtp_user
    msg['To'] = 'xxxx'
    msg['Subject'] = 'xxx'

    try:
            server = smtplib.SMTP(smtp_server, smtp_port)
            server.starttls()
            server.login(smtp_user, smtp_password)
            server.sendmail(smtp_user, to_email, msg.as_string())
            server.quit
    except Exception as e:
            print(f"Erreur envoi : {e}")`

Lorsque je l’exécute, je ne vois rien à l’écran, donc il n’y a pas d’erreur. Mais je ne reçois pas les mails. Pour avancer j’ai testé : telnet smtp.xxxx.fr
(avec ce qu’il faut à la place des « xxxx ») et je me suis bien connecté.

Que faut-il tester d’autre ?

Merci de votre aide.

AMIcalement.

hello,

si tu cherches a tester le port 587 il faudra le préciser dans la commande telnet :
telnet smtp.xxxx.fr 587

sinon pour le programme il en manque clairement des bouts ( on a une fonction mais pas son appel) difficile de se faire une idée…

Une petite erreur dans mon message : en effet, j’avais précisé le port 587.
Pour ce qui est de l’appel, c’est tout simplement « sudo python E-Mail.py »

Merci d’avoir répondu.

Bonjour,

Je suis du même avis que @bof. L’exemple de code que vous avez posté ne semble pas complet. Je vous invite à rechercher un autre code sur le net, car celui ci risque d’être long à debugger. Dites nous si ça pose toujours souci après.

A+

Je suppose que les gens qui répondent sont suffisamment compétent pour savoir ce qu’ils disent. Pouvez-vois m’indiquer ce qu’il manque à mon code, à votre avis (évidemment, il ne s’agit pas des données perso que j’ai masquées). Ce code n’est pas un sous-programme, c’est un programme console que je lance depuis la console. Il ne me renvoie aucune erreur, aucune impression à l’écran, mais je ne reçois pas le mail. Quand je lance la ligne seule (avec le numéro de port 587, excusez-moi encore) je reçois bien la réponse comme quoi je suis connecté.

Bonjour,

Je ne prétend pas être hyper compétent, je connais juste un peu Python.
Dans un code Python, en général, on commence par importer des bibliothèques, puis on défini des variables, puis on écrit des fonctions. Alors, est écrit un programme principal qui exécute son coeur de fonctionnement en appelant tout ce qui a été défini au début.

Dans le bout de code qui a été posté ici, seul une partie de « email.mime.text » est importé, pourquoi pas. Ensuite une fonction est définie (send_email), à l’intérieur elle fait appel à " smtplib qui est une librairie qui n’est pas importée au début. Enfin le programme principal devant faire appel à la fonction n’est pas écrit.
Donc votre programme charge une librairie, quelques variables, une fonction et ne fait appel à rien au final. Donc puisqu’on ne lui demande de ne rien faire, il ne fait rien et donc il ne retourne aucune erreur.

A mon niveau, je n’ai pas les compétences pour dépanner/écrire autant un script, d’où ma proposition de trouver quelque chose de fonctionnel sur le net (au pire à adapter un peu) qui corresponde à votre besoin.
Il faut savoir qu’en fonction des versions de Python certains programmes ne sont pas compatibles, c’est pour cela qu’il faut tester…

Bonnes recherches.

A+

100 fois sur le métier…

Je vous renouvelle mes excuses : il manquait en effet un « send_email() » (sans tabulation) à la fin de mon code, et quelques détails. Voici sa version actuelle :

 #!/usr/bin/env python3
 2 # -*- coding: utf8 -*-
 3 import smtplib
 4 from email.mime.text import MIMEText
 5
 6 def send_email():
 7     smtp_server = 'smtp.bbox.fr'  
 8     smtp_port = 465
 9     smtp_user = 'xxxx@bbox.fr'  # Remplacez par votre adresse e-mail
10     smtp_password = 'yyyy'  # Remplacez par votre mot de passe
11
12
13     msg = MIMEText("Ca va mieux !")
14     msg['From'] = smtp_user
15     msg['To'] = 'xxxx@yy.fr'
16     msg['Subject'] = 'Allo, Maman, bobo !'
17     try:
18         server = smtplib.SMTP(smtp_server, smtp_port)
19         server.set_debuglevel(1)
20         server.starttls()
21         server.login(smtp_user, smtp_password)
22         server.sendmail(smtp_user, 'xxxx@yy.fr', msg.as_string() + '\n.')
23         server.quit()
24         print("OK")
25     except Exception as e:
26         print(f"Erreur : {e}")
27
28 send_email()

Et le serveur me répond, maintenant :

Erreur : Connection unexpectedly closed: [Errno 104] Connection reset by peer

(Le message était le même avec le port 587.)

Si ça vous dit quelque chose…

AMIcalement.

Bonjour,

J’ai copié votre script et j’ai la même erreur avec mes paramètres. Après plus d’une heure de recherche sur le net de cette erreur, je ne trouve pas de piste. Peut être une incompatibilité SSL (que je ne sais pas comment résoudre).

Selon cette page
https://www.assistance.bouyguestelecom.fr/s/forum/question/0D5080000BYA6FICQ1/comment-paramétrer-serveur-smtp

Utiliser les paramètres :

Pouvez-vous tenter le port 25 en commentant la ligne starttls ?

A+

Bonjour,

Je viens de tester votre script (légèrement modifié) avec un compte Google, il fonctionne. Ce qui me fait penser que c’est un problème de communication avec d’autres serveurs SMTP, probablement des soucis de compatibilité SSL ?

#!/usr/bin/env python3
# -*- coding: utf8 -*-
import smtplib
from email.mime.text import MIMEText

def send_email():
    smtp_server = 'smtp.gmail.com'
    smtp_port = 587
    smtp_user = 'xxxxxxxxxx@gmail.com'
    smtp_password = 'yyyyyyyyyyyyyyy'


    msg = MIMEText("Ca va mieux !")
    msg['From'] = smtp_user
    msg['To'] = 'zzzzzzzzz@gmail.com'
    msg['Subject'] = 'Allo, Maman, bobo !'
    try:
        server = smtplib.SMTP(smtp_server, smtp_port)
        server.set_debuglevel(1)
        server.ehlo()
        server.starttls()
        server.ehlo()
        server.login(smtp_user, smtp_password)
        server.sendmail(smtp_user, 'zzzzzzzzzz@gmail.com', msg.as_string())
        server.quit()
        print("OK")
    except Exception as e:
        print(f"Erreur : {e}")

send_email()