Envoi d'e-mails SMTP en Python

SMTP (Simple Mail Transfer Protocol) est un protocole simple de transfert de courrier. C'est un ensemble de règles pour transférer le courrier d'une adresse source vers une adresse de destination, qui contrôle la manière dont le courrier est relayé.

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, par exemple : example.com. Ce paramètre est 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 SMTP de Python utilise la méthode sendmail pour envoyer des e-mails. 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, les adresses e-mail auxquelles envoyer.
  • msg : le message à envoyer.

Notez le troisième paramètre ici : 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 celui défini dans le protocole SMTP.

Exemple

L'exemple suivant nécessite que vous ayez installé sur votre machine un service compatible SMTP, tel que sendmail.

Voici un exemple simple d'envoi d'un e-mail avec Python :

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # E-mail du destinataire, peut être défini sur votre boîte QQ ou une autre boîte mail # Trois paramètres : le premier est le contenu texte, le deuxième 'plain' définit le format du texte, et le troisième 'utf-8' définit l'encodage message = MIMEText('Test d'envoi d'e-mail Python...', 'plain', 'utf-8') message['From'] = Header("Exemple", 'utf-8') # Expéditeur message['To'] = Header("Test", 'utf-8') # Destinataire 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 des guillemets triples pour définir les informations de l'e-mail. Un e-mail standard nécessite trois champs d'en-tête :From, To, etSubject, chaque information est séparée par une ligne vide.

Nous instancions l'objet SMTP du module smtplibsmtpObjpour nous connecter au serveur SMTP, et utilisons la méthodesendmailpour envoyer le message.

Exécutez le programme ci-dessus. Si vous avez installésendmail (agent de transfert de courrier), il affichera :

$ python test.py 
邮件发送成功

Vérifiez votre boîte de réception (généralement dans le dossier de spam) pour voir l'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 de messagerie (QQ, NetEase, Google, etc.).

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import En-tête # Service SMTP tiers mail_host="smtp.XXX.com" # Définir le serveur mail_user="XXXX" # Nom d'utilisateur mail_pass="XXXXXX" # Mot de passe sender = '[email protected]' receivers = ['[email protected]'] # E-mail du destinataire, peut être défini sur votre boîte QQ ou une autre boîte aux lettres 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) # 25 est le numéro de port SMTP 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"

Envoi d'e-mails au format HTML avec Python

La différence entre l'envoi d'e-mails au format HTML et l'envoi d'e-mails en texte brut en Python réside dans le fait que le `_subtype` dans MIMEText est défini sur 'html'. Le code spécifique est le suivant :

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.header import Header sender = '[email protected]' receivers = ['[email protected]'] # E-mail du destinataire, peut être défini sur votre boîte QQ ou une autre boîte 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é, il affichera :

$ python test.py 
邮件发送成功

Vérifiez votre boîte de réception (généralement dans le dossier de spam) pour voir l'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 la pièce jointe. S'il y a plusieurs pièces jointes, vous pouvez les construire successivement, et enfin l'envoyer à l'aide de smtplib.smtp.

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- 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]'] # E-mail du destinataire, peut être défini sur votre boîte QQ ou une autre boîte mail # Créer une instance avec une pièce jointe message = MIMEMultipart() 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') # Contenu du corps de l'e-mail message.attach(MIMEText('Ceci est un exemple de test d'envoi d'e-mail Python...', 'plain', 'utf-8')) # Construire la pièce jointe 1, en envoyant le fichier test.txt dans le répertoire courant att1 = MIMEText(open('test.txt', 'rb').read(), 'base64', 'utf-8') att1["Content-Type"] = 'application/octet-stream' # Le nom du fichier ici peut être n'importe quoi. Quel que soit le nom que vous écrivez, l'e-mail affichera ce nom. att1["Content-Disposition"] = 'attachment; filename="test.txt"' message.attach(att1) # Construire la pièce jointe 2, en envoyant le fichier example.txt dans le répertoire courant 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"
$ python test.py 
邮件发送成功

Vérifiez votre boîte de réception (généralement dans le dossier de spam) pour voir l'e-mail :


Ajout d'images dans le texte HTML

Dans les corps d'e-mails HTML, l'ajout de liens externes est généralement inefficace auprès des fournisseurs de services de messagerie. Un exemple d'ajout correct d'images est le suivant :

Exemple

#!/usr/bin/python # -*- coding: UTF-8 -*- 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]'] # E-mail du destinataire, peut être défini sur votre boîte QQ ou une autre boîte mail 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')) # Spécifiez l'image dans le répertoire courant fp = open('test.png', 'rb') msgImage = MIMEImage(fp.read()) fp.close() # Définissez l'ID de l'image et référencez-la dans le texte HTML 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"
$ python test.py 
邮件发送成功

Vérifiez votre boîte de réception (si l'e-mail se trouve 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 l'e-mail :


Envoi à l'aide d'un service SMTP tiers

Ici, nous utilisons le service SMTP de QQ Mail (vous pouvez aussi utiliser 163, Gmail, etc.). La configuration suivante est requise :

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

#!/usr/bin/python # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from email.utils import formataddr my_sender='[email protected]' # Compte e-mail de l'expéditeur my_pass = 'xxxxxxxxxx' # Mot de passe de l'e-mail de l'expéditeur my_user='[email protected]' # Compte e-mail du destinataire, je m'envoie à moi-même ici def mail(): ret=True try: msg=MIMEText('Remplissez le contenu de l'e-mail','plain','utf-8') msg['From']=formataddr(["FromExample",my_sender]) # Les parenthèses correspondent au pseudonyme de l'e-mail de l'expéditeur et au compte e-mail de l'expéditeur msg['To']=formataddr(["FK",my_user]) # Les parenthèses correspondent au pseudonyme de l'e-mail du destinataire et au compte e-mail du destinataire msg['Subject']="Exemple de test d'envoi d'e-mail" # L'objet de l'e-mail, également appelé titre server=smtplib.SMTP_SSL("smtp.qq.com", 465) # Le serveur SMTP dans l'e-mail de l'expéditeur, le port est 25 server.login(my_sender, my_pass) # Les parenthèses correspondent au compte e-mail de l'expéditeur et au mot de passe de l'e-mail server.sendmail(my_sender,[my_user,],msg.as_string()) # Les parenthèses correspondent au compte e-mail de l'expéditeur, au compte e-mail du destinataire et à l'e-mail à envoyer server.quit() # Fermer la connexion except Exception: # Si les instructions dans try ne s'exécutent pas, alors le ret=False ci-dessous s'exécutera 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 voir :

Pour plus d'informations, veuillez consulter :https://docs.python.org/2/library/email-examples.html。

Autres extensions