将多个收件人电子邮件和姓名附加到 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 中的图像附加到电子邮件