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

Django Rest Framework提交联系表单发送邮件解包失败报错求助

错误根因

你的视图函数中,从序列化器校验后的数据中提取字段的代码行末尾多了多余的逗号,Python会自动将带尾逗号的单个值包装为单元素元组,而不是你预期的字符串类型:

# 错误写法,末尾带逗号,first_name 变成了 ('张三',) 元组
first_name = serializer.validated_data['first_name'],

当你把元组类型的email传入send_mail的第三个参数(发件人地址)时,Django的地址校验函数尝试将值拆分为(名称, 邮箱地址)两个元素,单元素元组无法满足拆包要求,就触发了你遇到的报错。

修复方案

直接删除提取字段代码行末尾的所有多余逗号即可:

if serializer.is_valid():
    # 删除每行末尾的逗号,变量就是正常的字符串类型
    first_name = serializer.validated_data['first_name']
    last_name = serializer.validated_data['last_name']
    phone = serializer.validated_data['phone']
    email = serializer.validated_data['email']
    subject = serializer.validated_data['subject']
    message = serializer.validated_data['message']

补充优化建议

你当前的配置用的是Gmail的SMTP服务,Gmail默认不允许代发其他非授信邮箱的邮件,直接把用户提交的邮箱作为发件人会大概率被拦截或者发送失败,建议调整为:

  1. 发件人固定用settings中配置的EMAIL_HOST_USER
  2. 把用户的联系邮箱加到邮件内容中,或者配置reply_to参数,这样你回复邮件的时候会自动发到用户提交的邮箱:
# 先导入settings
from django.conf import settings

send_mail(
    subject,
    render_to_string('emails/contact.txt', context),
    # 固定用系统配置的发件人
    settings.EMAIL_HOST_USER,
    ['emailThatItryToUse@gmail.com'],
    fail_silently=False,
    # 增加回复地址为用户提交的邮箱
    reply_to=[email]
)

内容的提问来源于stack exchange,提问作者Ivan Stepanchuk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:27:03