def __init__(self, destinataires=[], sujet="", texte_html="", fichiers=[], images=[], champs={}): self.destinataires = destinataires self.sujet = sujet self.fichiers = fichiers self.images = images self.texte_html = texte_html self.champs = champs # Corrige le pb des images embarquées index = 0 for img in images: img = img.replace(u"\\", u"/") img = img.replace(u":", u"%3a") self.texte_html = self.texte_html.replace(u"file:/%s" % img, u"cid:image%d" % index) index += 1 # Conversion du html en texte plain self.texte_plain = UTILS_Html2text.html2text(self.texte_html)
def Envoi_mail(adresseExpediteur="", listeDestinataires=[], listeDestinatairesCCI=[], sujetMail="", texteMail="", listeFichiersJoints=[], serveur="localhost", port=None, avecAuthentification=False, avecStartTLS=False, listeImages=[], motdepasse=None, accuseReception=False, utilisateur=""): """ Envoi d'un mail avec pièce jointe """ import smtplib import poplib from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email.MIMEText import MIMEText from email.MIMEImage import MIMEImage from email.MIMEAudio import MIMEAudio from email.Utils import COMMASPACE, formatdate from email import Encoders from email.utils import make_msgid import mimetypes assert type(listeDestinataires) == list assert type(listeFichiersJoints) == list # Corrige le pb des images embarquées index = 0 for img in listeImages: img = img.replace(u"\\", u"/") img = img.replace(u":", u"%3a") texteMail = texteMail.replace( _(u"file:/%s") % img, u"cid:image%d" % index) index += 1 # Création du message msg = MIMEMultipart('alternative') msg['From'] = adresseExpediteur msg['To'] = ";".join(listeDestinataires) msg['Bcc'] = ";".join(listeDestinatairesCCI) msg['Date'] = formatdate(localtime=True) msg['Subject'] = sujetMail #msg['Message-ID'] = make_msgid() if accuseReception == True: msg['Disposition-Notification-To'] = adresseExpediteur # Conversion du HTML en plain text textePlain = UTILS_Html2text.html2text(texteMail) msg.attach(MIMEText(textePlain.encode('utf-8'), 'plain', 'utf-8')) msg.attach(MIMEText(texteMail.encode('utf-8'), 'html', 'utf-8')) # Attache des pièces jointes for fichier in listeFichiersJoints: """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(fichier) 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(fichier) # Note : we should handle calculating the charset part = MIMEText(fp.read(), _subtype=subtype) fp.close() elif maintype == 'image': fp = open(fichier, 'rb') part = MIMEImage(fp.read(), _subtype=subtype) fp.close() elif maintype == 'audio': fp = open(fichier, 'rb') part = MIMEAudio(fp.read(), _subtype=subtype) fp.close() else: fp = open(fichier, 'rb') part = MIMEBase(maintype, subtype) part.set_payload(fp.read()) fp.close() # Encode the payload using Base64 Encoders.encode_base64(part) # Set the filename parameter nomFichier = os.path.basename(fichier) if type(nomFichier) == unicode: nomFichier = FonctionsPerso.Supprime_accent(nomFichier) part.add_header('Content-Disposition', 'attachment', filename=nomFichier) msg.attach(part) # Images incluses index = 0 for img in listeImages: fp = open(img, 'rb') msgImage = MIMEImage(fp.read()) fp.close() msgImage.add_header('Content-ID', '<image%d>' % index) msgImage.add_header('Content-Disposition', 'inline', filename=img) msg.attach(msgImage) index += 1 ## Certains SMTP (exemple Orange Pro) demandent une authentifcation (en général user : boite mail et pwd : mot de passe associé au smtp sécurisé ) ## mais ne supportent pas le mode starttls ## Ces identifiants sont généralement utilisés lors d'un envoi de mail abec un FAI différent du propriétaire du SMTP ## Par exemple pour envoyer un mail avec le smtp pro orange depuis un autre FAI (Free, SFR....) ## serveur : smtp.premium.orange.fr - port 587 ## user : [email protected] ## pwd : mon_pwd ## On positionne dans ce cas le parametre avecAuthentification a True ## et le parametre avecStartTLS est positionné selon l'état du support de la fonction startTLS par le SMTP if motdepasse == None: motdepasse = "" if utilisateur == None: utilisateur = "" if avecAuthentification in (0, False, None): # Envoi standard smtp = smtplib.SMTP(serveur, timeout=150) else: # Si identification SSL nécessaire : smtp = smtplib.SMTP(serveur, port, timeout=150) smtp.ehlo() if avecStartTLS == True: smtp.starttls() smtp.ehlo() smtp.login(utilisateur.encode('utf-8'), motdepasse.encode('utf-8')) smtp.sendmail(adresseExpediteur, listeDestinataires + listeDestinatairesCCI, msg.as_string()) smtp.close() return True