Envoi d’un fichier par mail à un temps spécifique en Python


Objectif :

Ecrire un script en Python pour envoyer un message contenant un fichier joint à une adresse mail

Procédure :

Pour réaliser ce script nous aurons besoin de la librairie email. En particulier, nous avons besoin des classes MIMEBase et MIMEMultipart, et du module encoders.
Nous allons aussi utiliser smtplib pour envoyer les mails à travers les serveurs de Google. Pour cela plusieurs solutions sont possibles (voir https://support.google.com/a/answer/176600?hl=en)


On pourra envoyer jusqu’à 2000 messages par jour si on utilise le serveur smtp.gmail.com. Pour cela il suffit d’utiliser une adresse Gmail (ou adresse G Suite) pour s’authentifier.

On commence par importer ces éléments
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

Nous allons envoyer le mail via les serveurs de google. Pour cela nous avons besoin de spécifier un compte et un mot de passe valides.

monMail="utilisateur@gmail.com" #Utiliser sa vrai adresse
monPassword="Password" #Utiliser le vrai mot de passe

smtpserver='smtp.gmail.com' #serveur de messagerie de Google
port=587 #Port utilisé par le serveur de messagerie

On va se connecter au serveur de gmail

server=smtplib.SMTP(smtpserver,port) # server est un objet

Pour commencer le dialogue avec le serveur smtp, on fait appel à la méthode ehlo()

server.ehlo()

Puis passer en mode TLS (Transport Layer Security). Toutes les commandes qui vont suivre seront alors cryptées.

server.starttls()

Nous allons ensuite nous authentifier auprès du serveur en utilisant la méthode login en fournissant comme arguments l’adresse mail et le mot de passe du compte sur gmail ou G suite

server.login(monMail,monPassword)

On crée la variable qui contient l’adresse de destination

ToAddress="AdresseDeDestination@domaine.com"

On spécifie le sujet du mail

subject = "Envoi fichier à un temps spécifique"

On crée l’objet msg (message)

On spécifie le sujet, l’adresse du destinataire et de l’expéditeur

msg['Subject'] = subject
msg['From'] = monMail
msg['To'] = ToAddress

Nous allons créer l’objet part qui contiendra le fichier à envoyer. Dans notre cas, il s’agit d’un fichier pdf, on le spécifie avec l’argument ‘application’

part = MIMEBase('application', "application/pdf")

Si le fichier est du texte plat on écrit : part = MIMEBase('application', "text/plain")

Si en général c’est un fichier binaire : part = MIMEBase('application', "octet-stream")

On spécifie le fichier à joindre en utilisant la méthode open.read()

part.set_payload(open("Document.pdf", "rb").read())

Puisque le fichier est binaire, il faut l’encoder en ascii en utilisant la méthode encode_base64

encoders.encode_base64(part)

Pour spécifier dans le mail que le fichier attaché s’appelle Document.pdf, on ajoute une entête à part et on spécifie le nom. Sinon le fichier sera attaché mais sous forme d’un fichier noname et sans extension

part.add_header('Content-Disposition', 'attachment; filename="Document.pdf"')

On attache le fichier avec la méthode attach() et on envoi le message en utilisant la méthode sendmail()

msg.attach(part)
server.sendmail(monMail,ToAddress,msg.as_string())

On sauvegarde le script dans un fichier. Par exemple EnvoiMail.py. Si on exécute le script, le message sera envoyé tout de suite. Pour temporiser l’envoi, nous allons utiliser le planificateur de tâches (outils d’administration\ Planificateur de tâches). 
Pour cela, nous allons d’abord créer un fichier batch (par exemple EnvoiMail.bat). Il contient deux instructions:
cd chemin
python EnvoiMail.py
avec chemin spécifie le chemin exact du script. A noter aussi que le fichier Document.pdf doit se trouver dans le même répertoire qur le script sinon il faudrait spécifier le chemin complet dans le script python.

Dans le planificateur de tâches, cliquer sur Créer une tâche de base




Un assistant se lance
Donner un nom à la tâche, le cas échéant une description




Dans notre cas, on voudrait faire l’action une seule fois




On spécifie la date et l’heure



On voudrait lancer le batch créé donc choisir Démarrer un programme



On clique sur le bouton Parcourir et on désigne le fichier .bat déjà créé




Vérifier que tout est correcte et cliquer sur Terminer




A l’heure programmée, le mail est envoyé




Fichier EnvoiMail.py

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

monMail="monadresse@gmail.com"
monPassword="monMotdePasse"
smtpserver='smtp.gmail.com'
port=587
server=smtplib.SMTP(smtpserver,port)
server.ehlo()
server.starttls()
server.login(monMail,monPassword)
ToAddress="destinataire@domain.com"
subject = "Envoi fichier à un temps spécifique"
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = monMail
msg['To'] = ToAddress
part = MIMEBase('application', "application/pdf")
part.set_payload(open("Document.pdf", "rb").read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="Document.pdf"')
msg.attach(part)
server.sendmail(monMail,ToAddress,msg.as_string())
print(" Message sent to " + ToAddress)

Commentaires

Travis Smith a dit…

Hurrah! At last I got a weblog from where I know how to in fact obtain helpful facts regarding my study and knowledge. gmail email login

Posts les plus consultés de ce blog

Installation de glpi 0.9 sur un serveur Windows 2012 R2

Accéder à PhpMyAdmin sans mot de passe

Impossible de joindre un fichier dans OWA