第一章 邮件模版

邮件模版是用来发送邮件的一个模版格式。

自定义邮件模版

下面我们来看如何自定义个一个邮件模版。

要定义一个邮件模版,必要的元素有:

  • name: 邮件模版名称
  • model_id: 邮件关联的模型
  • subject: 邮件模版主题
  • body_html: 邮件主体内容(HTML)

知道了上述必要元素,我们来创建一个XML结构体:

<record model="mail.template" id="mail_template_partner_expired">
    <field name="name">Payment Overdue</field>
    <field name="model_id" ref="account.model_account_move"/>
    <field name="subject"> payment is 3 workdays overdue</field>
    <field name="body_html" type="html">
        <t t-set="sale_id" t-value="object.sale_ids[0]" t-if="object.sale_ids"></t>
        <p style="margin-bottom: 0px;" t-if="sale_id">Order:<t t-esc="sale_id.name"></t><br/>Title:<t t-esc="sale_id.title.display_name"></t><br/>Partner:<t t-esc="sale_id.partner_id.name"></t></p>
        <p t-if="sale_id">Order Date:<t t-esc="sale_id.date_order"></t><br/>Invoiced Date:<t t-esc="object.invoice_date"></t><br/>Amount:<span t-field="sale_id.amount_total"></span></p>
    </field>
</record>

邮件模版允许使用变量来完成邮件实例化的功能。变量遵循jinja2的使用法则,用{{}}来标识变量。而body html则使用qweb的来完成。

使用邮件发送

如果我们想要在一些模型中使用邮件发送功能,则可以使用下面的示例代码:

mail_template = self.env.ref(
    "mommy_account_statement.mail_template_partner_customer_statement"
)

ctx = {
    "default_model": "res.partner",
    "default_res_ids": self.ids,
    "default_user_template": bool(mail_template),
    "default_composition_mode": "comment",
    "default_template_id": mail_template.id,
    "force_email": True,
}

return {
    "type": "ir.actions.act_window",
    "view_mode": "form",
    "res_model": "mail.compose.message",
    "views": [(False, "form")],
    "view_id": False,
    "target": "new",
    "context": ctx,
}

点击发货邮件按钮时,如果想要自动附加该模型的PDF文档,则需要在邮件版的设置中,指定PDF模板文件。

邮件模版的使用

我们定义好了一个邮件模版,通常就可以在使用了邮件模版发送向导的地方来选择使用了。但是如果我们想要在代码中跳过向导这一步,则需要我们手动构建一个模版向导实例。

# send email to the partner
template_id = self.env.ref("bs_mail.mail_template_partner_expired")
data = {
    "model": move._name,
    "partner_ids": [Command.set(move.message_partner_ids.ids)],
    "res_id": move.id,
    "template_id": template_id.id,
    "composition_mode": "comment"
}
_logger.debug(f"Sending move:{move.display_name} customer payment overdue email to partners:{','.join(move.message_partner_ids.mapped('name'))}")
mcm = self.env['mail.compose.message'].sudo().create(data)
res = mcm._onchange_template_id_wrapper()
mcm.action_send_mail()

上面就是一个使用代码来实例化邮件模版邮件的例子。我们首先获取了邮件模版,然后使用mail.compose.message对象来构建了一个邮件模版向导,然后利用_onchange_template_id_wrapper方法来完成模拟选择过程,最后使用action_send_mail将邮件发送了出去。

各版本不同onchange的方法使用也不同,本例中使用的是16.0的方法,而在13.0中则需要使用onchange_template_id方法。

邮件发送队列

我们在前面创建的邮件虽然使用了action_send_mail方法发送了出去,但实际上是加入到了odoo的邮件发送队列,需要等待邮件发送队列调度之后才能真正发送出去。

mai

results matching ""

    No results matching ""