首页 > 解决方案 > 通过 cron 作业发送电子邮件

问题描述

我正在创建一个自定义模块,该模块将自动结帐那些忘记在一天结束时结帐的员工,并为此发送电子邮件。

我已经为自动结帐和电子邮件创建了一个功能,创建了一个 cron 作业和电子邮件模板。我也配置了邮件服务器,它们工作正常。这是我的代码

class hr_attendace(models.Model):
    _inherit = ['hr.attendance']


    def check_for_incomplete_attendances(self):

        not_checkout = self.env['hr.attendance'].search([('check_out', '=', False)])
        for rec in not_checkout:

            date_time = (datetime.now() + timedelta(days=0)).strftime('%Y-%m-%d 18:29:59')
            rec.check_out = date_time

            email_template = self.env.ref('custom_attendance_2.email_template')
            if email_template:
                email_template.send_mail(rec.employee_id.work_email, force_send=True)
<odoo>
    <data noupdate = "1">
        <record id="ir_cron_module_auto_checkout" model="ir.cron">
            <field name="name">Auto Checkout</field>
            <field eval="True" name="auto_checkout"/>
            <field name="interval_number">1</field>
            <!-- <field name="nextcall">2019-09-03</field> -->
            <field name="nextcall" eval="(DateTime.now() + timedelta(days=0)).strftime('%Y-%m-%d 18:29:59')"/>
            <field name="interval_type">days</field>
            <field name="numbercall">-1</field>
            <field eval="True" name="doall" />
            <field name="model_id" ref="hr_attendance.model_hr_attendance"/>
            <field name="state">code</field>
            <field name="code">
                model.check_for_incomplete_attendances()
            </field>
        </record>
    </data>
</odoo>
<odoo>
    <data>
        <record id="email_template" model="mail.template">
            <field name="name">Attendance Reminder Email</field>
            <field name="model_id" ref="hr_attendance.model_hr_attendance"/>
            <field name="auto_delete" eval="False"/>
            <field name="email_from">shringarg@trinesis.com</field>
            <field name="email_to">${object.work_email}</field>
            <field name="subject">Attendance Reminder ${object.name}</field>
            <field name="body_html">
            <![CDATA[
            Hello ${object.name},<br/>
                    This is reminder that you didn't sign out today.<br/>
                    Best regards...<br/>]]>
            </field>
        </record>
    </data>
</odoo>

我在运行 cron 作业时遇到这些错误。员工正在结账,但未发送邮件。

2019-09-11 11:52:05,515 16973 警告 auto_checkout odoo.models: mail.mail.create() 带有未知字段:., @, a, c, g, h, i, l, m, n, o, p, r, s, t, u 2019-09-11 11:52:06,766 16973 INFO auto_checkout odoo.addons.mail.models.mail_mail:通过邮件服务器 ID #False 发送第 1 批电子邮件

标签: xmlpython-3.xcronodoo-12

解决方案


我不知道有任何文档支持这一点,但根据我自己的实验,问题是将字符串传递给send_mail,您在这一行执行以下操作:

email_template.send_mail(rec.employee_id.work_email, force_send=True)

send_mail方法将字典作为其第一个参数,其中每个键与您的电子邮件模板的字段名称匹配。例如,如果你有这个字段:

<field name="email_to">${object.work_email}</field>

那么你应该打这个电话:

email_template.send_mail({'email_to': rec.employee_id}, force_send=True)

该消息unknown fields: ., @, a, c, g, h, i, l, m, n, o, p, r, s, t, u表明您传入了一个字符串;这些是电子邮件地址中存在的所有字符(我猜是您在 gmail dot com 上的名字),Odoo 试图像字典一样对其进行迭代。


推荐阅读