数百の電子メールボックスにさまざまなメッセージを入力するためにテストする必要があり、そのためにsmtplibを使用する予定でした。しかし、とりわけ、特定のメールボックスだけでなく、CCおよびBCCにもメッセージを送信できる必要があります。 smtplib のようには見えませんが、メールの送信中にCC-ingとBCC-ingをサポートします。
pythonスクリプトからメッセージを送信するCCまたはBCCを行う方法の提案を探しています。
(そして、いや、私はテスト環境以外の人にスパムを送るスクリプトを作成していません。)
電子メールヘッダーは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()
重要なことは、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()
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()
TO、CC、およびBCCの区別は、テキストヘッダーでのみ発生します。 SMTPレベルでは、全員が受信者です。
TO-この受信者のアドレスを持つTO:ヘッダーがあります
CC-この受信者のアドレスを含むCC:ヘッダーがあります
BCC-この受信者はヘッダーにまったく記載されていませんが、依然として受信者です。
あなたが持っている場合
TO: [email protected]
CC: [email protected]
BCC: [email protected]
3人の受信者がいます。電子メール本文のヘッダーには、TO:とCC:のみが含まれます。
MIMETextを試すことができます
msg = MIMEText('text')
msg['to'] =
msg['cc'] =
次にmsg.as_string()を送信します
私が作成するまではうまくいきませんでした:
#created cc string
cc = ""[email protected];
#added cc to header
msg['Cc'] = cc
そして、次のような受信者[リスト]にccを追加しました。
s.sendmail(me, [you,cc], msg.as_string())
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
からクラスをインポートする必要があるということです。