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