Odoo 15中如何将Binary字段文件添加为邮件附件
实现方法
你只需要在现有代码基础上补全附件创建、传递逻辑,同时修正原有代码的语法问题即可,具体操作如下:
- 修正原有代码错误:上下文中的
default_model键名缺少字符串引号,会触发语法报错;另外你前面已经查询了自定义邮件模板和向导表单ID,后面多余的两行硬编码覆盖逻辑需要删除,否则你自定义的模板不会生效。 - 生成附件并传递给向导:Odoo的
Binary字段存储的是base64编码的文件内容,你可以先基于字段内容创建ir.attachment类型的附件记录,再把附件ID通过上下文传给邮件撰写向导,打开弹窗时就会自动带上这个XML附件。
修改后可直接运行的代码
def send_claim_batch(self): self.ensure_one() ir_model_data = self.env['ir.model.data'] # 加载自定义邮件模板 try: template_id = ir_model_data._xmlid_lookup('iemr_medical_aid.iemr_claim_batch_email')[2] except ValueError: template_id = False # 加载邮件撰写向导表单 try: compose_form_id = ir_model_data._xmlid_lookup('mail.email_compose_message_wizard_form')[2] except ValueError: compose_form_id = False # 基于Binary字段内容创建邮件附件 attachment = self.env['ir.attachment'].create({ 'name': 'claim_batch.xml', # 可自行修改附件展示的文件名 'type': 'binary', 'datas': self.batchfile, 'res_model': 'iemr.claim.batch', 'res_id': self.id, 'mimetype': 'application/xml', 'temp': True # 标记为临时附件,后续会被系统自动清理,不占用存储 }) ctx = { 'default_model': 'iemr.claim.batch', 'default_res_id': self.ids[0], 'default_use_template': bool(template_id), 'default_template_id': template_id, 'default_composition_mode': 'comment', 'mark_so_as_sent': True, 'force_email': True, 'default_attachment_ids': [(6, 0, [attachment.id])] # 把附件传给向导 } return { 'type': 'ir.actions.act_window', 'view_type': 'form', 'view_mode': 'form', 'res_model': 'mail.compose.message', 'views': [(compose_form_id, 'form')], 'view_id': compose_form_id, 'target': 'new', 'context': ctx, }
可选优化
如果你的业务不需要弹出邮件撰写向导、要直接自动发送邮件,可以直接调用邮件模板的send_mail方法,把附件ID作为参数传入即可,不需要走向导弹窗逻辑。
内容的提问来源于stack exchange,提问作者Abraham Kalungi
相关产品推荐
相关产品推荐

