2009-10-09 2 views
68

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

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

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

ответ

106

заголовки электронной почты дону» не имеет значения для сервера smtp. Просто добавьте получателей CC и BCC в toaddrs при отправке электронной почты. Для CC добавьте их в заголовок 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() 
+0

smtplib.SMTP не отправляет списки адресов. По крайней мере, не на python 2.7.2 – LostMohican

+0

В этом случае заголовок BCC, упомянутый в RFC 2822, не имеет никакого смысла. –

+1

@ABentSpoon двоеточие отсутствует после «Subject». – user891260

15

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

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

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

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

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

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

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

15

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

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

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

http://docs.python.org/library/email-examples.html

+3

этот пример не использует CC – hoju

+1

Я согласен что примеры по приведенной ссылке не относятся к Bcc. Это то, что, вероятно, означало @hoju. – shailenTJ

10

Не добавляйте заголовок ОЦК.

Смотреть это: http://mail.python.org/pipermail/email-sig/2004-September/000151.html

И это: «» "Обратите внимание, что второй аргумент Sendmail(), получатель, передаются в виде списка Вы можете включать в себя любое количество адресов в списке, чтобы иметь. сообщение доставляется к каждому из них, в свою очередь. Поскольку информация конверт отдельно от заголовков сообщений, вы можете даже BCC кого-то, включив их в аргументе метода, но не в заголовке сообщения. «»»от 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() 
+0

Незначительные удары: D – Chris

10

Ключевое значение - добавить получателей в список адресов электронной почты в вашем вызове 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['Bcc'] = bcc 
msg.attach(my_msg_body) 
server = smtplib.SMTP("localhost") # or your smtp server 
server.sendmail(me, rcpt, msg.as_string()) 
server.quit() 
+0

В этом вопросе также было запрошено поле ОЦК. –

+1

Вы также можете добавить ОЦК. Я обновил фрагмент. – helios

+0

Оставьте 'msg ['BCC']' off - он отобразит скрытого отправителя и не повлияет на то, отправлено ли ему сообщение или нет (аргументы 'sendmail' делают это). –

1

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

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

и чем добавленным см в получателе [список] как:

s.sendmail(me, [you,cc], msg.as_string()) 
Смежные вопросы