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

#!/usr/bin/python3 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 # Trois paramètres : le premier est le contenu textuel, le deuxième 'plain' définit le format du texte, 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 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

#!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header # 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 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")

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

#!/usr/bin/python3 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 aux lettres QQ ou une autre boîte aux lettres 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

#!/usr/bin/python3 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 mail QQ ou une autre boîte mail # Créer une instance avec des pièces jointes 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') # Contenu du corps de l'e-mail message.attach(MIMEText('Ceci est l'exemple de test d'envoi d'e-mail Python...', 'plain', 'utf-8')) # Construire la pièce jointe 1, envoyer 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 de fichier ici peut être arbitraire ; le nom que vous écrivez est le nom affiché dans l'e-mail. att1["Content-Disposition"] = 'attachment; filename="test.txt"' message.attach(att1) # Construire la pièce jointe 2, envoyer 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")
$ 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

#!/usr/bin/python3 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 aux lettres 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éfinir l'ID de l'image, référencé 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")
$ 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

#!/usr/bin/python3 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 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 éléments entre parenthèses correspondent au pseudonyme e-mail de l'expéditeur et au compte e-mail de l'expéditeur. msg['To']=formataddr(["FK",my_user]) # Les éléments entre parenthèses correspondent au pseudonyme 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 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 sont pas exécutées, le ret=False suivant sera exécuté. 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