2016-07-26 2 views
0

다음 코드가 있습니다. 스케줄러가 실행될 때 오류 메시지가 나타납니다. 어떤 사람은, 코드 액세스하려는 문서의Odoo 예약 된 메일을 보내기 위해 cron 작업을 실행하는 동안 누락 된 오류

MissingError 하나 삭제 된에 오류를 해결 상쾌한 후 다시 시도하십시오하는 데 도움이.

def send_followup_mail(self, cr, uid, context=None): 
     quot_ids=self.search(cr, uid, [('state','=','amend_quote')]) 
     for quot_id in quot_ids: 
      if quot_id: 
       quot_obj=self.browse(cr, uid, quot_id ,context=context) 
       quotation_since=quot_obj.quotation_since 
       for email_template_line in quot_obj.temp_tag_id.crm_campaign_id.email_template_ids: 
        if quotation_since==email_template_line.delay_days: 
         mail_pool = self.pool.get('mail.mail') 
         mail_id = self.pool.get('email.template').send_mail(cr, uid, email_template_line.id, 1, force_send=True, context=context) 

         if email_template_line.send_mail_to=='to_client': 
          mail_pool.write(cr, uid, mail_id, {'email_to':quot_obj.email_from}, context=context) 

         elif email_template_line.send_mail_to=='to_sale_rep': 
          mail_pool.write(cr, uid, mail_id, {'email_to':quot_obj.sale_rep_id.email}, context=context) 

         if mail_id: 
          mail_pool.send(cr, uid, mail_id, context=context) 
       self.write(cr, uid, quot_id,{'quotation_since':quotation_since+1}, context=None) 
     return True 
+0

Odoo에서 오류 메시지로받은 것이 전부입니까? 코드의 일부에서 사용하려는 일부 레코드가 더 이상 데이터베이스에없는 것으로 보입니다. – CZoellner

+0

send_mail (cr, uid, email_template_line.id, 1, force_send = True, context = context) – sfx

+0

해당 매개 변수의' 1'은 Odoo에게 템플릿에서 정의 된 모델의 ID 1을 사용하여 값 식에 사용하도록 지시합니다. 해당 모델의 ID 1이있는 레코드가 데이터베이스에없는 것으로 보입니다. 어쨌든 그 매개 변수가 1로 설정된 이유는 무엇입니까? 'quot_id'하지 않아야합니까? – CZoellner

답변

0

이것은 수정 된 코드이며 정상적으로 작동합니다.

def send_followup_mail(self, cr, uid, context=None): 
      quot_ids=self.search(cr, uid, [('state','=','amend_quote')]) 
      for quot_id in quot_ids: 
       if quot_id: 
        quot_obj=self.browse(cr, uid, quot_id ,context=context) 
        quotation_since=quot_obj.quotation_since 
        for email_template_line in quot_obj.temp_tag_id.crm_campaign_id.email_template_ids: 
         if quotation_since==email_template_line.delay_days: 
          mail_pool = self.pool.get('mail.mail') 
          template_id = email_template_line.id 
          template_pool = self.pool.get('email.template') 
          sale_id=self.pool.get('sale.order').search(cr, uid, [], limit=1, context=context) 
          mail_id = template_pool.send_mail(cr, uid, template_id, sale_id[0], force_send=True, context=context) 

          if email_template_line.send_mail_to=='to_client': 
           mail_pool.write(cr, uid, mail_id, {'email_to':quot_obj.email_from}, context=context) 

          elif email_template_line.send_mail_to=='to_sale_rep': 
           mail_pool.write(cr, uid, mail_id, {'email_to':quot_obj.sale_rep_id.email}, context=context) 

          if mail_id: 
           mail_pool.send(cr, uid, mail_id, context=context) 
        self.write(cr, uid, quot_id,{'quotation_since':quotation_since+1}, context=None) 
      return True 
0

새로운 API을 사용하여 모든 쓰기 코드의 첫 번째. 당신이 그 전에 보내는 메일을 설정하려면 다음 obj.send_mail(model.obj.id, force_send=True)을 보내 템플릿을 사용 obj = self.env.ref('template_record_id')를 얻기 위해

obj.email_to = '[email protected]'

최종 코드 : XML에

어딘가에 : 파이썬 코드에서

<record id="email_template_record_id" model="email.template"> 
     <field name="name">Name</field> 
     <field name="email_from">[email protected]</field> 
     <field name="subject">Subject</field> 
     <field name="email_to">False</field> 
     <field name="auto_delete" eval="True"/> 
     <field name="model_id" ref="model_model_name"/> 
     <field name="body_html"> 
      <![CDATA[ 
      <html> 
       <head> 
        <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
        <title>Custom title</title> 
       </head> 
       <body> 
        <p>Dear Sir,</p> 
        <p>Text body.</p> 
        <p>This is automated mail, don't reply.</p> 
       </body> 
      </html> 
      ]]> 
     </field> 
    </record> 

:

template = self.env.ref('email_template_record_id') 
    template.email_to = some_obj.obj_related_field.email 
    try: 
     template.send_mail(ombject_id, force_send=True) 
    except Exception: 
     _logger.error("Custom Error Message") 
    template.email_to = False 
+0

새 API를 사용하려는 의도를지지하지만 모든 호출에서 template.email_to를 설정해야하는 이유는 무엇입니까? 그러면 데이터베이스의 템플릿 레코드가 변경됩니다. Odoo의 이메일 템플릿은 자리 표시 자/값 표현을 지원합니다. 전자 메일은 템플릿이 사용되는 레코드에서 가져와야합니다. – CZoellner

+0

나는 지금 당장 그 해법을 가지고 있었다. 어쨌든 수정 해 주셔서 감사합니다. –

+0

@CZoellner 질문에 답했습니다. 내 솔루션은 즉시 이메일을 보내고 send_email에는 이메일에 대한 인수가 없으므로 템플릿에서 가져옵니다. 그래서 그 메일에 이메일을 할당하고 있습니다. 하지만 위의 예에서는 풀에 메일을 추가하고 있는데 성능이 좋지 않습니까? –