如何通过Odoo v8中的代码发送带模板的邮件?

时间:2015-09-01 12:16:25

标签: python python-2.7 odoo-8 odoo

我正在尝试通过Python发送邮件(加载模板)。

我在版本7中使用send_mail模型的函数email.template执行了此操作。现在,我想要版本8,但我无法管理它。

这不是关于SMTP服务器和模板的问题,因为如果我手动发送邮件,它就会正确地掌握它的命运。

似乎它没有进入函数send_mail(我在函数的第一行上方写了一条记录器信息消息,它从未出现过。)

这是我的代码:

return self.env['email.template'].send_mail(
   self.env.cr, self.env.uid, template.id, self.id, force_send=True,
   context=self.env.context)

我还检查了函数需要的template.idself.id参数是否正确。但是没有错误,没有消息,它忽略了这个功能。我也试过没有cruidcontext,但结果相同。

顺便说一句,send_mail函数有一个我以前从未见过的装饰器,@api.cr_uid_id_context,其含义我不知道。

有人可以帮助我吗?

4 个答案:

答案 0 :(得分:5)

使用新API(self.env而不是self.pool)时,您不仅不再需要传递cr / uid / context参数,因为你通常也不会传递id(s);相反,您browse()获取一个对象,然后在其上调用该方法。

尝试:

return template.send_mail(self.id, force_send=True)

答案 1 :(得分:2)

过了一段时间我才发现问题。我将我的代码与调用相同函数的其他模块进行了比较,并尝试模拟它们。

最后,我管理它使用email.template而不是pool调用env模型,这样:

return self.pool['email.template'].send_mail(
   self.env.cr, self.env.uid, template.id, self.id, force_send=True,
   context=self.env.context)

现在进入该功能并且它可以工作,邮件将与所需的模板一起发送。

答案 2 :(得分:1)

一旦我为同样的目的创建了一个模板,请检查它并尝试解决您的问题。

   for rec in job_records:
         _logger.error('In project task listttttttttttttttttttttttttttttt  %s', rec.job_id.partner_id.email)
         attachment_ids = self.pool.get('ir.attachment').search(cr, uid, [('res_model','=', 'hr.applicant'),('res_id','=',rec.id),('blind_cv','=','True')])
         message = ("Hello %s \n Below Prurchase Order is  Delay Today: \n Supplier Name : %s \n Purchase Order Refereance : %s \n Order Date : %s \n Delivery Date : %s \n Product Names : %s \n\n")
        # context.update({'default_student_ids' : [(6, 0, [rec.id])]})
         vals = {'state': 'outgoing',
                         'subject': 'CVs',
                         'body_html': '<pre>%s</pre>' % message,
                         'email_to': rec.job_id.partner_id.email,
                         'email_from': 'rahuls.logicious@gmail.com',
                         'attachment_ids': [(6, 0, attachment_ids)],

                 }
         email_ids.append(self.pool.get('mail.mail').create(cr, uid, vals, context=context))
     if email_ids:
         self.pool.get('mail.mail').send(cr, uid, email_ids, context=context)

答案 3 :(得分:1)

你可以这样做:

def send_email(self, cr, uid, ids, vals, context=None):
    # Set Context with ids
    compose_ctx = dict(context,active_ids=ids)
    # Set your template search domain
    search_domain = [('name', '=', 'Application accepted')]
    # Get template id
    template_id = self.pool['email.template'].search(cr, uid, search_domain, context=context)[0]
    # Compose email
    compose_id = self.pool['mail.compose.message'].create(cr, uid, {
        'model': self._name,
        'composition_mode': 'mass_mail',
        'template_id': template_id,
        'post': True,
        'notify': True,
        }, context=compose_ctx)
    self.pool['mail.compose.message'].write(cr, uid, [compose_id], self.pool['mail.compose.message'].onchange_template_id(cr, uid, [compose_id], template_id, 'mass_mail', self._name, False,context=compose_ctx)['value'],context=compose_ctx)
    # Send mail with composed id
    self.pool['mail.compose.message'].send_mail(cr, uid, [compose_id], context=compose_ctx)