Comment faire pour envoyer un email à plusieurs destinataires à l'aide de python smtplib?
Après beaucoup de recherches je n'ai pas trouvé comment l'utiliser smtplib.sendmail pour envoyer à plusieurs destinataires. Le problème a chaque fois que le mail sera envoyé le mail en-têtes semblent contenir plusieurs adresses, mais en fait seul le premier bénéficiaire de recevoir l'e-mail.
Le problème semble être que la e-mail.Message
module attend quelque chose de différent que la smtplib.sendmail()
fonction.
En bref, pour envoyer à plusieurs destinataires, vous devez définir l'en-tête à une chaîne délimitée par des virgules adresses e-mail. Le sendmail()
paramètre to_addrs
cependant doit être une liste d'adresses e-mail.
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
import smtplib
msg = MIMEMultipart()
msg["Subject"] = "Example"
msg["From"] = "[email protected]"
msg["To"] = "[email protected],[email protected],[email protected]"
msg["Cc"] = "[email protected],[email protected]"
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()
- Il apparaît OP répondu à sa propre question:
sendmail
besoin d'une liste. - double possible de Est-il possible d'ajouter plusieurs destinataires en Python SMTPlib?
- À l'aide de Python3 j'ai dû faire une boucle par les bénéficiaires;
for addr in recipients: msg['To'] = addr
et puis il a travaillé. Plusieurs affectations en fait ajoute une nouvelle 'À' en-tête de chacun. C'est très bizarre de l'interface, je ne peux même pas expliquer comment j'ai pensé à l'essayer. J'ai même vu à l'aide desubprocess
pour appeler les unixsendmail
paquet pour sauver ma santé avant que je compris cela.
InformationsquelleAutor user1148320 | 2012-01-13
Vous devez vous connecter pour publier un commentaire.
Ce fonctionne vraiment, j'ai passé beaucoup de temps à essayer de multiples variantes.
tolist =["[email protected]","[email protected]","[email protected]","[email protected]"]
send_message
au lieu desendmail
comme par Antoine de commentaire ci-dessous et le Python docs docs.python.org/3/library/email-examples.htmlLa
msg['To']
doit être une chaîne de caractères:Tandis que le
recipients
danssendmail(sender, recipients, message)
doit être une liste:smtplib.
recipients
n'a pas à être une liste - si une chaîne de caractères est donnée, elle est traitée comme une liste avec un seul élément. Lemsg['To']
chaîne peut être tout simplement omis.Vous avez besoin de comprendre la différence entre le visible adresse de courriel, et le livraison.
msg["To"]
est essentiellement ce qui est imprimé sur la lettre. Il ne fait pas d'effet. Sauf que votre client de messagerie, tout comme le poste d'officier, supposons que c'est à qui vous voulez envoyer le message.La livraison effective peut toutefois le travail tout à fait différent. Si vous peut chute de l'e-mail (ou une copie) dans la boîte aux lettres de quelqu'un de complètement différent.
Il y a plusieurs raisons à cela. Par exemple transfert. Le
To:
champ d'en-tête ne change pas sur le transfert, cependant, l'email est tombé dans une autre boîte aux lettres.La
smtp.sendmail
commande s'occupe maintenant de la réelle de livraison.email.Message
est le contenu de la lettre uniquement, pas de livraison.Dans les bas-niveau
SMTP
, vous avez besoin pour donner le receipients un par un, c'est pourquoi une liste d'adresses (n'incluant pas les noms!) est le sensible, l'API.Pour l'en-tête, il peut aussi contenir par exemple le nom, par exemple
To: First Last <[email protected]>, Other User <[email protected]>
. Votre exemple de code n'est donc pas recommandé, comme il échoue à la livraison de ce mail, car juste en les divisant sur,
vous n'avez pas encore pas de la validité des adresses!Cela fonctionne pour moi.
recipients = ['[email protected]','[email protected]']
au lieu d'en faire une chaîne de caractères, et de la diviser ensuite de faire une liste?J'ai essayé de le ci-dessous et cela a fonctionné comme un charme 🙂
import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText sender = '[email protected]' rec_list = ['[email protected]', '[email protected]'] rec = ', '.join(rec_list) msg = MIMEMultipart('alternative') msg['Subject'] = 'The required subject' msg['From'] = sender msg['To'] = rec html = ('whatever html code') htm_part = MIMEText(html, 'html') msg.attach(htm_part) send_out = smtplib.SMTP('localhost') send_out.sendmail(sender, rec_list, msg.as_string()) send_out.quit()
Je suis venu avec cette importables module de fonction. Il utilise le serveur de messagerie gmail dans cet exemple. Sa répartition dans l'en-tête de message et de sorte que vous pouvez clairement voir ce qui se passe:
Donc en fait le problème est que SMTP.sendmail et e-mail.MIMEText besoin de deux choses différentes.
e-mail.MIMEText met en place le "to:" en-tête pour le corps de l'e-mail. Il est SEULEMENT utilisé pour l'affichage d'un résultat pour l'être humain à l'autre extrémité, et, comme toutes les têtes d'e-mail, doit être une chaîne unique. (Notez qu'il n'y a pas en fait rien avoir à faire avec les gens qui reçoivent le message.)
SMTP.sendmail, d'autre part, met en place "l'enveloppe" du message pour le protocole SMTP. Il a besoin d'un Python liste de chaînes, dont chacune a une adresse unique.
Donc, ce que vous devez faire est de COMBINER les deux réponses que vous avez reçu. Set msg['To'] à une seule chaîne, mais passer le raw liste de sendmail:
J'ai compris cela il y a quelques mois et blogué à ce sujet. Le résumé est:
Si vous souhaitez utiliser smtplib pour envoyer un courriel à plusieurs destinataires, utilisez
email.Message.add_header('To', eachRecipientAsString)
pour les ajouter, puis lorsque vous appelez la méthode sendmail,use email.Message.get_all('To')
envoyer le message à tous. Idem pour les destinataires Cc et Cci.Bien, la méthode en cette asnwer méthode ne fonctionne pas pour moi. Je ne sais pas, c'est peut-être un Python3 (j'utilise la version 3.4) ou gmail question connexe, mais après quelques essais, la solution qui a fonctionné pour moi, était la ligne de
au lieu de
J'utilise python 3.6 et le code suivant fonctionne pour moi
Il n'a travaillé que pour moi avec send_message fonction et à l'aide de la fonction join dans la liste avec les bénéficiaires, python 3.6.
vous pouvez l'essayer quand vous écrivez la recpient e-mails sur un fichier texte