Nach langem Suchen konnte ich nicht herausfinden, wie man mit smtplib.sendmail an mehrere Empfänger sendet. Das Problem war, dass jedes Mal, wenn die E-Mail gesendet wurde, die E-Mail-Header mehrere Adressen enthielten, aber tatsächlich nur der erste Empfänger die E-Mail erhielt.
Das Problem scheint zu sein, dass das email.Message
Modul etwas anderes als die smtplib.sendmail()
Funktion erwartet .
Kurz gesagt, um an mehrere Empfänger zu senden, sollten Sie den Header als eine Zeichenfolge von durch Kommas getrennten E-Mail-Adressen festlegen. Der sendmail()
Parameter to_addrs
sollte jedoch eine Liste von E-Mail-Adressen sein.
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
braucht eine Liste.for addr in recipients: msg['To'] = addr
und dann hat es funktioniert. Bei mehreren Zuweisungen wird tatsächlich für jede ein neuer 'An'-Header angehängt. Dies ist eine sehr bizarre Oberfläche, ich kann nicht einmal erklären, wie ich dachte, es zu versuchen. Ich habe sogar darüber nachgedachtsubprocess
, das Unix-sendmail
Paket aufzurufen , um meine geistige Gesundheit zu retten, bevor ich das herausgefunden habe.Antworten:
Das funktioniert wirklich , ich habe viel Zeit damit verbracht, mehrere Varianten auszuprobieren.
quelle
tolist =["[email protected]","[email protected]","[email protected]","[email protected]"]
send_message
anstelle vonsendmail
Antoines Kommentar unten und den Python-Dokumenten docs.python.org/3/library/email-examples.htmlDas
msg['To']
muss eine Zeichenfolge sein:Während das
recipients
insendmail(sender, recipients, message)
eine Liste sein muss:quelle
smtplib.
recipients
muss keine Liste sein - wenn eine Zeichenfolge angegeben wird, wird sie als Liste mit einem Element behandelt. Diemsg['To']
Zeichenfolge kann einfach weggelassen werden.Sie müssen den Unterschied zwischen der sichtbaren Adresse einer E-Mail und der Zustellung verstehen .
msg["To"]
ist im Wesentlichen das, was auf dem Brief gedruckt ist. Es hat eigentlich keine Wirkung. Abgesehen davon, dass Ihr E-Mail-Client genau wie der reguläre Postbeamte davon ausgeht, an wen Sie die E-Mail senden möchten.Die tatsächliche Lieferung kann jedoch ganz anders funktionieren. So Sie können die E - Mail (oder eine Kopie) in den Briefkasten von jemand ganz anderes fallen.
Dafür gibt es verschiedene Gründe. Zum Beispiel Weiterleitung . Das
To:
Header-Feld ändert sich bei der Weiterleitung nicht, die E-Mail wird jedoch in einem anderen Postfach abgelegt.Der
smtp.sendmail
Befehl kümmert sich nun um die eigentliche Lieferung.email.Message
ist nur der Inhalt des Briefes, nicht die Lieferung.In der unteren Ebene
SMTP
müssen Sie die Empfänger einzeln angeben, weshalb eine Liste von Adressen (ohne Namen!) Die sinnvolle API ist.Für den Header kann er beispielsweise auch den Namen enthalten, z
To: First Last <[email protected]>, Other User <[email protected]>
. Ihr Codebeispiel wird daher nicht empfohlen , da die Zustellung dieser E-Mail fehlschlägt, da Sie durch,
einfaches Aufteilen immer noch nicht über die gültigen Adressen verfügen!quelle
Für mich geht das.
quelle
recipients = ['[email protected]','[email protected]']
anstatt es zu einem String zu machen und es dann zu teilen, um eine Liste zu erstellen?Ich habe das unten versucht und es hat wie ein Zauber funktioniert :)
quelle
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()
Das eigentliche Problem ist also, dass SMTP.sendmail und email.MIMEText zwei verschiedene Dinge benötigen.
email.MIMEText richtet den Header "An:" für den Text der E-Mail ein. Es wird NUR verwendet, um dem Menschen am anderen Ende ein Ergebnis anzuzeigen, und muss wie alle E-Mail-Header eine einzelne Zeichenfolge sein. (Beachten Sie, dass es eigentlich nichts mit den Personen zu tun haben muss, die die Nachricht tatsächlich erhalten.)
SMTP.sendmail hingegen richtet den "Umschlag" der Nachricht für das SMTP-Protokoll ein. Es benötigt eine Python-Liste von Zeichenfolgen, von denen jede eine einzelne Adresse hat.
Sie müssen also die beiden erhaltenen Antworten KOMBINIEREN. Setzen Sie msg ['To'] auf eine einzelne Zeichenfolge, übergeben Sie die Rohliste jedoch an sendmail:
quelle
Ich habe mir diese importierbare Modulfunktion ausgedacht. In diesem Beispiel wird der Google Mail-E-Mail-Server verwendet. Es ist in Header und Nachricht unterteilt, sodass Sie klar sehen können, was los ist:
quelle
Ich habe das vor ein paar Monaten herausgefunden und darüber gebloggt . Die Zusammenfassung lautet:
Wenn Sie smtplib verwenden möchten, um E-Mails an mehrere Empfänger zu senden
email.Message.add_header('To', eachRecipientAsString)
, fügen Sie diese hinzu. Wenn Sie dann die sendmail-Methode aufrufen,use email.Message.get_all('To')
senden Sie die Nachricht an alle. Das Gleiche gilt für Cc- und Bcc-Empfänger.quelle
Die folgende Lösung hat bei mir funktioniert. Es wird erfolgreich eine E-Mail an mehrere Empfänger gesendet, einschließlich "CC" und "BCC".
quelle
Nun, die Methode in dieser Antwortmethode hat bei mir nicht funktioniert. Ich weiß nicht, vielleicht ist dies ein Python3- (ich verwende die 3.4-Version) oder ein Google Mail-Problem, aber nach einigen Versuchen war die Lösung, die für mich funktioniert hat, die Leitung
anstatt
quelle
Ich benutze Python 3.6 und der folgende Code funktioniert für mich
quelle
Es funktionierte nur bei mir mit der Funktion send_message und der Verwendung der Join-Funktion in der Liste mit Empfängern, Python 3.6.
quelle
Sie können dies versuchen, wenn Sie die Empfänger-E-Mails in eine Textdatei schreiben
quelle