使用OdooRPC发送Odoo签署请求时邮件无法送达的问题
问题描述
我通过OdooRPC在Odoo中发起签署请求,流程分为四步:
- 上传待签署文档至Odoo
- 配置文档内的签署字段(文本/签名字段)
- 结合文档与Odoo联系人(签署人)准备邮件模板
- 发送签署请求邮件
准备请求的代码:
request_fields = { 'template_id': template_id, 'signer_ids': [[0, 'virtual_25', {'role_id': 2, 'partner_id': employee_id1}], [0, "virtual_37", {'role_id': 3, 'partner_id': employee_id2}]], 'signer_id': False, 'signers_count': 2, 'has_default_template': True, 'is_user_signer': False, 'follower_ids': [[6, False, []]], 'subject': 'Sign Request', 'filename': 'document_to_sign.pdf', 'message_cc': '<p><br></p>', 'attachment_ids': [[6, False, []]], 'message': '<p>Hi.</p><p>Sign this document, no reply</p>' } # Prepare email request sign_email = self.odoo.env['sign.send.request'] email_id = sign_email.create(request_fields)
发送请求的代码:
# Prepare email request sign_email = self.odoo.env['sign.send.request'] email_id = sign_email.create(request_fields) # int type request_sign = sign_email.send_request(email_id)
接口返回无报错:
{'name': 'file_name.pdf', 'type': 'ir.actions.client', 'tag': 'sign.Document', 'context': {'id': 1234, 'token': 'abcd-1234-efgh-5678', 'sign_token': None, 'create_uid': 9, 'state': 'sent', 'request_item_states': {'1234': False, '1235': False}}}
问题:调用send_request方法后,Odoo后台已生成邮件,但邮件并未送达至指定收件人邮箱。
排查与解决方案
1. 检查Odoo邮件服务器配置
- 进入Odoo后台「设置」>「技术」>「邮件」>「邮件服务器」,确认已正确配置 outgoing邮件服务器(SMTP),包括主机、端口、认证信息、加密方式(SSL/TLS)。
- 点击「测试连接」验证服务器是否能正常发送邮件,若测试失败,优先修复邮件服务器配置问题。
2. 验证签署人邮箱信息
- 检查
employee_id1和employee_id2对应的res.partner记录,确认email字段已正确填写且格式有效。Odoo不会向无邮箱的联系人发送邮件。 - 若联系人邮箱为空或格式错误,补充正确邮箱后重新发起请求。
3. 查看邮件队列与服务器日志
- 进入「设置」>「技术」>「邮件」>「邮件队列」,查看是否有处于「待发送」或「发送失败」状态的邮件:
- 若邮件在队列中未发送,可手动点击「立即发送」测试,同时检查Odoo邮件发送守护进程是否正常运行。
- 若显示发送失败,查看失败原因(如收件人拒收、SMTP认证失败等),针对性修复。
- 查看Odoo服务器日志(通常在
/var/log/odoo/或指定日志目录),搜索邮件相关报错信息,定位具体问题。
4. 确认权限与请求参数
- 检查
request_fields中的signer_ids配置:确保role_id对应的签署角色已正确配置,且角色关联的通知方式为邮件。 - 确认执行OdooRPC的用户拥有
sign.send.request模型的创建和发送权限,以及访问res.partner、sign.template等相关模型的权限。权限不足可能导致邮件生成但无法触发发送。
5. 优化代码逻辑
- 当前发送请求的代码中重复调用了
create方法,可能创建了重复的请求记录,导致实际发送的是未正确配置的请求。优化代码,复用之前创建的email_id:# 优化后的代码 sign_email = self.odoo.env['sign.send.request'] email_id = sign_email.create(request_fields) request_sign = sign_email.send_request(email_id)
6. 测试手动发送流程
- 在Odoo后台手动创建并发送相同的签署请求,观察是否能正常送达。若手动发送正常,说明问题出在OdooRPC的代码逻辑或参数配置上,可对比手动创建的请求字段,调整代码中的
request_fields参数。
内容的提问来源于stack exchange,提问作者Juan Botero
相关产品推荐
相关产品推荐

