在Django函数视图中使用Brevo API发送邮件的问题解决
解决Django函数视图中Brevo API发送邮件的问题
错误原因
你碰到的'User' object has no attribute 'swagger_types'报错,本质是直接把Django的User模型实例传给了Brevo SDK的方法——Brevo的SDK依赖自身定义的实体类(带swagger_types属性)构造请求,Django原生的User对象完全不符合这个要求。
正确实现步骤
假设你用的是Brevo官方Python SDK(sib-api-v3-sdk),以下是函数视图里的标准写法:
- 导入Brevo必要类
from sib_api_v3_sdk import ApiClient, Configuration, SendSmtpEmail, SendSmtpEmailSender, SendSmtpEmailTo from sib_api_v3_sdk.rest import ApiException from django.http import HttpResponse from django.contrib.auth.models import User
- 初始化Brevo客户端
可以把这部分封装成工具函数复用,这里先写在视图里:
def send_approval_email(request): # 从settings里读取API密钥更规范 configuration = Configuration() configuration.api_key['api-key'] = '你的Brevo API密钥' api_client = ApiClient(configuration)
- 构造符合Brevo要求的邮件对象
别直接传User对象,提取User的邮箱、姓名等字段,用Brevo的实体类包装:
# 获取审批人(示例:从请求参数取ID查库) approver = User.objects.get(id=request.POST.get('approver_id')) # 构造发件人:用Brevo的SendSmtpEmailSender类 sender = SendSmtpEmailSender(email="your-sender@example.com", name="系统管理员") # 构造收件人:提取User的邮箱和姓名,创建Brevo的收件人对象 recipient = SendSmtpEmailTo(email=approver.email, name=approver.get_full_name()) # 组装完整邮件内容 send_email_data = SendSmtpEmail( sender=sender, to=[recipient], subject="新申请待审批", html_content="<h3>请处理以下申请:</h3><p>申请详情...</p>" )
- 调用API发送邮件
try: from sib_api_v3_sdk import TransactionalEmailsApi api_instance = TransactionalEmailsApi(api_client) api_response = api_instance.send_transac_email(send_email_data) # 这里可以加成功后的业务逻辑,比如跳转或返回响应 return HttpResponse("审批邮件已发送") except ApiException as e: print(f"邮件发送失败:{e}") return HttpResponse("邮件发送失败", status=500)
额外注意事项
- 绝对不要把Django的任何模型实例直接传给Brevo SDK方法,必须提取字段后用Brevo的实体类包装。
- 建议把Brevo客户端初始化、邮件发送逻辑封装成独立工具函数(比如放在
utils/brevo_email.py),减少重复代码。 - 确保你的API密钥有发送交易邮件的权限,且发件邮箱已在Brevo后台完成验证。
内容的提问来源于stack exchange,提问作者apollos
相关产品推荐
相关产品推荐

