xml - 通过 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 批电子邮件
解决方案
我不知道有任何文档支持这一点,但根据我自己的实验,问题是将字符串传递给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 试图像字典一样对其进行迭代。
推荐阅读
- python-3.x - 迭代两个不同大小的列表
- python - 为什么python的while条件中不允许进行复杂的算术运算
- bootstrap-4 - 将内容与单元格右侧对齐
- angular - x 秒后显示 Angular Material 对话框
- c# - aspnet-codegeneration 分段错误
- python - 使用 PyInstaller 减小 Python 应用程序的大小
- c# - 表未在 C# 上更新
- c++ - Qt (C++) 设置 QWidgetTab 中各个选项卡的颜色
- reactjs - Formik + React-semantic-ui
- javascript - 我想在 Datatables 中使用 Div 结构而不是 Table。是否可以?