python: как отправить почту с TO, CC и BCC? - PullRequest
87 голосов
/ 10 октября 2009

Мне нужно в целях тестирования заполнить несколько сотен почтовых ящиков различными сообщениями, и я собирался использовать для этого smtplib. Но помимо всего прочего мне нужно иметь возможность отправлять сообщения не только на определенные почтовые ящики, но и на CC и BCC. Не похоже, что smtplib поддерживает CC-IN и BCC-IN при отправке электронной почты.

Ищет предложения, как сделать CC или BCC, отправляя сообщения из скрипта Python.

(И - нет, я не создаю сценарий для рассылки спама кому-либо за пределами моей среды тестирования.)

Ответы [ 7 ]

132 голосов
/ 10 октября 2009

Заголовки электронной почты не имеют значения для сервера SMTP. Просто добавьте получателей CC и BCC к toaddrs при отправке электронной почты. Для 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()
26 голосов
/ 29 апреля 2015

Ключевым моментом является добавление получателей в виде списка идентификаторов электронной почты в вызове 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()
20 голосов
/ 14 апреля 2015

Не добавлять заголовок скрытой копии.

Смотрите это: 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()
17 голосов
/ 10 октября 2009

Различие между TO, CC и BCC встречается только в текстовых заголовках. На уровне SMTP каждый является получателем.

TO - есть заголовок TO: с адресом этого получателя

CC - заголовок CC: с адресом получателя

BCC - этот получатель вообще не упоминается в заголовках, но все еще является получателем.

Если у вас есть

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

У вас есть три получателя. Заголовки в теле письма будут включать только TO: и CC:

15 голосов
/ 10 октября 2009

Вы можете попробовать MIMEText

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

затем отправьте msg.as_string ()

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

5 голосов
/ 13 января 2017

Это не сработало для меня, пока я не создал:

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

, а затем добавил копию в получателе [список], как:

s.sendmail(me, [you,cc], msg.as_string())
0 голосов
/ 30 мая 2019

Начиная с 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, которые могут появиться в сообщении


При 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 обрабатывает все эти заголовки одинаково, то есть они будут отправлены (видимым образом) всем пользователям To: и BCC:, что противоречит целям BCC. Решение, как показано во многих других ответах здесь, заключалось в том, чтобы не включать BCC в заголовки, а вместо этого только в список электронных писем, передаваемых на sendmail.

Предостережение заключается в том, что send_message требует объект Message, то есть вам нужно импортировать класс из email.message вместо простой передачи строк в sendmail.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...