Python: Envoyer un mail tout simplement
Envoi d'un mail via un serveur SMTP (sans authentification):
import smtplib
server = smtplib.SMTP()
# server.set_debuglevel(1) # Décommenter pour activer le debug
server.connect('smtp.toto.fr')
# (220, 'toto ESMTP Postfix') # Réponse du serveur
server.helo()
# (250, 'toto\nPIPELINING\nSIZE 10240000\nVRFY\nETRN\nSTARTTLS\nENHANCEDSTATUSCODES\n8BITMIME\nDSN') # Réponse du serveur
fromaddr = 'TOTO <moi@toto.fr>'
toaddrs = ['lui@toto.fr', 'elle@toto.fr'] # On peut mettre autant d'adresses que l'on souhaite
sujet = "Un Mail avec Python"
message = u"""\
Velit morbi ultrices magna integer.
Metus netus nascetur amet cum viverra ve cum.
Curae fusce condimentum interdum felis sit risus.
Proin class condimentum praesent hendrer
it donec odio facilisi sit.
Etiam massa tempus scelerisque curae habitasse vestibulum arcu metus iaculis hac.
"""
msg = """\
From: %s\r\n\
To: %s\r\n\
Subject: %s\r\n\
\r\n\
%s
""" % (fromaddr, ", ".join(toaddrs), sujet, message)
try:
server.sendmail(fromaddr, toaddrs, msg)
except smtplib.SMTPException as e:
print(e)
# {} # Réponse du serveur
server.quit()
# (221, '2.0.0 Bye') # Réponse du serveur
Envoi d'un mail via un serveur SMTP en SSL (avec authentification):
import smtplib
server = smtplib.SMTP_SSL() # On utilise SMTP_SSL() à la place de SMTP()
# server.set_debuglevel(1) # Décommenter pour activer le debug
server.connect('smtp.toto.fr')
# (220, 'toto ESMTP Postfix') # Réponse du serveur
server.ehlo() # ATTENTION, avec SSL, c'est la commande EHLO au lieu de HELO
#(250, 'toto\nPIPELINING\nSIZE 10240000\nVRFY\nETRN\nAUTH LOGIN PLAIN\nAUTH=LOGIN PLAIN\nENHANCEDSTATUSCODES\n8BITMIME\nDSN') # Réponse du serveur
server.login('user', 'pass') # On s'authentifie
# (235, '2.7.0 Authentication successful') # Réponse du serveur
fromaddr = 'TOTO <moi@toto.fr>'
toaddrs = ['lui@toto.fr', 'elle@toto.fr'] # On peut mettre autant d'adresses que l'on souhaite
sujet = "Un Mail avec Python"
message = u"""\
Velit morbi ultrices magna integer.
Metus netus nascetur amet cum viverra ve cum.
Curae fusce condimentum interdum felis sit risus.
Proin class condimentum praesent hendrer
it donec odio facilisi sit.
Etiam massa tempus scelerisque curae habitasse vestibulum arcu metus iaculis hac.
"""
msg = """\
From: %s\r\n\
To: %s\r\n\
Subject: %s\r\n\
\r\n\
%s
""" % (fromaddr, ", ".join(toaddrs), sujet, message)
try:
server.sendmail(fromaddr, toaddrs, msg)
except smtplib.SMTPException as e:
print(e)
# {} # Réponse du serveur
server.quit()
# (221, '2.0.0 Bye')
Envoi d'un mail via un serveur SMTP en SSL + TLS (avec authentification):
import smtplib
server = smtplib.SMTP() # Avec TLS, on utilise SMTP()
# server.set_debuglevel(1) # Décommenter pour activer le debug
server.connect('smtp.toto.fr', 587) # On indique le port TLS
# (220, 'toto ESMTP Postfix') # Réponse du serveur
server.ehlo() # On utilise la commande EHLO
# (250, 'toto\nPIPELINING\nSIZE 10240000\nVRFY\nETRN\nSTARTTLS\nENHANCEDSTATUSCODES\n8BITMIME\nDSN') # Réponse du serveur
server.starttls() # On appelle la fonction STARTTLS
# (220, '2.0.0 Ready to start TLS') # Réponse du serveur
server.login('user', 'pass')
# (235, '2.7.0 Authentication successful') # Réponse du serveur
fromaddr = 'TOTO <moi@toto.fr>'
toaddrs = ['lui@toto.fr', 'elle@toto.fr'] # On peut mettre autant d'adresses que l'on souhaite
sujet = "Un Mail avec Python"
message = u"""\
Velit morbi ultrices magna integer.
Metus netus nascetur amet cum viverra ve cum.
Curae fusce condimentum interdum felis sit risus.
Proin class condimentum praesent hendrer
it donec odio facilisi sit.
Etiam massa tempus scelerisque curae habitasse vestibulum arcu metus iaculis hac.
"""
msg = """\
From: %s\r\n\
To: %s\r\n\
Subject: %s\r\n\
\r\n\
%s
""" % (fromaddr, ", ".join(toaddrs), sujet, message)
try:
server.sendmail(fromaddr, toaddrs, msg)
except smtplib.SMTPException as e:
print(e)
# {} # Réponse du serveur
server.quit()
# (221, '2.0.0 Bye')
En cas d'erreur, lors de l'exécution de la commande server.sendmail(fromaddr, toaddrs, msg), le serveur répond en indiquant l'erreur rencontrée
{'elle@toto.fr': (450, '4.2.0 <elle@toto.fr>: Recipient address rejected: User unknown in relay recipient table')}
Et en HTML, c'est plus sympa
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
server = smtplib.SMTP()
# server.set_debuglevel(1) # Décommenter pour activer le debug
server.connect('smtp.toto.fr')
server.helo()
fromaddr = 'TOTO <moi@toto.fr>'
toaddrs = ['lui@toto.fr', 'elle@toto.fr'] # On peut mettre autant d'adresses que l'on souhaite
sujet = "Un Mail avec Python"
html = u"""\
<html>
<head>
<meta charset="utf-8" />
</head>
<body>
<div>
Velit morbi ultrices magna integer.
Metus netus nascetur amet cum viverra ve cum.
Curae fusce condimentum interdum felis sit risus.
Proin class condimentum praesent hendrer
it donec odio facilisi sit.
Etiam massa tempus scelerisque curae habitasse vestibulum arcu metus iaculis hac.
</div>
</body
</html>
"""
msg = MIMEMultipart('alternative')
msg['Subject'] = sujet
msg['From'] = fromaddr
msg['To'] = ','.join(toaddrs)
part = MIMEText(html, 'html')
msg.attach(part)
try:
server.sendmail(fromaddr, toaddrs, msg.as_string())
except smtplib.SMTPException as e:
print(e)
server.quit()
Commentaires
bruno (non vérifié)
mar, 10/07/2018 - 20:11
Permalien
message contenant des accents.
Bonjour, je débute sur python j'ai testé votre code qui marche très bien, sauf que je ne peux pas utiliser les accents dans mon message (j'ai l'impression que le message utilise le code ascii et non de l'unicode mais comme je débute...).
Est ce que vous auriez une solution ?
Dans tout les cas merci pour votre partage sur votre site.
Bonne journée
ronan
mer, 11/07/2018 - 12:18
Permalien
Bonjour,
Tout dépend de la version de Python utilisée
Si c'est la version 3, en théorie, il ne doit pas y avoir de problème
Si c'est la version 2, effectivement il peut y avoir des soucis au niveau de l'encodage des caractères
Je ne pense pas à le mettre systématiquement dans mes exemples mais il est très fortement recommandé d'indiquer au début de chaque script l'encodage grâce à la ligne suivante
# -*- coding: UTF-8 -*-
Ensuite, ce site http://sametmax.com/lencoding-en-python-une-bonne-fois-pour-toute/ explique très clairement toutes les subtilités de l'encodage
Je pense que ça devrait t'aider à résoudre ton problème
Melanie (non vérifié)
mer, 31/10/2018 - 11:21
Permalien
Utilisation via une méthode
Bonjour,
J'ai utilisé le premier code de votre page qui fonctionne très bien tout seul. Or j'ai besoin d'envoyer plusieurs mail à la suite, donc ai voulu en faire une méthode. L'envoie s'effectue, en effet, mais je reçois un mail vide (pas de subject ni de message ...)
Pensez vous à une solution ?
ronan
mer, 31/10/2018 - 11:25
Permalien
Bonjour,
Envoyez moi la méthode que vous avez faite.
Je verrais peut-être d'où vient le problème.
Vous pouvez utiliser le formulaire de contact pour me l'envoyer.
theophile (non vérifié)
lun, 01/04/2019 - 13:44
Permalien
Je ne sais pas comment le faire fonctionner
Bonjour
Quand je run le programme, j'ai une erreur 503 et je ne comprend pas ce que c'est...
je vous envoie l'erreur:
(503, b'5.5.1 Error: send HELO/EHLO first', 'TOTO ')
voila. Bien sûr j'ai remplacé l'adresse e-mail par la mienne...
merci d'avance
ronan
lun, 01/04/2019 - 14:10
Permalien
Bonjour
Quand je vois l'erreur, j'ai l'impression que tu n'exécutes pas la commande
ou que tu l'exécutes au mauvais endroit.
L'erreur renvoyée indique bien d'envoyer la commande HELO/EHLO en premier.
Il faut obligatoirement l'exécuter tout de suite après la connexion au serveur SMTP
Ponchy (non vérifié)
lun, 03/06/2019 - 13:13
Permalien
Echec Envoi d'email - Quel est le server connect pour Outlook 20
Bonjour,
Lorsque je teste votre code je reçois un msg d'erreur connect: to ('smtp.office365.com', 25) et ensuite l'erreur 10013 "An attempt was made to access a socket in a way forbidden by its access permissions.
Pourriez-vous m'éclairer SVP?
Bien à vous.
ronan
lun, 03/06/2019 - 22:35
Permalien
smtp.office365.com
Bonjour,
Je ne sais pas si vous souhaitez utiliser le smtp d'office365 pour envoyer des mails à l'extérieur du domaine ou pour une adresse interne au domaine.
Pour utiliser le smtp d'office365 pour l'envoi de mails à des domaines externes il est nécessaire de s'authentifier en TLS sur le port 587.
Pour utiliser le smtp d'office365 pour l'envoi de mails à des adresses internes, je sais que les serveurs office365 sont très restrictifs pour éviter le spam au maximum.
Arthur (non vérifié)
mar, 16/07/2019 - 23:32
Permalien
Aucun message d'erreur mais je ne vois ps de mail envoyez
Bonsoir,
Je trouve vraiment super votre page. Mais j'ai petit souci dans mon code ci-dessous. Il s’exécute mais je ne vois aucun mail envoyé. pouvez m'aider svp?
import smtplib
email_user='ouattaraarthur0@gmail.com'
email_send='ouattaraarthur0@gmail.com'
password='xxxxxxxxx'
server = smtplib.SMTP('smtp.gmail.com',587)
server.starttls()
server.login(email_user,password)
message='Hi bro, comment tu vas?'
server.send_mail=(email_user,email_send,message)
server.quit
ronan
jeu, 18/07/2019 - 20:01
Permalien
Bonjour, ci joint un exemple qui fonctionne (testé)
import smtplib
server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.login('xxx@gmail.com', 'xxx')
fromaddr = 'foo <xxx@gmail.com>'
toaddrs = ['xxx@xxx.fr']
sujet = "Test"
message = u"""\
Message test
"""
msg = """\
From: %s\r\n\
To: %s\r\n\
Subject: %s\r\n\
\r\n\
%s
""" % (fromaddr, ", ".join(toaddrs), sujet, message)
try:
server.sendmail(fromaddr, toaddrs, msg)
except smtplib.SMTPException as e:
print(e)
server.quit()
Ajouter un commentaire