Python3 Envoi d'e-mails SMTP
SMTP (Simple Mail Transfer Protocol) est un ensemble de règles pour transférer le courrier d'une adresse source vers une adresse de destination, et il contrôle la façon dont les messages sont relayés.
smtplib de Python offre un moyen pratique d'envoyer des e-mails. C'est une simple surcouche du protocole SMTP.
La syntaxe de création d'un objet SMTP en Python est la suivante :
import smtplib
smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )
Description du paramètre :
- host : hôte du serveur SMTP. Vous pouvez spécifier l'adresse IP ou le nom de domaine de l'hôte, comme example.com. Il s'agit d'un paramètre facultatif.
- port : si vous fournissez le paramètre host, vous devez spécifier le numéro de port utilisé par le service SMTP. Généralement, le numéro de port SMTP est 25.
- local_hostname : si SMTP est sur votre machine locale, vous n'avez qu'à indiquer l'adresse du serveur comme localhost.
L'objet Python SMTP utilise la méthode sendmail pour envoyer un e-mail. La syntaxe est la suivante :
SMTP.sendmail(from_addr, to_addrs, msg[, mail_options, rcpt_options]
Description du paramètre :
- from_addr : adresse e-mail de l'expéditeur.
- to_addrs : une liste de chaînes de caractères, les adresses des destinataires.
- msg : le message à envoyer.
Ici, vous devez faire attention au troisième paramètre. msg est une chaîne représentant l'e-mail. Nous savons qu'un e-mail se compose généralement d'un objet, d'un expéditeur, d'un destinataire, du contenu de l'e-mail, de pièces jointes, etc. Lors de l'envoi d'un e-mail, faites attention au format de msg. Ce format est défini dans le protocole SMTP.
Exemple
Voici un exemple simple d'envoi d'un e-mail avec Python :
Exemple
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
message = MIMEText('Test d'envoi d'e-mail Python...', 'plain', 'utf-8')
message['From'] = Header("Exemple", 'utf-8')
message['To'] = Header("Test", 'utf-8')
subject = 'Test d'e-mail SMTP Python'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print ("E-mail envoyé avec succès")
except smtplib.SMTPException:
print ("Erreur : Impossible d'envoyer l'e-mail")
Nous utilisons trois guillemets pour définir les informations de l'e-mail. Un e-mail standard nécessite trois éléments d'en-tête :From, To, etSubjectChaque information est séparée par une ligne vide.
Nous instancions l'objet SMTP du module smtplibsmtpObjpour nous connecter à l'accès SMTP, et utilisonssendmailcomme méthode pour envoyer le message.
Exécutez le programme ci-dessus. Si sendmail est installé sur votre machine, il affichera :
$ python3 test.py
邮件发送成功
Vérifiez votre boîte de réception (généralement dans le dossier spam), et vous pourrez voir le message e-mail :

Si nous n'avons pas accès à sendmail sur notre machine, nous pouvons également utiliser l'accès SMTP d'autres fournisseurs de services (QQ, NetEase, Google, etc.).
Exemple
import smtplib
from email.mime.text import MIMEText
from email.header import Header
mail_host="smtp.XXX.com"
mail_user="XXXX"
mail_pass="XXXXXX"
sender = '[email protected]'
receivers = ['[email protected]']
message = MIMEText('Test d'envoi d'e-mail Python...', 'plain', 'utf-8')
message['From'] = Header("Exemple", 'utf-8')
message['To'] = Header("Test", 'utf-8')
subject = 'Test d'e-mail SMTP Python'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host, 25)
smtpObj.login(mail_user,mail_pass)
smtpObj.sendmail(sender, receivers, message.as_string())
print ("E-mail envoyé avec succès")
except smtplib.SMTPException:
print ("Erreur : impossible d'envoyer l'e-mail")
Utiliser Python pour envoyer des e-mails HTML
La différence entre l'envoi d'un e-mail HTML et d'un e-mail en texte brut en Python réside dans le fait de définir le _subtype dans MIMEText sur html. Le code spécifique est le suivant :
Exemple
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
mail_msg = """<p>Test d'envoi d'e-mail Python...</p>
<p><a href="http://www.example.com">Ceci est un lien</a></p>"""
message = MIMEText(mail_msg, 'html', 'utf-8')
message['From'] = Header("Exemple", 'utf-8')
message['To'] = Header("Test", 'utf-8')
subject = 'Test d'e-mail SMTP Python'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print ("E-mail envoyé avec succès")
except smtplib.SMTPException:
print ("Erreur : impossible d'envoyer l'e-mail")
Exécutez le programme ci-dessus. Si sendmail est installé sur votre machine, il affichera :
$ python3 test.py
邮件发送成功
Vérifiez votre boîte de réception (généralement dans le dossier spam), et vous pourrez voir le message e-mail :

Envoi d'e-mails avec pièces jointes en Python
Pour envoyer un e-mail avec des pièces jointes, créez d'abord une instance MIMEMultipart(), puis construisez les pièces jointes. S'il y a plusieurs pièces jointes, construisez-les une par une, et enfin, utilisez smtplib.smtp pour envoyer.
Exemple
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
message = MIMEMultipart()
message['From'] = Header("Exemple", 'utf-8')
message['To'] = Header("Test", 'utf-8')
subject = 'Test d'envoi d'e-mail Python SMTP'
message['Subject'] = Header(subject, 'utf-8')
message.attach(MIMEText('Ceci est l'exemple de test d'envoi d'e-mail Python...', 'plain', 'utf-8'))
att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
att1["Content-Disposition"] = 'attachment; filename="test.txt"'
message.attach(att1)
att2 = MIMEText(open('example.txt', 'rb').read(), 'base64', 'utf-8')
att2["Content-Type"] = 'application/octet-stream'
att2["Content-Disposition"] = 'attachment; filename="example.txt"'
message.attach(att2)
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print ("E-mail envoyé avec succès")
except smtplib.SMTPException:
print ("Erreur : Impossible d'envoyer l'e-mail")
$ python3 test.py
邮件发送成功
Vérifiez votre boîte de réception (généralement dans le dossier spam), et vous pourrez voir le message e-mail :

Ajout d'images dans le texte HTML
Dans le texte HTML d'un e-mail, l'ajout de liens externes est généralement invalide auprès des fournisseurs de services de messagerie. Un exemple correct d'ajout d'images est présenté ci-dessous :
Exemple
import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header
sender = '[email protected]'
receivers = ['[email protected]']
msgRoot = MIMEMultipart('related')
msgRoot['From'] = Header("Exemple", 'utf-8')
msgRoot['To'] = Header("Test", 'utf-8')
subject = 'Test d'e-mail SMTP Python'
msgRoot['Subject'] = Header(subject, 'utf-8')
msgAlternative = MIMEMultipart('alternative')
msgRoot.attach(msgAlternative)
mail_msg = """<p>Test d'envoi d'e-mail Python...</p>
<p><a href="http://www.example.com">Lien du tutoriel d'exemple</a></p>
<p>Démonstration d'image :</p>
<p><img src="cid:image1"></p>"""
msgAlternative.attach(MIMEText(mail_msg, 'html', 'utf-8'))
fp = open('test.png', 'rb')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID', '<image1>')
msgRoot.attach(msgImage)
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, msgRoot.as_string())
print ("E-mail envoyé avec succès")
except smtplib.SMTPException:
print ("Erreur : Impossible d'envoyer l'e-mail")
$ python3 test.py
邮件发送成功
Vérifiez votre boîte de réception (s'il est dans le dossier spam, vous devrez peut-être le déplacer vers la boîte de réception pour un affichage correct), et vous pouvez voir le message e-mail :

Envoi via un service SMTP tiers
Ici, nous utilisons le service SMTP de QQ Mail (vous pouvez aussi utiliser 163, Gmail, etc.). Vous devez configurer les éléments suivants :

QQ Mail définit le mot de passe en générant un code d'autorisation :

Adresse du serveur SMTP de QQ Mail : smtp.qq.com, port SSL : 465.
Dans l'exemple suivant, vous devez modifier : l'e-mail de l'expéditeur (votre e-mail QQ), le mot de passe, l'e-mail du destinataire (vous pouvez vous l'envoyer à vous-même).
QQ SMTP
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
my_sender='[email protected]'
my_pass = 'xxxxxxxxxx'
my_user='[email protected]'
def mail():
ret=True
try:
msg=MIMEText('Remplissez le contenu de l'e-mail','plain','utf-8')
msg['From']=formataddr(["FromExample",my_sender])
msg['To']=formataddr(["FK",my_user])
msg['Subject']="Exemple de test d'envoi d'e-mail"
server=smtplib.SMTP_SSL("smtp.qq.com", 465)
server.login(my_sender, my_pass)
server.sendmail(my_sender,[my_user,],msg.as_string())
server.quit()
except Exception:
ret=False
return ret
ret=mail()
if ret:
print("E-mail envoyé avec succès")
else:
print("Échec de l'envoi de l'e-mail")
$ python test.py
邮件发送成功
Après un envoi réussi, connectez-vous à la boîte aux lettres du destinataire pour consulter :

Pour plus de contenu, veuillez consulter :https://docs.python.org/3/library/email-examples.html。
Autres extensions