web-dev-qa-db-ja.com

Python:TO、CC、BCCでメールを送信する方法は?

数百の電子メールボックスにさまざまなメッセージを入力するためにテストする必要があり、そのためにsmtplibを使用する予定でした。しかし、とりわけ、特定のメールボックスだけでなく、CCおよびBCCにもメッセージを送信できる必要があります。 smtplib のようには見えませんが、メールの送信中にCC-ingとBCC-ingをサポートします。

pythonスクリプトからメッセージを送信するCCまたはBCCを行う方法の提案を探しています。

(そして、いや、私はテスト環境以外の人にスパムを送るスクリプトを作成していません。)

89
user63503

電子メールヘッダーはsmtpサーバーには関係ありません。メールを送信するときに、toaddrsにCCおよびBCC受信者を追加するだけです。 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()
134
ABentSpoon

重要なことは、sendmail呼び出しで電子メールIDのリストとして受信者を追加することです。

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

Bccヘッダーを追加しないでください。

これを参照してください: http://mail.python.org/pipermail/email-sig/2004-September/000151.html

そして、これ: "" "sendmail()の2番目の引数である受信者がリストとして渡されることに注意してください。リストに任意の数のアドレスを含めて、それぞれに順番にメッセージを配信できます。情報はメッセージヘッダーとは別です。メッセージヘッダーではなくメソッド引数に含めることで、BCCを行うこともできます。 "" "from 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

TO、CC、およびBCCの区別は、テキストヘッダーでのみ発生します。 SMTPレベルでは、全員が受信者です。

TO-この受信者のアドレスを持つTO:ヘッダーがあります

CC-この受信者のアドレスを含むCC:ヘッダーがあります

BCC-この受信者はヘッダーにまったく記載されていませんが、依然として受信者です。

あなたが持っている場合

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

3人の受信者がいます。電子メール本文のヘッダーには、TO:とCC:のみが含まれます。

16
Jim Garrison

MIMETextを試すことができます

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

次にmsg.as_string()を送信します

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

15
foosion

私が作成するまではうまくいきませんでした:

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

そして、次のような受信者[リスト]にccを追加しました。

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

2011年11月にリリースされたPython 3.2の時点で、smtplibにはsendmailだけでなくsend_messageという新しい関数が追加され、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は、msgに表示されるBccまたはResent-Bccヘッダーを送信しません


sendmailの場合、メッセージにCCヘッダーを追加して、次のようなことを行うのが一般的でした。

msg['Bcc'] = [email protected]

または

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

問題は、sendmail関数がすべてのヘッダーを同じように処理することです。つまり、すべてのTo:およびBCC:ユーザーに送信され、BCCの目的を無効にします。ここでの他の回答の多くに示されている解決策は、ヘッダーにBCCを含めず、代わりにsendmailに渡される電子メールのリストにのみ含めることでした。

注意点は、send_messageにはMessageオブジェクトが必要です。つまり、単に文字列をsendmailに渡すのではなく、email.messageからクラスをインポートする必要があるということです。

2
Web Head