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
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 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
import smtplib
from email.mime.text import MIMEText
from email.header import En-tête
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"
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
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é, 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
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'e-mail SMTP Python'
message['Subject'] = Header(subject, 'utf-8')
message.attach(MIMEText('Ceci est un 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"
$ 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
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"
$ 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
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 voir :

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