it-swarm.com.de

Wie kann ich E-Mails mit Python Smtplib an mehrere Empfänger senden?

Nach langem Suchen konnte ich nicht herausfinden, wie man smtplib.sendmail für das Senden an mehrere Empfänger verwendet. Das Problem war jedes Mal, wenn die E-Mail gesendet wurde, dass die E-Mail-Header scheinbar mehrere Adressen enthalten würden, tatsächlich würde jedoch nur der erste Empfänger die E-Mail erhalten.

Das Problem scheint zu sein, dass das Modul email.Message etwas anderes erwartet als die Funktion smtplib.sendmail() .

Kurz gesagt: Um an mehrere Empfänger zu senden, sollten Sie den Header auf eine Folge von durch Kommas getrennten E-Mail-Adressen setzen. 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()
149
user1148320

Dieses wirklich funktioniert, ich habe viel Zeit damit verbracht, verschiedene Varianten auszuprobieren.

import smtplib
from email.mime.text import MIMEText

s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = '[email protected]'
recipients = ['[email protected]', '[email protected]']
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = ", ".join(recipients)
s.sendmail(sender, recipients, msg.as_string())
254
sorin

Der msg['To'] muss eine Zeichenfolge sein:

msg['To'] = "[email protected], [email protected], [email protected]"

Während recipients in sendmail(sender, recipients, message) eine Liste sein muss:

sendmail("[email protected]", ["[email protected]", "[email protected]", "[email protected]"], "Howdy")
121
dvdhns

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 steht. Es hat eigentlich keine Wirkung. Nur dass Ihr E-Mail-Client genau wie der normale Postbeamte davon ausgeht, dass Sie die E-Mail an diese Person senden möchten.

Die tatsächliche Lieferung kann jedoch ganz anders funktionieren. So können Sie die E-Mail (oder eine Kopie) in den Briefkasten einer völlig anderen Person legen .

Hierfür gibt es verschiedene Gründe. Zum Beispiel Weiterleitung . Das Header-Feld To: ändert sich beim Weiterleiten nicht, die E-Mail wird jedoch in ein anderes Postfach verschoben.

Der Befehl smtp.sendmail kümmert sich jetzt um die tatsächliche Zustellung. email.Message ist nur der Inhalt des Briefes, nicht die Zustellung.

In Low-Level 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 fehlschlagen wird, da Sie durch einfaches Aufteilen auf , immer noch nicht über die gültigen Adressen verfügen!

37
Anony-Mousse

Für mich geht das.

import smtplib
from email.mime.text import MIMEText

s = smtplib.SMTP('smtp.uk.xensource.com')
s.set_debuglevel(1)
msg = MIMEText("""body""")
sender = '[email protected]'
recipients = '[email protected],[email protected]'
msg['Subject'] = "subject line"
msg['From'] = sender
msg['To'] = recipients
s.sendmail(sender, recipients.split(','), msg.as_string())
13
coolguy

Ich habe das unten ausprobiert und es hat wie ein Zauber funktioniert :)

rec_list =  ['[email protected]', '[email protected]']
rec =  ', '.join(rec_list)

msg['To'] = rec

send_out = smtplib.SMTP('localhost')
send_out.sendmail(me, rec_list, msg.as_string())
8
TopSecret_007

Ich habe mir diese importierbare Modulfunktion ausgedacht. In diesem Beispiel wird der Google Mail-E-Mail-Server verwendet. Es ist in Header und Nachricht aufgeteilt, sodass Sie deutlich sehen können, was los ist:

import smtplib

def send_alert(subject=""):

    to = ['[email protected]', '[email protected]_email.com', '[email protected]']
    gmail_user = '[email protected]'
    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()
6
radtek

Ich habe das vor ein paar Monaten herausgefunden und darüber gebloggt . Die Zusammenfassung ist:

Wenn Sie mit smtplib E-Mails an mehrere Empfänger senden möchten, fügen Sie diese mit email.Message.add_header('To', eachRecipientAsString) hinzu. Wenn Sie die sendmail-Methode aufrufen, senden Sie use email.Message.get_all('To') die Nachricht an alle. Gleiches gilt für Cc- und Bcc-Empfänger.

5
James McPherson

Das eigentliche Problem ist also, dass SMTP.sendmail und email.MIMEText zwei verschiedene Dinge benötigen.

email.MIMEText richtet den "An:" -Header für den Hauptteil der E-Mail ein. Es wird NUR für die Anzeige eines Ergebnisses für den Menschen am anderen Ende verwendet und muss wie alle E-Mail-Header eine einzige Zeichenfolge sein. (Beachten Sie, dass es nicht unbedingt etwas mit den Personen zu tun hat, die die Nachricht tatsächlich erhalten.)

Andererseits richtet SMTP.sendmail den "Umschlag" der Nachricht für das SMTP-Protokoll ein. Es benötigt eine Python-Liste von Strings, von denen jeder eine einzige Adresse hat.

Sie müssen also die beiden Antworten, die Sie erhalten haben, KOMBINIEREN. Setzen Sie msg ['To'] auf eine einzelne Zeichenfolge, übergeben Sie die unformatierte Liste jedoch an sendmail:

emails = ['a.com','b.com', 'c.com']
msg['To'] = ', '.join( emails ) 
....
s.sendmail( msg['From'], emails, msg.as_string())
4

Nun, die Methode in this asnwer method hat für mich nicht funktioniert. Ich weiß nicht, vielleicht handelt es sich hierbei um ein Python3 (ich verwende die Version 3.4) oder ein Problem mit Google Mail, aber nach einigen Versuchen war die Lösung, die für mich funktionierte, die Linie

s.send_message(msg)

anstatt

s.sendmail(sender, recipients, msg.as_string())
2
Antoine

Ich benutze Python 3.6 und der folgende Code funktioniert für mich

email_send = '[email protected],[email protected]'
server.sendmail(email_user,email_send.split(','),text)    
1
Robie
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def sender(recipients): 

    body = 'Your email content here'
    msg = MIMEMultipart()

    msg['Subject'] = 'Email Subject'
    msg['From'] = '[email protected]'
    msg['To'] = (', ').join(recipients.split(','))

    msg.attach(MIMEText(body,'plain'))

    server = smtplib.SMTP('smtp.gmail.com', 587)
    server.starttls()
    server.login('[email protected]', 'yourpassword')
    server.send_message(msg)
    server.quit()

if __== '__main__':
    sender('[email protected],[email protected]')

Es funktionierte nur für mich mit der send_message-Funktion und der Verwendung der Join-Funktion in der Liste mit den Empfängern, Python 3.6. 

Below worked for me.
It sends email to multiple with attachment - "To", "Cc" & "Bcc" successfully.


toaddr = ['mailid_1','mailid_2']
cc = ['mailid_3','mailid_4']
bcc = ['mailid_5','mailid_6']
subject = 'Email from Python Code'
fromaddr = 'sender_mailid'
message = "\n  !! Hello... !!"

msg['From'] = fromaddr
msg['To'] = ', '.join(toaddr)
msg['Cc'] = ', '.join(cc)
msg['Bcc'] = ', '.join(bcc)
msg['Subject'] = subject

s.sendmail(fromaddr, (toaddr+cc+bcc) , message)
0
Omkar

sie können dies versuchen, wenn Sie die Empfänger-E-Mails in eine Textdatei schreiben

from email.mime.text import MIMEText
from email.header import Header
import smtplib

f =  open('emails.txt', 'r').readlines()
for n in f:
     emails = n.rstrip()
server = smtplib.SMTP('smtp.uk.xensource.com')
server.ehlo()
server.starttls()
body = "Test Email"
subject = "Test"
from = "[email protected]"
to = emails
msg = MIMEText(body,'plain','utf-8')
msg['Subject'] = Header(subject, 'utf-8')
msg['From'] =  Header(from, 'utf-8')
msg['To'] = Header(to, 'utf-8')
text = msg.as_string()
try:
   server.send(from, emails, text)
   print('Message Sent Succesfully')
except:
   print('There Was An Error While Sending The Message')
0
Skiller Dz