So senden Sie ein E-Mail an mehrere Empfänger mit python smtplib?
Nach langem suchen konnte ich nicht herausfinden, wie Sie smtplib.sendmail zum senden an mehrere Empfänger. Das problem war jedes mal die mail würde an die E-mail-Kopfzeilen erscheinen würde, um die mehrere Adressen, aber in der Tat nur der erste Empfänger den Erhalt der E-Mail.
Das problem scheint zu sein, dass die E-Mail.Message
Modul erwartet etwas anderes als der smtplib.sendmail()
Funktion.
Kurz, zu senden an mehrere Empfänger müssen Sie die header-ein string, der durch Kommas getrennte E-Mail-Adressen. Die sendmail()
parameter to_addrs
jedoch sollte eine Liste von E-Mail-Adressen.
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()
Es erscheint OP beantwortet seine eigene Frage:
möglich, Duplikat der gibt es eine Möglichkeit, mehrere Empfänger in Python SMTPlib?
Mit Python ist3, die ich hatte, um eine Schleife durch die Empfänger;
sendmail
braucht eine Liste.möglich, Duplikat der gibt es eine Möglichkeit, mehrere Empfänger in Python SMTPlib?
Mit Python ist3, die ich hatte, um eine Schleife durch die Empfänger;
for addr in recipients: msg['To'] = addr
und dann hat es geklappt. Mehrere Aufträge tatsächlich fügt einen neuen 'In' - header für jeden. Dies ist eine sehr bizarre Oberfläche, ich kann nicht einmal erklären, wie ich dachte, es zu versuchen. Ich war sogar erwägen, mit subprocess
zum Aufruf des unix - sendmail
- Paket zu speichern, meinen Verstand, bevor ich dachte mir, diese.InformationsquelleAutor user1148320 | 2012-01-13
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese wirklich funktioniert, ich verbrachte eine Menge Zeit versucht mehrere Varianten.
tolist =["[email protected]","[email protected]","[email protected]","[email protected]"]
danke @sorin für dieses Skript. Ich hatte ein problem, senden Sie eine E-Mail von einem python-Skript und mit diesem Stück code kann ich nun die E-Mail senden.
Dies wird nicht senden an mehrere Empfänger, wenn Sie mit Python 3 müssen Sie
send_message
stattsendmail
als pro-Antoine Kommentar unten und die Python docs docs.python.org/3/library/email-examples.htmlVerwenden Sie für jede traverse, dass der Empfänger für sendmail, sonst nur das erste element wird die E-mail empfangen.
Korrektur der url oben erwähnt: docs.python.org/3/library/email.examples.html
InformationsquelleAutor sorin
Den
msg['To']
muss ein string sein:Während der
recipients
imsendmail(sender, recipients, message)
muss eine Liste:smtplib.
recipients
muss nicht sein, eine Liste - wenn eine Zeichenfolge angegeben ist, wird Sie behandelt wie eine Liste mit einem element. Diemsg['To']
string kann einfach weggelassen werden.Ich weiß wirklich nicht verstehen, wie '[email protected], [email protected]' wird geparst, so wird nur die erste Adresse wird die E-Mail. Aber, vielen Dank! Dies ist die Antwort, musste Liste drin.
arbeitete für mich, und es ist konsistent mit der Dokumentation in docs.python.org/2/library/email-examples.html
InformationsquelleAutor dvdhns
Müssen Sie verstehen, den Unterschied zwischen den sichtbar - Adresse eine E-Mail, und die Lieferung.
msg["To"]
ist im wesentlichen, was gedruckt wird auf den Brief. Es hat nicht wirklich einen Effekt haben. Außer, dass Ihre E-Mail-client, genau wie der normale post-Offizier, wird davon ausgegangen, dass dies ist, wer Sie senden möchten, um die E-Mail zu.Die tatsächliche Lieferung kann jedoch ganz anders. Damit Sie kann drop der E-Mail (oder eine Kopie) in den Briefkasten von jemand ganz anders.
Gibt es verschiedene Gründe. Zum Beispiel Weiterleitung. Die
To:
- header-Feld nicht ändern auf Weiterleitung, jedoch ist die E-Mail-Drop in ein anderes Postfach.Den
smtp.sendmail
Befehl jetzt kümmert sich der tatsächlichen Lieferung.email.Message
ist der Inhalt des Briefes, nicht der Lieferung.In low-level -
SMTP
sind, müssen Sie die receipients one-by-one, das ist der Grund, warum eine Liste von Adressen (nicht einschließlich Namen!) ist die vernünftige API.Für den header, es kann auch enthalten, zum Beispiel den Namen, z.B.
To: First Last <[email protected]>, Other User <[email protected]>
. Dein code Beispiel ist daher nicht empfehlenswert, als es scheitern wird, liefert diese mail, denn nur durch Aufteilung auf,
Sie noch nicht die gültigen Adressen!Dies sollte die akzeptierte Antwort, wie es eigentlich erklärt das warum und das wie.
Tolle Antwort. Was ist CC und BCC E-Mail-Felder? Ich nehme an, wir auch eine CC-und BCC-E-Mail im smtp.senden. Und nur CC-Liste (und nicht BCC-Liste) in der msg-Felder?
Ja, das ist, wie es funktioniert. Mail-Server wird wahrscheinlich fallen die " BCC " - Feld (um zu verhindern, dass diese nicht sichtbar sind, und ich glaube nicht, dass Sie alle nicht), aber Sie wird nicht analysiert.
InformationsquelleAutor Anony-Mousse
Es funktioniert für mich.
Warum nicht einfach
recipients = ['[email protected]','[email protected]']
anstatt es ein string, und dann teilen Sie es zu machen Sie eine Liste?InformationsquelleAutor coolguy
Ich habe versucht, das unten, und es funktionierte wie ein 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()
InformationsquelleAutor TopSecret_007
Ich kam mit dieser importierbar-Modul-Funktion. Es nutzt die Google Mail E-Mail-server in diesem Beispiel. Seine Aufteilung in header und Nachricht, so dass Sie deutlich sehen können, was Los ist:
InformationsquelleAutor radtek
Also eigentlich das problem ist, dass SMTP.sendmail und E-Mail.MIMEText müssen zwei verschiedene Dinge.
E-Mail.MIMEText legt die "To:" - header für den Körper der e-mail. Es ist NUR verwendet für die Anzeige ein Ergebnis, zu dem der Mensch am anderen Ende, und wie alle e-mail-Header, muss eine einzelne Zeichenkette sein. (Beachten Sie, dass es nicht tatsächlich etwas zu tun haben mit den Menschen, die eigentlich die Nachricht erhalten.)
SMTP.sendmail, auf der anderen Seite, legt den "Briefumschlag" der Nachricht für das SMTP-Protokoll. Es muss eine Python-Liste von strings, von denen jeder eine einzelne Adresse.
So, was Sie tun müssen, ist, KOMBINIEREN Sie die beiden Antworten, die Sie erhalten. Set msg['To'], um eine einzelne Zeichenfolge, die übergeben aber die raw-Liste zu sendmail:
InformationsquelleAutor SaiSandeep Golla
Ich dachte mir, diese ein paar Monate zurück und gebloggt über Sie. Die Zusammenfassung ist:
Wenn Sie verwenden möchten, smtplib, um E-Mail senden an mehrere Empfänger, nutzen
email.Message.add_header('To', eachRecipientAsString)
hinzufügen, und dann beim aufrufen des sendmail-Methodeuse email.Message.get_all('To')
senden Sie die Nachricht an alle von Ihnen. Dito für die Cc-und Bcc-Empfänger.InformationsquelleAutor James McPherson
InformationsquelleAutor Omkar
Gut, die Methode in diese asnwer - Methode funktionierte nicht für mich. Ich weiß nicht, vielleicht ist das ein Python ist3 (ich bin mit der 3.4 version) oder gmail Problem, aber nach einigen versuchen, die Lösung, die für mich gearbeitet hat, war die Linie
statt
InformationsquelleAutor Antoine
Ich benutze python 3.6 und der folgende code funktioniert für mich
InformationsquelleAutor Robie
Es funktioniert nur für mich mit send_message-Funktion und mithilfe der join-Funktion in der Liste mit Empfängern, python 3.6.
InformationsquelleAutor Guilherme Henrique Mendes
können Sie versuchen, diese, wenn Sie schreiben, die recpient E-Mails in einer text-Datei
InformationsquelleAutor Skiller Dz