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


102

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

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

(そして、いいえ、私はテスト環境外の誰かをスパムするスクリプトを作成していません。)

回答:


150

電子メールのヘッダーは、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()

smtplib.SMTPはアドレスに関するリストを送信しません。少なくともpython 2.7.2ではありません
LostMohican

この場合、RFC 2822で言及されているBCCヘッダーは意味がありません。
Chenxiong Qi

1
@ABentSpoonの「件名」の後にコロンがありません。
user891260

3
bccヘッダーを追加しないでください。これを参照してください:mail.python.org/pipermail/email-sig/2004-September/000151.html そしてこれ: "" "sendmail()の2番目の引数である受信者はリストとして渡されます。リスト内の任意の数のアドレスに順番にメッセージを配信します。エンベロープ情報はメッセージヘッダーとは別なので、メッセージヘッダーではなくメソッドの引数にそれらを含めることで、誰かをBCCすることもできます。」 "" pymotw.com/2/smtplib
Leonardo Andrade

2
これは決してBCCでもCCでもありません
ProsperousHeart

37

重要なことは、sendmail呼び出しでEメール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行うための引数)。
エリカケイン

2
私はエリカとフリオに同意します。Bccの目的は、レシーバーを他のレシーバーから隠すことです。メッセージに含まれている場合、それは目的を達成できません。
ティモシーC.クイン

19

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

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

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

19

2011年11月にリリースされたPython 3.2以降、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、メッセージオブジェクトを必要とすることです。つまりemail.message、単に文字列をに渡すのではなく、からクラスをインポートする必要がありますsendmail


2
send_message(msg)がEmailMessageに追加されたccを処理することを確認しました-msg ['Cc'] Python 3を使用している場合、これが適切な方法です。
bmiller

@bmillerうん、かなり便利。この回答を調べてみたところ、ドキュメントやその他の参考文献でより簡単な方法を見つけたので、この回答を書きました。それは、私にとってはうまくいきました。また、多くの人が最初にここを見るので、ここにふさわしいと思いました。

このソリューションの方が洗練されているだけでなく、完全に機能します。また、@ ABentSpoonによる回答で私が抱えていた問題も解決します。つまり、CCのGmailアドレスの場合、メールは受信トレイに送信されず、代わりに「すべてのメール」に送信されます。
ギヨームガリゴス

18

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

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

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

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

あなたが持っている場合

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

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



5

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

#created cc string
cc = ""someone@domain.com;
#added cc to header
msg['Cc'] = 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.