파이썬 : TO, CC 및 BCC로 메일을 보내는 방법은 무엇입니까?


102

수백 개의 이메일 상자를 다양한 메시지로 채우려면 테스트 목적으로 필요하며이를 위해 smtplib를 사용하려고했습니다. 그러나 무엇보다도 특정 메일 함뿐만 아니라 참조 및 숨은 참조로 메시지를 보낼 수 있어야합니다. smtplib 가 이메일을 보내는 동안 CC-ing 및 BCC-ing을 지원하는 것처럼 보이지 않습니다 .

python 스크립트에서 메시지를 보내는 CC 또는 BCC를 수행하는 방법에 대한 제안을 찾고 있습니다.

(그리고 — 아니요, 테스트 환경 외부에있는 사람에게 스팸을 보내는 스크립트를 작성하지 않습니다.)

답변:


150

이메일 헤더는 smtp 서버에 중요하지 않습니다. 이메일을 보낼 때 참조 및 숨은 참조 수신자를 추가하기 만하면됩니다. 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는 주소에 대한 목록을 보내지 않습니다. 파이썬 2.7.2에 이상하지에서
LostMohican

이 경우 RFC 2822에 언급 된 BCC 헤더는 의미가 없습니다.
Chenxiong Qi

1
@ABentSpoon 'Subject'뒤에 콜론이 없습니다.
user891260

3
숨은 참조 헤더를 추가하지 마세요. 다음을 참조하십시오 : mail.python.org/pipermail/email-sig/2004-September/000151.html 그리고 이것은 : "" "sendmail ()의 두 번째 인수 인 수신자가 목록으로 전달됩니다. 다음을 포함 할 수 있습니다. 목록에있는 주소의 수에 관계없이 각 주소로 메시지를 차례로 전달합니다. 봉투 정보는 메시지 헤더와 분리되어 있으므로 메시지 헤더가 아닌 메소드 인수에 포함하여 누군가를 숨은 참조로 보낼 수도 있습니다. " ""from pymotw.com/2/smtplib
Leonardo Andrade

2
이것은 결코 BCC 또는 CC는 것 - 항상하는 것
ProsperousHeart

37

중요한 것은 수신자를 sendmail 호출에서 이메일 ID 목록 으로 추가하는 것입니다 .

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.
Erica Kane

2
Erica와 Julio에 동의합니다. Bcc의 의도는 수신자를 다른 수신자에게 숨기는 것입니다. 메시지에 포함 된 경우 목적에 맞지 않습니다.
Timothy C. Quinn

19

숨은 참조 헤더를 추가하지 마세요.

이것을보십시오 : http://mail.python.org/pipermail/email-sig/2004-September/000151.html

그리고 이것은 : "" "sendmail ()에 대한 두 번째 인수 인 수신자가 목록으로 전달된다는 점에 유의하십시오. 목록에 여러 주소를 포함하여 메시지가 차례로 각 주소로 전달되도록 할 수 있습니다. 정보는 메시지 헤더와 분리되어 있으므로 누군가를 메소드 인수에 포함하고 메시지 헤더에는 포함하지 않음으로써 숨은 참조를 할 수도 있습니다. "" "from 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

2011 년 11 월에 출시 된 Python 3.2부터 smtplib에는. send_message대신 새로운 기능 sendmail이있어 To / CC / BCC를 더 쉽게 처리 할 수 ​​있습니다. 으로부터 당기기 파이썬 공식 이메일 예 약간의 수정을, 우리가 얻을 :

# 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는 msg에 나타날 수있는 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단순히 문자열을 .NET으로 전달하는 대신 클래스를 가져와야한다는 의미 sendmail입니다.


2
방금 send_message (msg)가 EmailMessage에 추가 된 참조를 처리하는지 확인했습니다.-msg [ 'Cc'] Python 3을 사용하는 경우 이것이 갈 길입니다.
bmiller 2019

@bmiller 예, 아주 편리합니다. 나는 그것을 조사하고 문서와 다른 심판에서 더 간단한 방법을 찾았 기 때문에이 답변을 작성했으며 나에게 잘 맞았고 많은 사람들이 여기에서 1 위를 볼 것이기 때문에 여기에 자리 할 가치가 있다고 생각했습니다.

이 솔루션이 더 우아 할뿐만 아니라 완벽하게 작동합니다. 또한 @ABentSpoon의 답변으로 내가 가진 문제를 해결합니다. 즉, CC의 Gmail 주소의 경우 이메일이받은 편지함에 들어 가지 않고 대신 "전체 메일"로 전송된다는 것입니다.
Guillaume Garrigos

18

TO, CC 및 BCC의 구분은 텍스트 헤더에서만 발생합니다. SMTP 수준에서는 모든 사람이받는 사람입니다.

TO-이 수신자의 주소가있는 TO : 헤더가 있습니다.

CC-이 수신자 주소가 포함 된 CC : 헤더가 있습니다.

BCC-이 수신자는 헤더에 전혀 언급되지 않지만 여전히 수신자입니다.

당신이 가지고 있다면

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

세 명의 수신자가 있습니다. 이메일 본문의 헤더에는 TO : 및 CC : 만 포함됩니다.



5

내가 만들 때까지 나를 위해 일하지 않았습니다.

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

수신자 [목록]에 다음과 같이 추가 된 참조보다

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

2

'to'와 'cc'모두에 여러 수신자가 있었기 때문에 위의 것 중 어느 것도 나를 위해 일하지 않았습니다. 그래서 아래와 같이 시도했습니다.

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'를 확장하고 간단한 방법으로 메일을 보냅니다.

recipients.extend(cc_recipients)
server.sendmail(FROM,recipients,MESSAGE.as_string())
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.