python: TO, CC ve BCC ile nasıl posta gönderilir?


105

Birkaç yüz e-posta kutusunu çeşitli mesajlarla doldurmak için test amaçlarına ihtiyacım var ve bunun için smtplib kullanacaktım. Ancak diğer şeylerin yanı sıra, iletileri yalnızca belirli posta kutularına değil, aynı zamanda CC ve BCC de gönderebilmem gerekiyor. Smtplib , e-posta gönderirken CC-ing ve BCC- ing'i destekliyor gibi görünmüyor .

Python betiğinden mesaj gönderirken CC veya BCC nasıl yapılacağına dair öneriler aranıyor.

(Ve - hayır, test ortamımın dışındaki herhangi birine spam göndermek için bir komut dosyası oluşturmuyorum.)

Yanıtlar:


151

E-posta başlıkları smtp sunucusu için önemli değildir. E-postanızı gönderirken CC ve BCC alıcılarını toaddr'lere eklemeniz yeterlidir. CC için bunları CC başlığına ekleyin.

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 listeleri adreslere göre göndermez. En azından python 2.7.2'de değil
LostMohican

Bu durumda, RFC 2822'de belirtilen BCC başlığı bir anlam ifade etmiyor.
Chenxiong Qi

1
@ABentSpoon, 'Konu'dan sonra iki nokta üst üste eksik.
user891260

3
Bcc başlığını eklemeyin. Şuna bakın: mail.python.org/pipermail/email-sig/2004-September/000151.html Ve bu: "" "alıcılar olan sendmail () için ikinci bağımsız değişkenin bir liste olarak aktarıldığına dikkat edin. Mesajın sırayla her birine teslim edilmesini sağlamak için listedeki herhangi bir sayıda adres. Zarf bilgileri mesaj başlıklarından ayrı olduğundan, bir kişiyi yöntem bağımsız değişkenine dahil ederek ancak mesaj başlığına dahil etmeden BCC bile yapabilirsiniz. " "" pymotw.com/2/smtplib adresinden
Leonardo Andrade

2
Bu asla BCC veya CC olmayacak - her zaman To
ProsperousHeart

37

Önemli olan alıcıları sendmail aramanıza e-posta kimliklerinin bir listesi olarak eklemektir .

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']Kapalı bırakın - gizli göndericinizi ortaya çıkarır ve mesajın onlara gönderilip gönderilmeyeceği üzerinde hiçbir etkisi yoktur ( sendmailbunu yapmak için argümanlar ).
Erica Kane

2
Erica ve Julio'ya Katılıyorum. Bcc'nin amacı, alıcıyı diğer alıcılara gizlemektir. Mesajın içindeyse, amacı bozan.
Timothy C. Quinn

19

Bcc başlığını eklemeyin.

Şuna bakın: http://mail.python.org/pipermail/email-sig/2004-September/000151.html

Ve bu: "" "Alıcıların ikinci bağımsız değişkeni olan sendmail () 'e bir liste olarak aktarıldığına dikkat edin. İletinin sırayla her birine teslim edilmesini sağlamak için listeye istediğiniz sayıda adres ekleyebilirsiniz. Zarf bilgi ileti üstbilgilerinden ayrıdır, hatta bir kişiyi yöntem bağımsız değişkenine ekleyerek ancak ileti başlığına eklemeyerek BCC bile yapabilirsiniz. "" " http://pymotw.com/2/smtplib adresinden

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()

Yetenek için başparmak: D
Chris

19

Kasım 2011'de yayınlanan Python 3.2'den itibaren, smtplib'in send_messagesadece yerine yeni bir işlevi var sendmail, bu da To / CC / BCC ile uğraşmayı kolaylaştırıyor. Dan Çekme Python resmi e-posta örneklerle bazı küçük değişiklikler içeren, elde ederiz:

# 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 belgelerde ana hatlarıyla belirtildiği gibi BCC'ye saygı duyduğundan , başlıkları kullanmak iyi çalışıyor :

send_message, msg'de görünebilecek herhangi bir Bcc veya Resent-Bcc üstbilgisini iletmez


Bununla sendmailbirlikte, mesaja CC başlıklarını eklemek yaygındı ve aşağıdaki gibi bir şey yapıyordu:

msg['Bcc'] = blind.email@adrress.com

Veya

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"

Sorun şu ki, sendmail işlevi tüm bu başlıkları aynı şekilde ele alıyor, yani tüm Kime: ve BCC: kullanıcılarına BCC'nin amaçlarını geçersiz kılarak (görünür şekilde) gönderilecekler. Buradaki diğer yanıtların birçoğunda gösterildiği gibi çözüm, BCC'yi başlıklara dahil etmemek yerine, yalnızca iletilen e-postaların listesine dahil etmekti sendmail.

Uyarı, send_messagebir Mesaj nesnesi gerektirmesidir, yani email.messagedizeleri yalnızca içine aktarmak yerine bir sınıfı içe aktarmanız gerekir sendmail.


2
Send_message (msg) 'nin EmailMessage'a eklenen cc'leri işlediğini doğruladı - msg [' Cc '] Python 3 kullanıyorsanız, gitmenin yolu budur.
bmiller

@bmiller Evet, oldukça kullanışlı. Bu cevabı yazdım çünkü araştırıyordum ve dokümanlarda ve diğer referanslarda daha basit bir yol buldum ve benim için iyi çalıştı ve birçok insan buraya 1. bakacağından burada bir yeri hak ettiğini düşündüm.

sadece bu çözümü daha zarif bulmuyorum ama mükemmel çalışıyor. Ayrıca @ABentSpoon'un cevabıyla yaşadığım bir sorunu da çözüyor, bu da CC'deki gmail adresleri için e-postaların gelen kutusuna değil, bunun yerine "Tüm Postalar" a gitmesiydi.
Guillaume Garrigos

18

TO, CC ve BCC arasındaki ayrım yalnızca metin başlıklarında gerçekleşir. SMTP seviyesinde herkes bir alıcıdır.

ALICI - Bu alıcının adresiyle birlikte bir Kime: başlığı var

CC - Bu alıcının adresine sahip bir CC: başlığı var

BCC - Bu alıcıdan başlıklarda hiç bahsedilmemiştir, ancak yine de bir alıcıdır.

Eğer varsa

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

Üç alıcınız var. E-posta gövdesindeki başlıklar yalnızca TO: ve CC:



5

Ben yaratana kadar benim için işe yaramadı:

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

ve alıcıya [liste] gibi cc ekledikten sonra:

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

2

Hem "to" hem de "cc" de birden fazla alıcım olduğu için yukarıdakilerin hiçbiri benim için işe yaramadı. Bu yüzden aşağıdaki gibi denedim:

recipients = ['abc@gmail.com', 'xyz@gmail.com']
cc_recipients = ['lmn@gmail.com', 'pqr@gmail.com']
MESSAGE['To'] = ", ".join(recipients)
MESSAGE['Cc'] = ", ".join(cc_recipients)

ve "alıcıları" "cc_recipients" ile genişletin ve önemsiz bir şekilde posta gönderin

recipients.extend(cc_recipients)
server.sendmail(FROM,recipients,MESSAGE.as_string())
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.