将多个收件人电子邮件和姓名附加到 EmailMultiAlternatives

Posted

技术标签:

【中文标题】将多个收件人电子邮件和姓名附加到 EmailMultiAlternatives【英文标题】:Append multiple recipient email and name into EmailMultiAlternatives 【发布时间】:2015-09-28 13:22:41 【问题描述】:

您好,我有一个表单 mixin,用户输入一条消息并将其发送给多个收件人。我使用 Mandrill 作为我的电子邮件客户端。我目前可以将电子邮件发送给单个收件人,但在输入多个用户时它会失败。

这是 mixin 的形式

class FormListView(FormMixin, ListView):
    def get(self, request, *args, **kwargs):
    form_class = self.get_form_class()
    self.form = self.get_form(form_class)
    self.object_list = self.get_queryset()
    context = self.get_context_data(object_list=self.object_list, form=self.form)
    return self.render_to_response(context)

class CardListNew(FormListView):
    form_class = EmailForm
    model = card
   
    def get_queryset(self):
    
    return card.objects.filter(pk__in=[1]).filter(is_published='true')

def sendmail(request):
    if request.method == 'POST':
        form = EmailForm(request.POST)
        if form.is_valid():
           fullname = form.cleaned_data['name']
           email = form.cleaned_data['email']
           rname = form.cleaned_data['rname']
           remail = form.cleaned_data['remail']
           subject = "You received an email from " +  fullname
           message = form.cleaned_data['message']
           connection = get_connection()
           connection.open()
           text_content =  message
    
           msg = EmailMultiAlternatives(subject, message, email, [remail])
           template_data = 
                         'sender_name': fullname, 'sender_email': email, 'receiver_name': rname, 'receiver_email': remail, 'message': message
        
           html_content = render_to_string("email.html", template_data)
           msg.attach_alternative( html_content , "text/html")
           msg.send()
           connection.close() # Cleanup
           return HttpResponseRedirect('/thank-you/')
   else:
       form = EmailForm()

   return render(request, 'card.html')  

这是提交电子邮件的表单。我目前对收件人电子邮件和收件人名称使用相同的输入名称。

<form role="form" action="/sendmail/" method="post">

<input type="text" name="name" class="form-control input" id="input1" autocomplete="off" placeholder="Enter Name">

<input type="text" name="email" class="form-control input" id="input2" autocomplete="off" placeholder="Enter Email">
   
<input class='form-control reciptest' name="rname" placeholder='Recipient Name' type='text'>

<input type="text" class="form-control emailtest" name="remail" placeholder="Recipient Email">
               
<a  class="btn btn-sm btn-default" onClick="addInput('dynamicInput');">Add Recipient </a>
<a class="btn btn-sm btn-default" onClick="removeInput('dynamicInput');">Remove Recipient</a>

<textarea id="input3" name="message" class="form-control input" rows="6" placeholder="Not more than 1000 letters" maxlength="1000"></textarea>

我将如何拆分和匹配列表收件人姓名和电子邮件并将其附加到 EmailMultiAlternatives() 和 template_data?

【问题讨论】:

从您的comment below 看来,您的问题可能是如何在 Django 表单中多次包含相同的输入字段名称,并获取所有值。查看this 和this 了解更多信息。 【参考方案1】:

EmailMultiAlternatives 为“to”参数获取电子邮件地址列表,因此可以采用一种简单的方法进行更改:

   msg = EmailMultiAlternatives(subject, message, email, [remail])

到:

   msg = EmailMultiAlternatives(subject, message, email, remail.split(','))

这会将remail字段的文本拆分为一个列表,在每个逗号处。

【讨论】:

@peter 好的,但是我将如何将输入的收件人姓名映射到 template_data 中的收件人电子邮件? 您想向所有收件人发送一封电子邮件,还是向每个收件人发送一封不同的电子邮件?此答案将发送一封电子邮件,其中包含“收件人”列表中列出的所有收件人。 (因此,无论您在模板中使用receiver_email 的任何位置,您都会得到与表单中输入的完全一致的整个逗号分隔列表。)如果您想发送单独的电子邮件,请查看使用python for 循环迭代@ 987654327@. 我想向所有收件人发送一封电子邮件。但是我在尝试遍历电子邮件时迷失了 对不起,我想我不明白这个问题。您的“remail”输入以字符串形式出现。您可以使用 python 的str.split() 将该单个字符串拆分为一个列表。在您的 python 代码中,您可以使用 for loop 遍历该列表。在您的 Django 模板中,您可以使用 for tag 遍历列表。 我实际上是通过 javascript 动态添加更多的邮件输入。它们都有相同的输入名称。

以上是关于将多个收件人电子邮件和姓名附加到 EmailMultiAlternatives的主要内容,如果未能解决你的问题,请参考以下文章

如何根据用户及其要附加的文件添加多个附件?

如何在 App 中将 ImageView 中的图像附加到电子邮件

嗅探“打印屏幕”键以自动将其内容附加到撰写的邮件上[关闭]

在 MySQL(消息系统)中返回多个收件人姓名

Rails ActionMailer - 格式化发件人和收件人姓名/电子邮件地址

通过 smtp 发送电子邮件并更改发件人姓名