2011-01-26 111 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