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默认不允许代发其他非授信邮箱的邮件,直接把用户提交的邮箱作为发件人会大概率被拦截或者发送失败,建议调整为:
- 发件人固定用settings中配置的
EMAIL_HOST_USER - 把用户的联系邮箱加到邮件内容中,或者配置
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
相关产品推荐
相关产品推荐

