Как отправить письмо с шаблоном через код в Odoo v8?

Я пытаюсь отправить письмо (с загруженным шаблоном) через 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.id и self.id, которые нужны функции. Но ошибок нет, сообщений нет, это игнорирование функции. Я также пробовал без cr, uid и context, но результат тот же.

Кстати, у функции send_mail есть декоратор, которого я никогда раньше не видел, @api.cr_uid_id_context, значение которого я не знаю.

Кто-нибудь может мне помочь?


person forvas    schedule 01.09.2015    source источник


Ответы (4)


При использовании нового API (self.env вместо self.pool) вам не только больше не нужно передавать аргументы _3 _ / _ 4 _ / _ 5_, так как вы обычно не передаете id(s)either; вместо этого вы browse(), чтобы получить объект, а затем вызываете для него метод.

Пытаться:

return template.send_mail(self.id, force_send=True)
person André Paramés    schedule 30.03.2016
comment
Я нашел это полезным. Спасибо - person Dachi Darchiashvili; 14.07.2016

Через некоторое время я нашел проблему. Я сравнил свой код с другими модулями, которые вызывали ту же функцию, и попытался имитировать.

Наконец, мне удалось вызвать модель 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)

Теперь он переходит в функцию и работает, почта отправляется с желаемым шаблоном.

person forvas    schedule 02.09.2015

как только я создам один шаблон для аналогичной цели, проверьте его и попробуйте решить вашу проблему.

   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': '[email protected]',
                         '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)
person PKS ks    schedule 01.09.2015
comment
Спасибо, я поддерживаю вас, но этот код более или менее является содержанием функции send_mail, и я только что нашел проблему. Я собираюсь выложить это. - person forvas; 02.09.2015

Сделать можно так:

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)
person Ravi Rupapara    schedule 16.10.2015