Python - Envoi d'e-mails via SMTP

Le protocole SMTP (Simple Mail Transfer Protocol) est un protocole qui gère l'envoi d'e-mails et le routage des e-mails entre les serveurs de messagerie.

Python fournit smtplib module, qui définit un objet de session client SMTP qui peut être utilisé pour envoyer du courrier à n'importe quelle machine Internet avec un démon d'écoute SMTP ou ESMTP.

Voici une syntaxe simple pour créer un objet SMTP, qui pourra ensuite être utilisé pour envoyer un e-mail -

import smtplib

smtpObj = smtplib.SMTP( [host [, port [, local_hostname]]] )

Voici le détail des paramètres -

  • host- Il s'agit de l'hôte exécutant votre serveur SMTP. Vous pouvez spécifier l'adresse IP de l'hôte ou un nom de domaine comme tutorialspoint.com. C'est un argument facultatif.

  • port- Si vous fournissez un argument hôte , vous devez spécifier un port sur lequel le serveur SMTP écoute. Habituellement, ce port serait 25.

  • local_hostname- Si votre serveur SMTP s'exécute sur votre machine locale, vous pouvez spécifier uniquement localhost à partir de cette option.

Un objet SMTP a une méthode d'instance appelée sendmail, qui est généralement utilisé pour effectuer le travail d'envoi d'un message. Il faut trois paramètres -

  • L' expéditeur - Une chaîne avec l'adresse de l'expéditeur.

  • Les destinataires - Une liste de chaînes, une pour chaque destinataire.

  • Le message - Un message sous forme de chaîne formatée comme spécifié dans les diverses RFC.

Exemple

Voici un moyen simple d'envoyer un e-mail à l'aide d'un script Python. Essayez-le une fois -

#!/usr/bin/python

import smtplib

sender = '[email protected]'
receivers = ['[email protected]']

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: SMTP e-mail test

This is a test e-mail message.
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Ici, vous avez placé un e-mail de base dans un message, en utilisant un triple guillemet, en prenant soin de formater correctement les en-têtes. Un e-mail nécessite unFrom, To, et Subject en-tête, séparé du corps de l'e-mail par une ligne vide.

Pour envoyer le courrier, utilisez smtpObj pour vous connecter au serveur SMTP sur la machine locale, puis utilisez la méthode sendmail avec le message, l'adresse de l'expéditeur et l'adresse de destination comme paramètres (même si les adresses de et de -mail lui-même, ils ne sont pas toujours utilisés pour acheminer le courrier).

Si vous n'exécutez pas de serveur SMTP sur votre ordinateur local, vous pouvez utiliser le client smtplib pour communiquer avec un serveur SMTP distant. Sauf si vous utilisez un service de messagerie Web (tel que Hotmail ou Yahoo! Mail), votre fournisseur de messagerie doit vous avoir fourni les détails du serveur de messagerie sortant que vous pouvez les fournir, comme suit -

smtplib.SMTP('mail.your-domain.com', 25)

Envoi d'un e-mail HTML à l'aide de Python

Lorsque vous envoyez un message texte en utilisant Python, tout le contenu est traité comme un simple texte. Même si vous incluez des balises HTML dans un message texte, celui-ci s'affiche sous forme de texte simple et les balises HTML ne seront pas formatées selon la syntaxe HTML. Mais Python offre la possibilité d'envoyer un message HTML en tant que message HTML réel.

Lors de l'envoi d'un e-mail, vous pouvez spécifier une version de Mime, un type de contenu et un jeu de caractères pour envoyer un e-mail HTML.

Exemple

Voici l'exemple pour envoyer du contenu HTML sous forme d'e-mail. Essayez-le une fois -

#!/usr/bin/python

import smtplib

message = """From: From Person <[email protected]>
To: To Person <[email protected]>
MIME-Version: 1.0
Content-type: text/html
Subject: SMTP HTML e-mail test

This is an e-mail message to be sent in HTML format

<b>This is HTML message.</b>
<h1>This is headline.</h1>
"""

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, receivers, message)         
   print "Successfully sent email"
except SMTPException:
   print "Error: unable to send email"

Envoi de pièces jointes par e-mail

Pour envoyer un e-mail avec un contenu mixte, vous devez définir Content-type en-tête à multipart/mixed. Ensuite, les sections de texte et de pièce jointe peuvent être spécifiées dansboundaries.

Une limite est commencée par deux traits d'union suivis d'un numéro unique, qui ne peut pas apparaître dans la partie message de l'e-mail. Une limite finale indiquant la section finale de l'e-mail doit également se terminer par deux tirets.

Les fichiers joints doivent être encodés avec le pack("m") fonction d'avoir un encodage base64 avant la transmission.

Exemple

Voici l'exemple, qui envoie un fichier /tmp/test.txten pièce jointe. Essayez-le une fois -

#!/usr/bin/python

import smtplib
import base64

filename = "/tmp/test.txt"

# Read a file and encode it into base64 format
fo = open(filename, "rb")
filecontent = fo.read()
encodedcontent = base64.b64encode(filecontent)  # base64

sender = '[email protected]'
reciever = '[email protected]'

marker = "AUNIQUEMARKER"

body ="""
This is a test email to send an attachement.
"""
# Define the main headers.
part1 = """From: From Person <[email protected]>
To: To Person <[email protected]>
Subject: Sending Attachement
MIME-Version: 1.0
Content-Type: multipart/mixed; boundary=%s
--%s
""" % (marker, marker)

# Define the message action
part2 = """Content-Type: text/plain
Content-Transfer-Encoding:8bit

%s
--%s
""" % (body,marker)

# Define the attachment section
part3 = """Content-Type: multipart/mixed; name=\"%s\"
Content-Transfer-Encoding:base64
Content-Disposition: attachment; filename=%s

%s
--%s--
""" %(filename, filename, encodedcontent, marker)
message = part1 + part2 + part3

try:
   smtpObj = smtplib.SMTP('localhost')
   smtpObj.sendmail(sender, reciever, message)
   print "Successfully sent email"
except Exception:
   print "Error: unable to send email"