Wiki Python Fr   email UserPreferences
 
HelpContents FindPage Diffs Info Edit Subscribe XML Print View

1. Envoi de mail en python

Depuis la version 2.2, python intègre un module email pour gérer les mails. Voici un programme de plus haut niveau pour envoyer des mails.

1.1. MAIL

  1 
  2 
  3 
  4 
  5 
  6 
  7 
  8 
  9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 
 54 
 55 
 56 
 57 
 58 
 59 
 60 
 61 
 62 
 63 
 64 
 65 
 66 
 67 
 68 
 69 
 70 
 71 
 72 
 73 
 74 
 75 
 76 
 77 
 78 
 79 
 80 
 81 
 82 
 83 
 84 
 85 
 86 
 87 
 88 
 89 
 90 
 91 
 92 
 93 
 94 
 95 
 96 
 97 
 98 
 99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
140 
141 
142 
143 
144 
145 
146 
147 
148 
149 
150 
151 
152 
153 
154 
155 
156 
157 
158 
159 
160 
161 
162 
163 
164 
165 
166 
167 
168 
169 
170 
171 
172 
173 
174 
175 
176 
177 
178 
179 
180 
181 
182 
183 
184 
185 
186 
187 
188 
189 
190 
191 
192 
193 
194 
#!/usr/bin/env python
# -*- Encoding: Latin-1 -*-
"""
Ceci est une reprise du programme mxmail. 

24/03/2006 -utilisation du module email
"""
import string, sys, types, os, tempfile, time
import email
from email import Encoders
from email.MIMEAudio import MIMEAudio
from email.MIMEBase import MIMEBase
from email.MIMEImage import MIMEImage
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import mimetypes
import smtplib

def FICHIER( chemin ):
    """Guess the content type based on the file's extension. Encoding
    will be ignored, altough we should check for simple things like
    gzip'd or compressed files."""
    ctype, encoding = mimetypes.guess_type(chemin)
    if ctype is None or encoding is not None:
        # No guess could be made, or the file is encoded (compresses), so
        # use a generic bag-of-bits type.
        ctype = 'application.octet-stream'
    maintype, subtype = ctype.split('/', 1)
    if maintype == 'text':
        fp = open(chemin)
        # Note : we should handle calculating the charset
        msg = MIMEText(fp.read(), _subtype=subtype)
        fp.close()
    elif maintype == 'image':
        fp = open(chemin, 'rb')
        msg = MIMEImage(fp.read(), _subtype=subtype)
        fp.close()
    elif maintype == 'audio':
        fp = open(chemin, 'rb')
        msg = MIMEAudio(fp.read(), _subtype=subtype)
        fp.close()
    else:
        fp = open(chemin, 'rb')
        msg = MIMEBase(maintype, subtype)
        msg.set_payload(fp.read())
        fp.close()
        # Encode the payload using Base64
        Encoders.encode_base64(msg)
    # Set the filename parameter
    fichier = os.path.basename(chemin)
    msg.add_header('Content-Disposition','attachment',filename=fichier)
    return msg

class mxmMail:
    """
    mxmMail est client e-mail qui permet d'envoyer un e-mail de la même façon
    qu'en utilisant un simple client e-mail comme outlook express ou le client
    mail de netscape.
    Licence: TIUISICIIDC (Take it, use it, sell it, change it. I dont care.)
    contact: maxm@normik.dk, maxmcorp@worldonline.dk, maxm@mxm.dk
    """

    def __init__(self, fromName='', fromAddress='', subject='', message='', SMTPServer=''):
        self.fromName     = fromName
        self.fromAddress  = fromAddress
        self.subject      = subject
        self.message      = message
        self.recipients   = []
        self.attachments  = []
        self.SMTPServer   = SMTPServer

    def __str__(self):
        return self.message

    def prepend(self, text):
        """
        Ajoute une chaine avant le corps du message.
        """
        self.message = text + self.message

    def append(self, text):
        """
        Ajoute une chaine après le corps du message.
        """
        self.message = self.message + text

    def prependFile(self, fileName):
        """
        Cette méthode ajoute le contenu d'un fichier texte avant le corps du
        message.
        Une utilisation est d'ajouter fichier d'entête commun au début du
        message.
        Cela peut être fait plusieurs fois pour ajouter différents fichiers
        texte dans un ordre spécifique.
        Si le fichier ne peut être ouvert, la méthode va échouer silencieusement.
        C'est un choix délibéré pour que les mailings automatiques ne soient pas
        arrêtés par des fichiers entêtes/pieds manquants.
        """
        try:
            file = open(fileName)
            self.prepend(file.read())
        except:
            pass # Just fail silently

    def appendFile(self, fileName):
        """
        Cette méthode ajoute le contenu d'un fichier texte avant le corps du
        message.
        Une utilisation est d'ajouter un fichier signature à la fin du message.
        Cela peut être fait plusieurs fois pour ajouter différents fichiers
        texte dans un ordre spécifique.
        Si le fichier ne peut être ouvert, la méthode va échouer silencieusement.
        C'est un choix délibéré pour que les mailings automatiques ne soient pas
        arrêtés par des fichiers entêtes/pieds manquants.
        """
        try:
            file = open(fileName)
            self.append(file.read())
        except:
            pass # Just fail silently

    def recipientAppend(self, toName, toAddress):
        """
        Ajoute un destinataire de plus au message.
        """
        self.recipients.append({'toName':toName, 'toAddress':toAddress})

    def setRecipients(self, recipients=[]):
        self.recipients = recipients

    def attachmentAppend(self, fileName):
        """
        Ajoute une pièce jointe au message. Elle est automatiquement converti
        dans un type mime.
        """
        self.attachments.append(fileName)

    def send(self):
        """Envoie le message."""
        message = MIMEMultipart()
        message['From'] = self.fromAddress
        message['Subject'] = self.subject

        recipientList = []
        for recipient in self.recipients:
            recipientList.append(recipient['toAddress'])
            adressList = string.join(recipientList, '; ')
            message['To'] = adressList
            if type(self.message) == str:
                message.attach( MIMEText(self.message) )
            elif type(self.message) == unicode:
                message.attach( MIMEText(self.message.encode('utf-8'), 'plain', 'utf-8') )
            for attachFile in self.attachments:
                # encodes the attached files
                if type(attachFile) == types.StringType:
                    fileName = attachFile
                    filePath = attachFile
                elif type(attachFile) == types.TupleType and len(attachFile) == 2:
                    filePath,fileName = attachFile
                else:
                    raise "Attachments Error: must be pathname string or path,filename tuple"
                message.attach( FICHIER(attachFile) )

        #try:
        server = smtplib.SMTP(self.SMTPServer)
        server.sendmail(self.fromAddress, recipientList, message.as_string())
        #finally:
        server.quit()

    def save(self, fileName):
        """
        Saves the message to a file. Including attachements and pre/appended files.
        """
        file = open(fileName, 'w')
        file.write(str(self))
        file.close()

if __name__ == '__main__':
    # Exemple d'utilisation de la classe mxmMail
    serveur = 'mail.serveur.com' # votre serveur SMTP ici
    expediteur = 'moi@serveur.com' # Votre adresse email
    destinataire = 'destinataire@boite.com' # L'adresse de votre destinataire
    sujet = u"Voilà les fichiers que tu m'as demandés"
    message = u'Tu peux ouvrir les fichiers ci-joints (héhé)'
    #myMsg = mxmMail(NomExpéditeur, AdresseExpediteur, Sujet, Texte, serveurSMTP)
    myMsg = mxmMail("C'est moi", expediteur, sujet,message,serveur)
    # Ajoute un destinataire : myMsg.recipientAppend(Nom, Adresse)
    myMsg.recipientAppend('Mon ami', destinataire)
    #myMsg.prependFile('C:/root/desktop/head.txt')
    #myMsg.appendFile('C:/root/desktop/sig.txt')
    #myMsg.attachmentAppend('c:/temp/file.zip')
    #myMsg.setRecipients([{'toName':'fghdfg','toAddress':'fghdfg@slkdhf.com'}, {'toName':'xcvxcv','toAddress':'xcvxcv@cvxv.dk'}])
    myMsg.send()
# vim:ts=4

CE CODE NE MARCHE PAS !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

J'utilise ce code régulièrement et il fonctionne très bien. Quel est le problème ?

En ajoutant deux destinataires de la manière suivante :
myMsg.recipientAppend('ami1', 'dada@mail.com')
myMsg.recipientAppend('ami2', 'dadou@mail.com')
on obtient à la réception du message --> A : dada@mail.com ; dada@mail.com ; dadou@mail.com Le premier mail inséré est doublé. Comment remédier au problème ?

PythonPowered