it-swarm-eu.dev

Come inviare e-mail a più destinatari usando python smtplib?

Dopo molte ricerche non sono riuscito a scoprire come usare smtplib.sendmail per inviare a più destinatari. Il problema era che ogni volta che veniva inviata la posta le intestazioni di posta sembravano contenere più indirizzi, ma in realtà solo il primo destinatario avrebbe ricevuto l'e-mail.

Il problema sembra essere che il email.Message module si aspetta qualcosa di diverso dalla funzione smtplib.sendmail() .

In breve, per inviare a più destinatari, è necessario impostare l'intestazione come una stringa di indirizzi e-mail delimitati da virgole. Il parametro sendmail()to_addrs tuttavia dovrebbe essere un elenco di indirizzi email.

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

Questo funziona davvero , ho passato molto tempo a provare più varianti.

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

Il msg['To'] deve essere una stringa:

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

Mentre recipients in sendmail(sender, recipients, message) deve essere una lista:

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

È necessario comprendere la differenza tra l'indirizzo visibiledi un'e-mail e il consegna.

msg["To"] è essenzialmente ciò che è stampato sulla lettera. In realtà non ha alcun effetto. Tranne che il tuo client di posta elettronica, proprio come il normale funzionario di posta, presumerà che sia questo a cui desideri inviare l'email.

La consegna effettiva tuttavia può funzionare in modo abbastanza diverso. Quindi can rilascia l'email (o una copia) nella casella postale di qualcuno completamente diverso.

Ci sono diverse ragioni per questo. Ad esempio inoltro. Il campo dell'intestazione To: non cambia durante l'inoltro, tuttavia l'e-mail viene rilasciata in una casella di posta diversa.

Il comando smtp.sendmail ora si occupa della consegna effettiva. email.Message è solo il contenuto della lettera, non la consegna.

In SMTP di basso livello, è necessario fornire i destinatari uno per uno, motivo per cui l'elenco degli indirizzi (esclusi i nomi!) È l'API ragionevole.

Per l'intestazione, può anche contenere per esempio il nome, ad es. To: First Last <[email protected]>, Other User <[email protected]>. Il tuo esempio di codice quindi non è raccomandato , dato che fallirà nel consegnare questa mail, dato che semplicemente dividendolo su , non hai ancora gli indirizzi validi!

34
Anony-Mousse

Per me funziona.

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

Ho provato il sotto e ha funzionato come un fascino :)

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

Mi è venuta in mente questa funzione modulare del modulo. In questo esempio utilizza il server di posta elettronica di Gmail. Si divide in intestazione e messaggio in modo da poter vedere chiaramente che cosa sta succedendo:

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

L'ho capito alcuni mesi fa e ne ho parlato a fondo . Il riassunto è:

Se si desidera utilizzare smtplib per inviare e-mail a più destinatari, utilizzare email.Message.add_header('To', eachRecipientAsString) per aggiungerli, quindi quando si richiama il metodo sendmail, use email.Message.get_all('To') invia il messaggio a tutti loro. Idem per i destinatari di Cc e Ccn.

5
James McPherson

Quindi in realtà il problema è che SMTP.sendmail ed email.MIMEText hanno bisogno di due cose diverse.

email.MIMEText imposta l'intestazione "A:" per il corpo dell'e-mail. Viene utilizzato SOLO per mostrare un risultato all'essere umano all'altro capo e, come tutte le intestazioni di posta elettronica, deve essere una stringa singola. (Nota che in realtà non deve avere nulla a che fare con le persone che effettivamente ricevono il messaggio.)

SMTP.sendmail, d'altra parte, imposta la "busta" del messaggio per il protocollo SMTP. Ha bisogno di un elenco Python di stringhe, ognuna delle quali ha un unico indirizzo.

Quindi, ciò che devi fare è COMBINARE le due risposte che hai ricevuto. Imposta msg ['To'] su una singola stringa, ma passa la lista raw a sendmail:

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

Bene, il metodo in questo metodo asnwer non ha funzionato per me. Non lo so, forse questo è un problema Python3 (sto usando la versione 3.4) o gmail, ma dopo alcuni tentativi, la soluzione che ha funzionato per me è stata la linea

s.send_message(msg)

invece di

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

Io uso Python 3.6 e il seguente codice funziona per me

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]')

Funzionava solo per me con la funzione send_message e usando la funzione join nella lista con i destinatari, 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