Après de nombreuses recherches, je n'ai pas pu trouver 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 recevrait le courrier électronique.
Le problème semble être que le email.Message
module attend quelque chose de différent de la smtplib.sendmail()
fonction.
En bref, pour envoyer à plusieurs destinataires, vous devez définir l'en-tête comme une chaîne d'adresses électroniques séparées par des virgules. Le sendmail()
paramètre to_addrs
doit cependant ê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()
sendmail
besoin d'une liste.for addr in recipients: msg['To'] = addr
et puis ça a marché. Plusieurs affectations ajoutent en fait un nouvel en-tête «À» pour chacune. C'est une interface très bizarre, je ne peux même pas expliquer comment j'ai pensé l'essayer. J'envisageais même d'utilisersubprocess
lesendmail
paquet Unix pour sauver ma raison avant de comprendre cela.Réponses:
Cela fonctionne vraiment , j'ai passé beaucoup de temps à essayer plusieurs variantes.
la source
tolist =["[email protected]","[email protected]","[email protected]","[email protected]"]
send_message
au lieu desendmail
selon le commentaire d'Antoine ci-dessous et les documents Python docs.python.org/3/library/email-examples.htmlLe
msg['To']
doit être une chaîne:Alors que le
recipients
insendmail(sender, recipients, message)
doit être une liste:la source
smtplib.
recipients
ne doit pas être une liste - si une chaîne est donnée, elle est traitée comme une liste avec un élément. Lamsg['To']
chaîne peut simplement être omise.Vous devez comprendre la différence entre l' adresse visible d'un e-mail et la 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 de poste ordinaire, supposera que c'est à qui vous souhaitez envoyer l'e-mail.La livraison réelle peut cependant fonctionner très différemment. Vous pouvez donc déposer 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, le transfert . Le
To:
champ d'en-tête ne change pas lors du transfert, mais l'e-mail est déposé dans une autre boîte aux lettres.La
smtp.sendmail
commande s'occupe maintenant de la livraison réelle .email.Message
est le contenu de la lettre uniquement, pas la livraison.En bas niveau
SMTP
, vous devez donner les destinataires un par un, c'est pourquoi une liste d'adresses (sans inclure les noms!) Est l'API sensée.Pour l'en-tête, il peut également 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é , car il ne parviendra pas à livrer ce courrier, car juste en le divisant sur,
vous n'avez toujours pas les adresses valides!la source
Ça marche pour moi.
la source
recipients = ['[email protected]','[email protected]']
faire une chaîne, puis la diviser pour en faire une liste?J'ai essayé ci-dessous et cela a fonctionné comme un charme :)
la source
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()
Donc, en réalité, le problème est que SMTP.sendmail et email.MIMEText ont besoin de deux choses différentes.
email.MIMEText configure l'en-tête "To:" pour le corps de l'e-mail. Il est UNIQUEMENT utilisé pour afficher un résultat à l'être humain à l'autre extrémité, et comme tous les en-têtes de courrier électronique, il doit être une seule chaîne. (Notez que cela n'a rien à voir avec les personnes qui reçoivent réellement le message.)
SMTP.sendmail, d'autre part, définit "l'enveloppe" du message pour le protocole SMTP. Il a besoin d'une liste Python de chaînes, chacune ayant une seule adresse.
Donc, ce que vous devez faire, c'est COMBINER les deux réponses que vous avez reçues. Définissez msg ['To'] sur une seule chaîne, mais passez la liste brute à sendmail:
la source
Je suis venu avec cette fonction de module importable. Il utilise le serveur de messagerie gmail dans cet exemple. Il est divisé en en-tête et message afin que vous puissiez voir clairement ce qui se passe:
la source
J'ai compris cela il y a quelques mois et j'ai blogué à ce sujet . Le résumé est:
Si vous souhaitez utiliser smtplib pour envoyer des e-mails à 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')
envoyez le message à chacun d'eux. Idem pour les destinataires Cc et Cci.la source
La solution ci-dessous a fonctionné pour moi. Il envoie avec succès un e-mail à plusieurs destinataires, y compris «CC» et «BCC».
la source
Eh bien, la méthode de cette méthode de réponse n'a pas fonctionné pour moi. Je ne sais pas, c'est peut-être un problème lié à Python3 (j'utilise la version 3.4) ou à gmail, mais après quelques essais, la solution qui a fonctionné pour moi, était la ligne
au lieu de
la source
J'utilise python 3.6 et le code suivant fonctionne pour moi
la source
Cela ne fonctionnait que pour moi avec la fonction send_message et en utilisant la fonction join dans la liste avec les destinataires, python 3.6.
la source
vous pouvez essayer cela lorsque vous écrivez les e-mails appropriés sur un fichier texte
la source