python: як надсилати пошту з TO, CC та BCC?


102

Мені потрібно для тестування заповнити кілька сотень скриньок електронної пошти різними повідомленнями, і я збирався використовувати для цього smtplib. Але, серед іншого, мені потрібно вміти надсилати повідомлення не лише конкретним поштовим скринькам TO, а й CC та BCC. Схоже, smtplib підтримує CC-ing та BCC-ing під час надсилання електронної пошти.

Шукаєте пропозиції, як зробити CC або BCC надсилання повідомлень із сценарію python.

(І - ні, я не створюю сценарій, щоб спамувати когось поза моїм тестовим середовищем.)

Відповіді:


150

Заголовки електронної пошти не мають значення для сервера smtp. Просто додайте одержувачів CC та BCC до жаб, коли ви надсилаєте електронний лист. Для CC додайте їх до заголовка CC.

toaddr = 'buffy@sunnydale.k12.ca.us'
cc = ['alexander@sunydale.k12.ca.us','willow@sunnydale.k12.ca.us']
bcc = ['chairman@slayerscouncil.uk']
fromaddr = 'giles@sunnydale.k12.ca.us'
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()

smtplib.SMTP не надсилає списки щодо адрес. Принаймні, не на python 2.7.2
LostMohican

У цьому випадку заголовок BCC, згаданий у RFC 2822, не має жодного сенсу.
Chenxiong Qi

1
@ABentSpoon двокрапка після "Тема" відсутня.
користувач891260

3
Не додайте заголовок bcc. Дивіться це: mail.python.org/pipermail/email-sig/2004-September/000151.html І це: "" "Зауважте, що другий аргумент для sendmail (), одержувачів, передається як список. Ви можете включити будь-яку кількість адрес у списку, щоб повідомлення по черзі надходило до кожного з них. Оскільки інформація про конверт відокремлена від заголовків повідомлень, ви навіть можете BCC когось, включивши їх у аргумент методу, а не у заголовок повідомлення. " "" з pymotw.com/2/smtplib
Леонардо Андраде

2
Це ніколи не буде BCC або CC - це буде завжди До
Процвітаюче

37

Ключова річ - додати одержувачів як список ідентифікаторів електронної пошти у вашому дзвінку sendmail.

import smtplib
from email.mime.multipart import MIMEMultipart

me = "user63503@gmail.com"
to = "someone@gmail.com"
cc = "anotherperson@gmail.com,someone@yahoo.com"
bcc = "bccperson1@gmail.com,bccperson2@yahoo.com"

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()

4
Залиште msg['BCC']вимкненим - він виявляє вашого прихованого відправника і не впливає на те, надіслане їм повідомлення чи ні (аргументи для sendmailцього).
Еріка Кейн

2
Я згоден з Ерікою та Хуліо. Намір Bcc полягає в тому, щоб приховати приймач до інших приймачів. Якщо його в повідомленні, це перемагає мету.
Тімоті К. Квін

19

Не додайте заголовок bcc.

Дивіться це: http://mail.python.org/pipermail/email-sig/2004-September/000151.html

І це: "" "Зауважте, що другий аргумент адресатів sendmail (), передається як список. Ви можете включити до списку будь-яку кількість адрес, щоб повідомлення по черзі було доставлено кожному з них. З моменту конверта інформація окрема від заголовків повідомлень, ви можете навіть BCC когось, включивши їх у аргумент методу, але не у заголовок повідомлення. "" "з http://pymotw.com/2/smtplib

toaddr = 'buffy@sunnydale.k12.ca.us'
cc = ['alexander@sunydale.k12.ca.us','willow@sunnydale.k12.ca.us']
bcc = ['chairman@slayerscouncil.uk']
fromaddr = 'giles@sunnydale.k12.ca.us'
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()

Великі пальці для чуття: D
Кріс

19

Станом на Python 3.2, що вийшов у листопаді 2011 року, smtplib має нову функцію send_messageзамість справедливої sendmail, що полегшує роботу з To / CC / BCC. Витягуючи з офіційних прикладів електронної пошти Python , з невеликими модифікаціями, ми отримуємо:

# 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()

Використання заголовків працює добре, оскільки send_message поважає BCC, як зазначено в документації :

send_message не передає жодних заголовків Bcc або Resent-Bcc, які можуть з’являтися у msg


Зазвичай sendmailбуло додати до повідомлення заголовки CC, роблячи щось таке:

msg['Bcc'] = blind.email@adrress.com

Або

msg = "From: from.email@address.com" +
      "To: to.email@adress.com" +
      "BCC: hidden.email@address.com" +
      "Subject: You've got mail!" +
      "This is the message body"

Проблема полягає в тому, що функція sendmail трактує всі ці заголовки однаково, це означає, що вони будуть надіслані (видимо) всім користувачам: та BCC: перемагаючи цілі BCC. Рішення, як показано в багатьох інших відповідях тут, полягала в тому, щоб не включати BCC до заголовків, а натомість лише до списку електронних листів, переданих до sendmail.

Застереження полягає в тому, що send_messageпотрібен об’єкт Message, тобто вам потрібно імпортувати клас, email.messageа не просто передавати рядки в sendmail.


2
Щойно переконався, що send_message (msg) обробляє додані копії до електронної пошти EmailMessage - msg ['Cc'] Якщо ви використовуєте Python 3, це шлях.
bmiller

@bmiller Yup, досить зручно. Я написав цю відповідь, тому що я розглядав її і знайшов простіший спосіб у документах та інших рефератах, і це добре спрацювало для мене, і я подумав, що це заслужив місце тут, оскільки багато людей заглянуть сюди першими.

не тільки я вважаю це рішення більш елегантним, але воно працює чудово. Це також вирішує проблему, яку я мав у відповіді від @ABentSpoon, а це те, що для адреси gmail у CC, повідомлення електронної пошти не надходили у папку "Вхідні", а замість неї "Вся пошта".
Гійом Гаррігос

18

Розмежування TO, CC та BCC відбувається лише у заголовках тексту. На рівні SMTP кожен є реципієнтом.

ДО - Є заголовок TO: адреса цього одержувача

CC - Заголовок CC: адреса цього адресата

BCC - Цей одержувач взагалі не згадується в заголовках, але все ж є одержувачем.

Якщо у вас є

TO: abc@company.com
CC: xyz@company.com
BCC: boss@company.com

У вас є три одержувачі. Заголовки в тілі електронної пошти включатимуть лише TO: і CC:


16

Ви можете спробувати MIMEText

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

потім надішліть msg.as_string ()

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


4
цей приклад не використовує CC
hoju

1
Я погоджуюся, що приклади на вищенаведеному посиланні не відносяться до Bcc. Це, мабуть, мав на увазі @hoju.
Шейлен

5

Це не працювало для мене, поки я не створив:

#created cc string
cc = ""someone@domain.com;
#added cc to header
msg['Cc'] = cc

і чим додано куб. см в одержувача [список], наприклад:

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

2

Жодне з перерахованих вище речей не працювало для мене, оскільки у мене було декілька одержувачів як у «до», так і у «куб.см». Тому я спробував, як нижче:

recipients = ['abc@gmail.com', 'xyz@gmail.com']
cc_recipients = ['lmn@gmail.com', 'pqr@gmail.com']
MESSAGE['To'] = ", ".join(recipients)
MESSAGE['Cc'] = ", ".join(cc_recipients)

і розширити "одержувачів" за допомогою "cc_recipients" та надсилати пошту тривіально

recipients.extend(cc_recipients)
server.sendmail(FROM,recipients,MESSAGE.as_string())
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.