Django店铺关联多用户邮件发送报错求助
解决Django中多用户邮件发送的地址解析错误
问题场景
在Django开发中,店铺完成交易时需给该店铺关联的所有用户(通过多对多字段shop_users)发送邮件。已通过QuerySet获取到关联用户的邮箱列表,但传入EmailMultiAlternatives时触发以下错误:
Invalid address; only
could be parsed from "<QuerySet ['email1@gmail.com', 'email2@gmail.com']>"
错误原因
shoppingcartuser.shop_users.all().values_list('email', flat=True)返回的是Django QuerySet对象,而非原生Python列表- 代码中错误地将QuerySet再包裹一层列表
[shoppingcartemails],导致收件人参数传入的是[QuerySet]格式,邮件解析器无法识别为合法邮箱地址
修复方案
将QuerySet转换为原生Python列表,直接传入EmailMultiAlternatives的收件人参数,无需额外嵌套列表:
修改关键代码
原代码中获取邮箱和创建邮件的部分:
shoppingcartemails= shoppingcartuser.shop_users.all().values_list('email', flat=True) # ... email = EmailMultiAlternatives( "Congratulations! Invoice generated successfully", text_content, settings.EMAIL_HOST_USER, [shoppingcartemails] # 此处为收件人参数 )
修改为:
# 将QuerySet转换为列表,确保是字符串组成的可迭代对象 shoppingcartemails = list(shoppingcartuser.shop_users.all().values_list('email', flat=True)) # ... email = EmailMultiAlternatives( "Congratulations! Invoice generated successfully", text_content, settings.EMAIL_HOST_USER, shoppingcartemails # 直接传入列表,无需额外嵌套 )
完整修改后的函数代码
def generate_invoice(request): if request.user.is_authenticated: billingshop = shop.objects.all() Product = product.objects.all() if request.method == 'POST': form = Invoicing(request.POST) if form.is_valid(): user = form.save(commit=False) Billing_shop = form.cleaned_data['Billing_shop'] Supplier = form.cleaned_data['Supplier'] Payment_mode = form.cleaned_data['Payment_mode'] Upi_transaction_id = form.cleaned_data['Upi_transaction_id'] products = form.cleaned_data['Product'] Quantity = form.cleaned_data['Quantity'] shoping_product = product.objects.filter(Product_name=products).first() sub_total = shoping_product.product_price * Quantity user.Gst = (18 / 100)*sub_total user.Price = sub_total + user.Gst user.save() shoppingcartuser = shop.objects.get(shop_name=Billing_shop) # 转换QuerySet为列表 shoppingcartemails = list(shoppingcartuser.shop_users.all().values_list('email', flat=True)) date = datetime.today() html_content = render_to_string("invoices/invoice_email.html", { "title": "test mail", "date": date, "invoiceuser": Billing_shop, "supplier": Supplier, "payment": Payment_mode, "transactionid": Upi_transaction_id }) text_content = strip_tags(html_content) email = EmailMultiAlternatives( "Congratulations! Invoice generated successfully", text_content, settings.EMAIL_HOST_USER, shoppingcartemails # 直接传入列表 ) email.attach_alternative(html_content, "text/html") email.send() messages.success(request, 'Registration successful.') return redirect('home') else: form = Invoicing() return render(request, 'invoices/create_invoice.html', context={'form': form,'shop':billingshop,'Product':Product}) else: messages.error(request, 'Please login into your account.') return render("login")
额外注意事项
- 确保
shop_users关联的用户模型中email字段不为空,避免发送失败 - 若需过滤无效邮箱,可在转换列表时添加过滤逻辑,比如:
shoppingcartemails = [email for email in shoppingcartuser.shop_users.all().values_list('email', flat=True) if email]
内容的提问来源于stack exchange,提问作者TS Tamarai Selvan
相关产品推荐
相关产品推荐

