You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django店铺关联多用户邮件发送报错求助

解决Django中多用户邮件发送的地址解析错误

问题场景

在Django开发中,店铺完成交易时需给该店铺关联的所有用户(通过多对多字段shop_users)发送邮件。已通过QuerySet获取到关联用户的邮箱列表,但传入EmailMultiAlternatives时触发以下错误:

Invalid address; only could be parsed from "<QuerySet ['email1@gmail.com', 'email2@gmail.com']>"

错误原因

  1. shoppingcartuser.shop_users.all().values_list('email', flat=True)返回的是Django QuerySet对象,而非原生Python列表
  2. 代码中错误地将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:20:56