Odoo v10问题:表单提交后邮件未发送给当前登录用户
解决Odoo网站表单提交邮件发送至管理员而非登录用户的问题
看起来你遇到的核心问题是邮件模板里的user变量没有正确指向提交表单的网站登录用户,反而取到了管理员的信息。我结合Odoo网站和服务器动作的常见坑,给你几个具体的排查和解决步骤:
1. 检查服务器动作的运行身份
这是最容易忽略的关键点:Odoo的服务器动作默认可能是以管理员身份运行的,这时候模板里的user变量对应的就是管理员用户,自然会发送到管理员邮箱。
解决方法:
- 打开你的服务器动作,找到「运行方式」选项(一般在动作设置的底部区域)
- 选择「以触发动作的用户身份」,而非「以管理员身份」
- 保存后重新测试,这时候
user变量应该会指向提交表单的网站用户
2. 修正邮件模板的变量取值
有时候即使切换了运行身份,user变量在网站上下文里也不如website_user可靠(因为user可能还是后台的用户上下文),或者你应该直接从表单提交的记录里取邮箱(更稳妥,还支持未登录用户提交的场景):
场景1:仅针对已登录网站的用户
把模板改成使用website_user变量,这是Odoo网站专门用来存储当前前端登录用户的上下文变量:
${(website_user.email and '%s <%s>' % (website_user.name, website_user.email) or '')|safe}
场景2:支持未登录用户提交表单(更通用)
如果你的表单允许未登录用户填写邮箱提交,直接从表单对应的业务记录里取邮箱字段会更可靠。比如你的表单关联的是crm.lead模型,默认会把用户填写的邮箱存在email_from字段里,模板可以写成:
${(object.email_from or '')|safe}
这里的object就是表单提交后创建的那条业务记录,直接取它的邮箱字段能确保拿到用户实际填写的内容。
3. 验证表单字段映射是否正确
确保网站表单的邮箱输入框,已经正确映射到了目标模型的对应字段:
- 打开网站构建器的表单编辑界面
- 找到邮箱输入字段,检查它的「字段」设置(比如是否选择了
email_from或者你自定义的邮箱字段) - 如果映射错误,记录里就不会存储用户的邮箱,模板自然取不到正确的值
4. 调试变量取值(可选)
如果还是不确定问题出在哪,可以在服务器动作里加一段调试代码,看看变量实际的值:
# 在服务器动作的Python代码开头添加 raise Warning(f"user.email: {user.email}, website_user.email: {website_user.email}, object.email_from: {object.email_from}")
提交表单后会弹出警告框,显示各个变量的实际值,这样就能快速定位是哪个变量没取到正确的邮箱。
按照这些步骤排查,应该就能解决邮件发送到错误邮箱的问题了。
内容的提问来源于stack exchange,提问作者YamK
相关产品推荐
相关产品推荐

