246 votes

Comment envoyer un email à plusieurs destinataires en utilisant python smtplib ?

Après de nombreuses recherches, je n'ai pas trouvé comment utiliser smtplib.sendmail pour envoyer à plusieurs destinataires. Le problème était qu'à chaque fois que le courrier était envoyé, les en-têtes du courrier semblaient contenir plusieurs adresses, mais en fait, seul le premier destinataire recevait l'e-mail.

Le problème semble être que le email.Message attend quelque chose de différent du module smtplib.sendmail() fonction.

En bref, pour envoyer à plusieurs destinataires, vous devez définir l'en-tête comme une chaîne d'adresses électroniques délimitées par des virgules. Le site sendmail() paramètre to_addrs devrait toutefois être une liste d'adresses électroniques.

from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import smtplib

msg = MIMEMultipart()
msg["Subject"] = "Example"
msg["From"] = "me@example.com"
msg["To"] = "malcom@example.com,reynolds@example.com,firefly@example.com"
msg["Cc"] = "serenity@example.com,inara@example.com"
body = MIMEText("example email body")
msg.attach(body)
smtp = smtplib.SMTP("mailhost.example.com", 25)
smtp.sendmail(msg["From"], msg["To"].split(",") + msg["Cc"].split(","), msg.as_string())
smtp.quit()

370voto

sorin Points 23747

Ce site fonctionne vraiment J'ai passé beaucoup de temps à essayer plusieurs variantes.

import smtplib
from email.mime.text import MIMEText

s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = 'me@example.com'
recipients = ['john.doe@example.com', 'john.smith@example.co.uk']
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = ", ".join(recipients)
s.sendmail(sender, recipients, msg.as_string())

52voto

Anony-Mousse Points 24646

Vous devez comprendre la différence entre le visible d'un courriel, et l'adresse livraison .

msg["To"] est essentiellement ce qui est imprimé sur la lettre. Cela n'a en fait aucun effet. Sauf que votre client de messagerie, tout comme l'agent postal ordinaire, supposera que c'est à cette personne que vous voulez envoyer le courrier électronique.

La livraison effective peut toutefois être très différente. Ainsi, vous peut déposer l'e-mail (ou une copie) dans la boîte aux lettres d'une personne complètement différente.

Il y a plusieurs raisons à cela. Par exemple redirection . Le site To: ne change pas lors du transfert, mais l'e-mail est déposé dans une autre boîte aux lettres.

Le site smtp.sendmail s'occupe maintenant de la réel livraison. email.Message ne concerne que le contenu de la lettre, pas la livraison.

En bas niveau SMTP vous devez indiquer les destinataires un par un, c'est pourquoi une liste d'adresses (sans les noms !) est une API judicieuse.

Pour l'en-tête, il peut aussi contenir par exemple le nom, ex. To: First Last <email@addr.tld>, Other User <other@mail.tld> . Votre exemple de code n'est donc pas recommandé car il n'arrivera pas à distribuer ce courrier, puisqu'en le divisant simplement sur , vous n'avez toujours pas les adresses valides !

7voto

James McPherson Points 41

J'ai compris cela il y a quelques mois et j'en ai parlé sur mon blog. Le résumé est le suivant :

Si vous souhaitez utiliser smtplib pour envoyer un message à plusieurs destinataires, utilisez email.Message.add_header('To', eachRecipientAsString) pour les ajouter, puis lorsque vous invoquez la méthode sendmail, utilisez email.Message.get_all('To') pour envoyer le message à chacun d'entre eux. Idem pour les destinataires Cc et Bcc.

http://www.jmcpdotcom.com/blog/2012/01/06/multiple-recipients-with-pythons-smtplib-sendmail-method a les détails sanglants.

7voto

radtek Points 506

J'ai trouvé cette fonction de module importable. Il utilise le serveur de messagerie gmail dans cet exemple. Il est divisé en en-tête et message pour que vous puissiez voir clairement ce qui se passe :

import smtplib

def send_alert(subject=""):

    to = ['email@one.com', 'email2@another_email.com', 'a3rd@email.com']
    gmail_user = 'me@gmail.com'
    gmail_pwd = 'my_pass'
    smtpserver = smtplib.SMTP("smtp.gmail.com", 587)
    smtpserver.ehlo()
    smtpserver.starttls()
    smtpserver.ehlo
    smtpserver.login(gmail_user, gmail_pwd)
    header = 'To:' + ", ".join(to) + '\n' + 'From: ' + gmail_user + '\n' + 'Subject: ' + subject + '\n'
    msg = header + '\n' + subject + '\n\n'
    smtpserver.sendmail(gmail_user, to, msg)
    smtpserver.close()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X