在Django中发送电子邮件时设置"cc

3 投票
3 回答
5757 浏览
提问于 2025-04-16 10:38

Django 1.3会在EmailMessage中增加一个“cc”参数,这个功能非常棒。那么在Django 1.2中,怎么模拟这个功能呢?

首先,我尝试了这个:

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)

这个方法确实设置了“Cc”这个字段,但实际上并没有发送抄送。我查看了SMTP.sendmail的文档,发现它把所有的收件人当作一个整体来处理(没有单独的toccbcc参数)。

接下来我尝试了这个:

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中)时,两个地址都出现在“收件人”字段里。我还尝试设置“回复给”字段(设置为sender),但这并没有改变什么。

我想应该可以在不把地址放在直接收件人里的情况下进行抄送。那我该怎么做呢?

3 个回答

0

EmailMultiAlternatives 是 EmailMessage 的一个子类。你在创建消息的时候,可以指定密件抄送(bcc)和抄送(cc)。

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

摘自 链接

1

EmailMultiAlternatives有一个叫做BCC的参数,我在一个包装函数里使用它,这样可以自动把所有发出的邮件抄送给记录中的邮箱。

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

像你之前做的那样添加Cc:这个头部信息,同时在EmailMessage构造函数中通过“bcc”这个关键字参数传入抄送地址的列表。这听起来有点反直觉,但实际上这样做的效果就是把抄送地址加到收件人列表中,这正是你想要的。如果你想了解更多关于头部信息和收件人列表之间的区别,可以看看维基百科上关于SMTP的文章,里面有很好的背景知识。

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

撰写回答