2017-05-06 1 views
-1

J'ai été chargé d'envoyer environ 250 courriels avec environ 30 Ko de pièces jointes par courriel. Chaque pièce jointe est unique au destinataire. Mon code ci-dessous fonctionne, même si je pense que c'est trop lent, il envoie un e-mail toutes les 7 secondes environ, ce qui représente environ 29 minutes. Évidemment, la paralléliser aiderait à faire avancer les choses, mais je suis curieux de savoir si mon code peut être amélioré. Veuillez noter que je n'ai pas encore implémenté la pièce jointe et les e-mails ciblés, car cela ne devrait pas provoquer un impact aussi important sur les performances.Python - envoyer des courriels en vrac

import os,datetime 
def send_mail(recipient, subject, message, files=None): 

    import smtplib,email,os 
    from email.mime.multipart import MIMEMultipart 
    from email.mime.text import MIMEText 
    from email.mime.application import MIMEApplication 
    from os.path import basename 

    username = "myemail" 
    password ="mypass" 

    mailServer = smtplib.SMTP('smtp-mail.outlook.com', 587) 
    mailServer.ehlo() 
    mailServer.starttls() 
    mailServer.ehlo() 
    mailServer.login(username, password) 

    for i in range(1,15): 
     try: 
      msg = MIMEMultipart() 
      msg['From'] = username 
      msg['To'] = recipient 
      msg['Subject'] = subject 
      msg.attach(MIMEText(message)) 
      for f in files or []: 
       with open(f, "rb") as fil: 
        part = MIMEApplication(
         fil.read(), 
         Name=basename(f) 
        ) 
        part['Content-Disposition'] = 'attachment; filename="%s"' % basename(f) 
        msg.attach(part) 


      print('sending mail to ' + recipient + ' on ' + subject) 


      mailServer.sendmail(username, recipient, msg.as_string()) 


     except error as e: 
      print(str(e)) 

    mailServer.close() 

print(datetime.datetime.now()) 
send_mail('recipent, 'Sent using Python', 'May the force be with you.',["colours.xls"]) 
print(datetime.datetime.now()) 
+1

Pourquoi boucle-t-il 14 fois? Il ne semble pas arriver à quelque chose de différent à chaque boucle. –

+0

Salut @PeterWood, comme indiqué ci-dessus, je n'ai pas encore ciblé les pièces jointes et les e-mails, car cela ne devrait pas faire trop de différence dans les performances. Je peux les brancher plus tard. Au départ, je veux quelque chose qui fonctionne bien dans l'envoi de courriels, puis je vais paramétrer le script – Krishn

Répondre

-1

Vous devez profiler votre code pour voir ce qui consomme le plus de temps. Je recommanderais d'utiliser cProfile + snakeviz.

python -m cProfile -o program.prof my_program.py 
snakeviz program.prof