2011-01-26 108 views
3

Django 1.3將爲EmailMessage添加一個「cc」參數,這非常好。如何使用Django 1.2來模擬此操作?從Django發送電子郵件時設置「cc」

首先,我想這一點:

headers = None 
if form.cleaned_data['cc_sender']: 
    headers = {'Cc': sender} # `cc` argument added in Django 1.3 

msg = EmailMultiAlternatives(subject, message, sender, recipients, headers=headers) 
msg.attach_alternative(replace(convert(message)), 'text/html') 
msg.send(fail_silently=False) 

這正確設置「抄送」頭,但並沒有實際發送的翻版。我查看了SMTP.sendmail尋找線索,它似乎將所有收件人作爲單個參數(它沒有單獨的to,ccbcc參數)。

接下來,我想這:

headers = None 
if form.cleaned_data['cc_sender']: 
    headers = {'Cc': sender} # `cc` argument added in Django 1.3 
    recipients.append(sender) # <-- added this line 

msg = EmailMultiAlternatives(subject, message, sender, recipients, headers=headers) 
msg.attach_alternative(replace(convert(message)), 'text/html') 
msg.send(fail_silently=False) 

這個工作,但意思是,當我點擊「回覆」(在Gmail中,無論如何)兩個地址出現在「收件人」字段。我也嘗試設置「Reply-To」標題(至sender),但這沒有什麼區別。

必須可以「抄送」地址而不包括也包括包括直接收件人之間的地址。我會怎麼做?

+0

複製如果Django的正確設置抄送頭的話,好像這個問題可能是在郵件服務器,不知何故。我認爲Django本身並不發送消息,它只是將它們後臺打印到郵件服務器。 – 2011-01-26 09:48:23

+2

僅供參考,「SMTP.sendmail」只接收一個收件人列表的原因是因爲它不關心郵件標題。 SMTP具有「信封地址」,這是一個特定消息要發送到的人,以及各種只用於郵件客戶端(例如Thunderbird,Outlook等)的to/cc頭文件,用於*構建列表*誰將被髮送郵件。所以當發送郵件時,它會發送一個版本,其中包含`to`和`cc`完整的列表到這些列表中的人員列表,第二個版本則發送給所有您想要加入BCC的人員。如果這不清楚,我會進一步解釋,但我沒有囉嗦。 – 2011-01-26 13:23:51

回答

1

EmailMultiAlternatives有一個BCC kwarg,我在包裝函數中使用它來自動在所有出站通信中記錄一個記錄電子郵件帳戶。

from django.core.mail import EmailMultiAlternatives 

def _send(to, subject='', text_content='', html_content='', reply_to=None): 
    if not isinstance(to, (list, tuple)): 
     to = (to,) 
    kwargs = dict(
     to=to, 
     from_email='%s <%s>' % ('Treatful', settings.EMAIL_HOST_USER), 
     subject=subject, 
     body=text_content, 
     alternatives=((html_content, 'text/html'),) 
    ) 
    if reply_to: 
     kwargs['headers'] = {'Reply-To': reply_to} 
    if not settings.DEBUG: 
     kwargs['bcc'] = (settings.RECORDS_EMAIL,) 
    message = EmailMultiAlternatives(**kwargs) 
    message.send(fail_silently=True) 
3

添加抄送:就像你做頭,另外通過在「BCC」關鍵字ARG到EmailMessage構造CC的地址列表。這似乎有點違反直覺,但真正的效果是簡單地將CC地址添加到收件人列表,這正是你想要做的。 (如果你想了解更多關於標題和收件人列表之間的區別,維基百科關於SMTP的文章給出了一些不錯的背景)。

message = EmailMessage(subject=subject, 
         body=body, 
         from_email=sender, 
         to=to_addresses, 
         bcc=cc_addresses, 
         headers={'Cc': ','.join(cc_addresses)}) 
message.send() 
0

EmailMultiAlternatives是EmailMessage的子類。您可以在初始化消息時指定密件抄送和抄送。

msg = EmailMultiAlternatives(subject, text_content, from_email, [to_email], bcc=[bcc_email], cc=[cc_email]) 

Link