web-dev-qa-db-fra.com

python: comment envoyer des mails avec TO, CC et BCC?

Il me faut, à des fins de test, remplir plusieurs centaines de boîtes de courrier électronique avec divers messages, et j'allais utiliser smtplib pour cela. Mais entre autres choses, je dois pouvoir envoyer des messages non seulement à des boîtes aux lettres spécifiques, mais aussi à CC et à la CCC. Cela ne ressemble pas à smtplib supporte CC-ing et BCC-ing lors de l'envoi d'emails.

Vous recherchez des suggestions sur la manière dont CC ou BCC envoient des messages à partir du script python.

(Et - non, je ne crée pas de script pour envoyer du spam à quelqu'un en dehors de mon environnement de test.)

89
user63503

Les en-têtes de messagerie n'importent pas au serveur SMTP. Ajoutez simplement les destinataires CC et BCC aux noms lorsque vous envoyez votre courrier électronique. Pour CC, ajoutez-les à l'en-tête CC.

toaddr = '[email protected]'
cc = ['[email protected]','[email protected]']
bcc = ['[email protected]']
fromaddr = '[email protected]'
message_subject = "disturbance in sector 7"
message_text = "Three are dead in an attack in the sewers below sector 7."
message = "From: %s\r\n" % fromaddr
        + "To: %s\r\n" % toaddr
        + "CC: %s\r\n" % ",".join(cc)
        + "Subject: %s\r\n" % message_subject
        + "\r\n" 
        + message_text
toaddrs = [toaddr] + cc + bcc
server = smtplib.SMTP('smtp.sunnydale.k12.ca.us')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, message)
server.quit()
134
ABentSpoon

L’important est d’ajouter les destinataires en tant que liste des identifiants d’e-mail dans votre appel sendmail.

import smtplib
from email.mime.multipart import MIMEMultipart

me = "[email protected]"
to = "[email protected]"
cc = "[email protected],[email protected]"
bcc = "[email protected],[email protected]"

rcpt = cc.split(",") + bcc.split(",") + [to]
msg = MIMEMultipart('alternative')
msg['Subject'] = "my subject"
msg['To'] = to
msg['Cc'] = cc
msg.attach(my_msg_body)
server = smtplib.SMTP("localhost") # or your smtp server
server.sendmail(me, rcpt, msg.as_string())
server.quit()
29
helios

N'ajoutez pas l'en-tête cci.

Voir ceci: http://mail.python.org/pipermail/email-sig/2004-September/000151.html

Et ceci: "" "Notez que le deuxième argument de sendmail (), les destinataires, est transmis sous forme de liste. Vous pouvez inclure un nombre quelconque d'adresses dans la liste pour que le message leur soit remis à tour de rôle. Depuis l'enveloppe. les informations sont séparées des en-têtes de message, vous pouvez même contacter quelqu'un BCC en les incluant dans l'argument de la méthode mais pas dans l'en-tête du message. "" "de http://pymotw.com/2/smtplib

toaddr = '[email protected]'
cc = ['[email protected]','[email protected]']
bcc = ['[email protected]']
fromaddr = '[email protected]'
message_subject = "disturbance in sector 7"
message_text = "Three are dead in an attack in the sewers below sector 7."
message = "From: %s\r\n" % fromaddr
    + "To: %s\r\n" % toaddr
    + "CC: %s\r\n" % ",".join(cc)
    # don't add this, otherwise "to and cc" receivers will know who are the bcc receivers
    # + "BCC: %s\r\n" % ",".join(bcc)
    + "Subject: %s\r\n" % message_subject
    + "\r\n" 
    + message_text
toaddrs = [toaddr] + cc + bcc
server = smtplib.SMTP('smtp.sunnydale.k12.ca.us')
server.set_debuglevel(1)
server.sendmail(fromaddr, toaddrs, message)
server.quit()
20
Leonardo Andrade

La distinction entre TO, CC et BCC n'apparaît que dans les en-têtes de texte. Au niveau SMTP, tout le monde est un destinataire.

TO - Il y a un en-tête TO: avec l'adresse de ce destinataire.

CC - Il existe un en-tête CC: avec l'adresse de ce destinataire.

BCC - Ce destinataire n'est pas du tout mentionné dans les en-têtes, mais reste un destinataire.

Si tu as

TO: [email protected]
CC: [email protected]
BCC: [email protected]

Vous avez trois destinataires. Les en-têtes dans le corps de l'e-mail incluront uniquement les objets TO: et CC:

16
Jim Garrison

Vous pouvez essayer MIMEText

msg = MIMEText('text')
msg['to'] = 
msg['cc'] = 

puis envoyez msg.as_string ()

https://docs.python.org/3.6/library/email.examples.html

15
foosion

Cela n'a pas fonctionné pour moi jusqu'à ce que je crée:

#created cc string
cc = ""[email protected];
#added cc to header
msg['Cc'] = cc

et que ajouté dans le destinataire [liste] comme:

s.sendmail(me, [you,cc], msg.as_string())
5
marko_b123

À partir de Python 3.2, publié en 2011, smtplib a une nouvelle fonction send_message _ au lieu de sendmail, ce qui facilite les transactions avec To/CC/BCC. En tirant de la exemples d'e-mails officiels Python , avec quelques légères modifications, nous obtenons:

# Import smtplib for the actual sending function
import smtplib

# Import the email modules we'll need
from email.message import EmailMessage

# Open the plain text file whose name is in textfile for reading.
with open(textfile) as fp:
    # Create a text/plain message
    msg = EmailMessage()
    msg.set_content(fp.read())

# me == the sender's email address
# you == the recipient's email address
# them == the cc's email address
# they == the bcc's email address
msg['Subject'] = 'The contents of %s' % textfile
msg['From'] = me
msg['To'] = you
msg['Cc'] = them
msg['Bcc'] = they


# Send the message via our own SMTP server.
s = smtplib.SMTP('localhost')
s.send_message(msg)
s.quit()

L'utilisation des en-têtes fonctionne bien, car send_message respecte BCC comme indiqué dans la documentation :

send_message ne transmet aucun en-tête Cci ou Resent-Cci pouvant apparaître dans le message.


Avec sendmail, il était courant d’ajouter les en-têtes CC au message, en effectuant une opération telle que:

msg['Bcc'] = [email protected]

Ou

msg = "From: [email protected]" +
      "To: [email protected]" +
      "BCC: [email protected]" +
      "Subject: You've got mail!" +
      "This is the message body"

Le problème est que la fonction sendmail traite tous ces en-têtes de la même manière, ce qui signifie qu'ils seront envoyés (visiblement) à tous les utilisateurs de To: et BCC:, ce qui irait à l'encontre des objectifs de BCC. La solution, comme le montrent de nombreuses autres réponses ici, était de ne pas inclure BCC dans les en-têtes, mais uniquement dans la liste des courriels transmis à sendmail.

La mise en garde est que send_message nécessite un objet Message, ce qui signifie que vous devrez importer une classe de email.message au lieu de simplement passer des chaînes dans sendmail.

2
Web Head