2023年11月30日发(作者:)

odoo14】【好书学习】第⼆⼗三章、管理邮件

邮件集成是odoo最重要的特性。我们可以通过odoo收发邮件。我们甚⾄可以管理业务⽂档上的电⼦邮件,如潜在客户、销售订单和项⽬。本章,我们将探讨在odoo

中处理邮件的⽅式。

配置邮件服务器

管理⽂档中的chatter

管理⽂档中的活动

通过Jinja模板发送邮件

通过QWeb模板发送邮件

管理邮件别名

记录在聊天中⽤户改变的内容

定期发送摘要邮件

配置邮件服务器

在收发邮件前,我们需要配置邮件服务器。

准备

本节,并不需要进⾏代码开发,我们需要邮件服务器的相关信息。⽐如,服务器url,端⼝,服务器类型,⽤户名,密码。

⼩贴⼠

如果你使⽤Odoo Online或者,你⽆需配置邮件服务器。

步骤

配置传⼊和传出的电⼦邮件服务器涉及到传⼊和传出服务器流程中常见的⼏个步骤,以及每种服务器特有的⼏个步骤。因此,⾸先我们将看到常见的配置步骤,然

后我们将分别配置传⼊和传出的电⼦邮件服务器。以下是输⼊和输出邮件服务器都需要的步骤:

1. Settins|General Settinsform视图下打开General Settins

2. Discuss区域打开External Email Servers,如下:

3. Alias Domain字段,输⼊我们的邮件服务器domain名。

配置收邮件服务器

1. 打开General Settings,点击Incoming Email Servers链接,将打开收邮件服务器的列表视图

2. 点击新建,将打开form视图。输⼊相关内容如下:

3. 点击Test & Confirm验证配置。

配置发邮件服务器

1. 打开General Settings,使能External Email Servers,点击Outgoing Email Servers链接。

2. 点击新建,将打开form视图。输⼊服务器细节如下:

3. 点击Test Connection验证配置。

原理

The steps given in this recipe are self-explanatory and do not require further the outoging and incoming email records have several fields, so let`s

see their purpose.

Here is a list of the fields used to configure the incoming eamil server:

Name:服务器的名称,在我们添加了多个收邮件服务器的时候,标识不同的服务器。

Server Type: 根据我们的邮件服务器选择POPIMAPLocal中的⼀个。

Server Name: 服务器的domain

Port: 邮件服务器的端⼝。

SSL/TLS: 如果邮件服务器使⽤SSL/TLS加密,则选择该项。

Username: 邮箱地址。

Password: 邮件密码。

Active 标识是否启⽤邮件服务器。

Keep Attachment: 如果你不想管理附件可关闭该项。

Keep Original: 如果你想保留原始邮件,可启动该项。

如下是配置发送邮件服务器:

Description: 服务器的描述,⽤于区分不同的服务器。

Priority: ⽤于定义发送邮件服务器的优先级。数字越低,优先级越⾼。

SMTP Server: 服务器的domain

SMTP Port: 服务器的端⼝。

Connection Security: 在发送邮件时使⽤的安全类型。

Username: 发送邮件的账户。

Password: 发送邮件的密码。

Active: 启停发送邮件服务器。

更多

默认邮件服务器每5分钟更新⼀次。你可以修改该配置:

1. 激活开发者模式。

2. Settings | Technical | Automation | Scheduled | Actions,打开 Scheduled Actions

3. 搜索名为Mail:Fetchmail的动作。

4. 改变间隔(Execute Every)

管理⽂档中的chatter

本节,我们将了解如何在⽂档中管理沟通记录。

准备

本节,我们使⽤my_library模块,我们新增模型。

步骤

1. __manifest__.py中添加mail模型

...

'depends': ['base', 'mail'],

...

2. 模型中继承

class LibraryBookRent():

_name = ''

_inherit = ['']

...

3. 模型的form视图添加chatter⼩部件

4. 更新模块,显⽰如下:

原理

为了确保模型中的chatter可⽤,我们需要安装mail模块。

chatter相关的字段及⽅法定义在模型中。模型是虚拟类仅⽤作继承。步骤2,我们继承了模型,可以为模型添加

必要的字段及⽅法。

在前两个步骤中,我们添加了chatter所需的所有字段和⽅法。步骤3,我们添加了message threadfollower widget。其中message_follower_idsmessage_ids

段⾃定义中。

更多

当我们在chatter中发送了消息,odoo将会⾃动给followers发送邮件。在我们本节的例⼦中,借阅⼈并不是图书记录的follower,因此他们并不会受到消息。如果需要

给他们发邮件提醒,我们需要将他们添加到借阅列表中。我们可以通过 message_subscribe() 函数实现⾃动添加。如下:

@

def create(self, vals):

res = super(LibraryBookRent, self).create(vals)

e_subscribe(partner_ids=[er_])

return res

同样,我们可以通过 message_unsubscribe() 移除follower

管理⽂档中的活动

当使⽤chatter时,还可以添加。类似于代做列表清单的东西。本节,我们将学习如何激活

活动活动

准备

步骤

模型添加活动:

1. 模型中添加继承

class LibraryBookRent():

_name = ''

_inherit = ['', '']

...

2. 模型中添加mail_activity⼩部件

3. 更新模块,显⽰如下:

原理

活动

mail模块中的⼀部分,我们可通过继承实现在chatter中选择性的启⽤该功能。与模型类似,也是抽象模型。

步骤1,我们在中继承了,因此获得了管理活动所必须的⽅法及字段。

步骤2,我们添加了mail_activity⼩部件,⽤于展⽰活动的相关内容,通过继承,我们在模型中添加了activity_ids字段。

活动有不同的类型。默认我们可以创建诸如EmailCallMeetingTo-Do。我们可以在Settings | Technical | Email | Activity Types添加新的活动类型。

更多

如果你想实现⾃动关联活动,我们可以通过模型中的activity_schedule()⽅法实现。如下:

@

def create(self, vals):

res = super(LibraryBookRent, self).create(vals)

if _date:

ty_schedule('_activity_data_call', date_deadline=_date)

return res

如上例⼦可以在图书被借⽤的时候可⾃动实现添加⼀个提醒活动。可以在借阅截⽌⽇期的时候,管理员提醒下借阅⼈。

通过Jinja模板发送邮件

odoo⽀持通过Jinja模板创建动态邮件。Jinja是基于⽂本的模板引擎,⽤于解析HTML内容。本节,我们将创建Jinja邮件模板并发送邮件。

准备

步骤

1. 创建my_library/data/mail_⽂件如下:

Book Return Reminder

${__ }

${er_ }

Reminder for book return

Dear ${er_},

You had rented the

${_} book on ${format_date(_date)}


The due date of book is ${format_date(_date)}.


Best regards,


Librarian

]]>

2. 注册⽂件

'data':[

...

'data/mail_'

]

3. 模型的form视图添加Send reminder按钮

4. 添加book_return_reminder()⽅法:

def book_return_reminder(self):

template_id = ('my__return_

reminder') e_post_with_template(template_)

更新模块,展⽰如下:

原理

步骤1,我们创建了基于数据的动态⽣成的Jinja模板。邮件模板存储在te模型中。主要字段如下:

name: 模板的名称

email_from: 邮件发送⼈

email_to: 收件⼈

email_cc: 抄送⼈

subject: 主题

model_id: 邮件模板所关联的对象

body_html: 邮件的模板的正⽂。在正⽂中,我们可以使⽤基于Jinja语法的变量、循环、条件等。可在 详细了解。通常我们使⽤CDATA标签包裹正⽂,将其标

记为字符数据。

auto_delete: 标识是否在邮件发送后⾃动删除。默认为False

scheduled_date: 邮件计划发送的时间。

信息

我们可以使⽤${}来设置动态值,⽐如email_form, email_to, email_cc, subject, scheduled_datelang

body_html字段中,我们使⽤了${er_}。此处的object就是的记录。在渲染的时候,${er_}将被替换为

借阅者的姓名。还有⼏个类似于Object的变量或函数,如下:

object: 代表当前模型的记录。

format_date: 代表格式化date-time的⽅法。

format_datetime: 代表将UTC时间转化为另⼀个时区的⽅法。

format_amount: float类型转化为带有货币类型的字符串。

format_duration: float转化为时间格式,⽐如,1.5=>01:30

user: 代表当前⽤户。

ctx: 代表环境上线⽂的字典。

⼩贴⼠

我们可以在开发这模式下,点击Settings | Technical | Email | Templates菜单查看到邮件模板列表。form视图下还提供了预览模板的功能。

步骤2,在manifest⽂件中注册模板。

步骤3,添加激活book_return_reminder()⽅法的按钮,可⽤于给关注者发送邮件。

步骤4message_post_with_template()⽅法⽤于发送邮件模板。该⽅法是通过继承模型实现的。为了发送邮件,我们需要将模板的ID作为参数传递给函

数。

更多

message_post_with_tempalte()函数⽤于发送Jinja格式的邮件。如果我们想发送纯⽂本的邮件,可如下:

e_post(body="Please return your book on time")

所有的关注者都将收到Please return your book on time的消息。如果我们想记录该信息,可在调⽤函数的时候添加subtype_id参数。

通过QWeb模板发送邮件

本节,我们将学习发送QWeb样式的邮件。

准备

步骤

1. 添加my_library/data/mail_ QWeb模板⽂件:

2. 添加按钮:

3. 模型中添加book_return_reminder_qweb()⽅法:

def book_return_reminder_qweb(self):

e_post_with_view('my__return_reminder_qweb')

4. 更新模块,点击按钮后邮件如下:

原理

步骤1,我们创建了IDbook_return_reminder_qwebQWeb模板。在模板中,我们并没有使⽤format_date()⽅法,这是因为QWeb渲染引擎将会⾃动根据⽤户的

语⾔处理时间。同样的情况还有format_amount()⽅法。

步骤2,我们添加了可触发book_return_reminder_qweb()的按钮。

步骤3message_post_with_view()⽤于发送邮件,该⽅法定义在模型中。

QWeb模板与Jinja模板有如下⼏点不同:

在邮件模板中,我们可通过定义在Object变量获取动态值。另⼀⽅⾯,在QWeb模板中,我们可以在渲染的时候在上下⽂通过values传递变量值。

e_post_with_view(

'my__return_reminder_qweb', values={'extra_data': 'test'}

)

Jinja模板中,我们需要使⽤format_dateformat_tzformat_amount⽅法管理⽇期、时区及货币的格式化。但在QWeb模板中,渲染器将⾃动转化。

Jinja中,是不能修改已有的Jinja模板的。⽽在QWeb中,我们可以通过继承实现对模板的修改。详细内容可在第14章中学习。

您可以直接从消息⽣成器中选择和使⽤Jinja模板。在下⾯的屏幕截图中,右下⾓的下拉菜单⽤于选择Jinja模板:

但在我们⽆法直接在消息⽣成器中使⽤QWeb模板。

更多

message_postmessage_post_with_templatemessage_post_with_view均可在⽤户配置中实现。当⽤户在配置页⾯修改了通知⽅式,⽤户将⽆法收到邮件,⽽

是在odoo的通知系统中收到消息提醒。此外,Odoo消息线程遵循⼀个称为⼦类型的概念。

⼦类型仅⽤于接收您感兴趣的信息的电⼦邮件。您可以在message_post_*⽅法中传递额外的参数subtype_id,以根据⼦类型发送电⼦邮件。通常,⽤户将从Follow

按钮的下拉列表中管理其⼦类型。假设⽤户将其⼦类型设置为:

管理邮件别名

邮件别名是odoo中的⼀个特性,可通过接收到的邮件创建记录。最简单的例⼦是销售团队。我们只需要发邮件给sale@odoo就会在销售团

队的模型中创建⼀条新的记录。本节,我们将创建⼀个⽤于创建图书借阅记录的邮件别名。

准备

本节我们将继续使⽤my_library模块。我们将创建邮件地址为rent@的邮件别名。如果你发邮件给这个地址,邮件主题为图书的名字,那么odoo

会⾃动创建⼀个的记录。

步骤

1. my_library/data/mail_⽂件中创建邮件别名:

rent

partners

2. my_library/models/library_book_⽂件中添加引⽤:

import re

from import email_split, email_escape_char

3. 模型中重写message_new()⽅法:

@

def message_new(self, msg_dict, custom_values=None):

self = _content(default_user_id=False)

if custom_values is None:

custom_values = {}

regex = e("^[(.*)]")

match = (msg_('subject')).group(1)

book_id = [''].search([

('name', '=', match),

('state', '=', 'available')

], limit=1)

custom_values['book_id'] = book_

email_from = email_escape_char(email_split(msg_('from'))[0])

custom_values['borrower_id'] = self._search_on_partner(email_from)

return super(LibraryBookRent, self).message_new(msg_dict, custom_values)

更新my_library模块,给rent@发送邮件。确保邮件的主题符合要求,⽐如。这将会创建⼀条新

[Odoo 14 Development Cookbook] Request to borrow this book

原理

步骤1,我们创建了记录。这个别名将会处理rent@邮件地址的内容。如果我们给这个地址发送邮件,odoo将会在模型中

创建⼀条新的记录。我们可以在Settings | Technical | Email | Aliases查看邮件别名列表。

alias_name: 代表邮件地址的别名。

alias_model_id: 代表将根据接收到的邮件后所创建记录的模型。

alias_user_id: 代表当邮件过来的时候,⽤哪个账户进⾏创建新纪录。

alias_contact: 代表表名的权限配置。可选项为everyone, partners, followers, employees.

alias_defaults: 当接收到邮件后,odoo将会⾃动创建⼀条新的记录。该字段可⽤于设置默认值。

步骤2,添加必要的引⽤。

步骤3,重写message_new()⽅法。该⽅法将在接收到新邮件的时候⾃动触发。该⽅法有两个参数:

msg_dict: 包含到接收到的邮件的相关内容,⽐发件⼈地址、接收⼈地址、主题及邮件正⽂。

custom_values: 代表创建记录时的⾃定义值。与alias_defaults的作⽤类似。

更多

⼀些业务模型有时需要针对每⼀条记录进⾏区分别名。⽐如,在销售团队模型中,针对不同的团队创建不同的别名。⽐如,为印度的团队创建sale-

in@,为⽐利时的团队创建sale-be@。如果我们打算在模型中管理别名,我们可以在我们的模型中继承

class Team():

_name = ''

_inherit = ['', '']

现在,我们可以在form视图中添加alias_name字段了,这⽤终端⽤户可以⾃⾏添加别名内容了。

记录在聊天中⽤户改变的内容

Odoo框架提供了⼀个内置的⼯具来记录chatter中的字段更改。本节我们将启⽤邮件⽇志功能,⽤于记录某些字段的修改。

准备

步骤

调整某些字段的定义,这样可以在改变字段内容的时候实现⾃动记录⽇志。如下:

class LibraryBookRent():

_name = ''

_inherit = ['', '']

book_id = 2one('', 'Book', required=True)

borrower_id = 2one('r', 'Borrower', required=True)

state = ion([('ongoing', 'Ongoing'),('returned','Returned')],'State', default='ongoing', required=True, tracking=True)

rent_date = (, tracking=True)

return_date = (tracking=True)

更新模块,创建⼀条新的记录并修改,可如下内容:

当我们修改state, rent_date, return_date时,都可以清晰的看到修改的内容。

原理

当您设置tracking=True属性时,每当您更新字段值时,Odoo将添加⼀个在chatter中更改的⽇志。如果对多个记录启⽤跟踪,并且希望在跟踪值中提供序列,还可以

在跟踪参数中传递如下数字:tracking=20。当传递tracking=True时,将使⽤默认序列,即100

track_visibility特性相关的代码定义在模型中。

定期发送摘要

odoo框架内置了定期发送摘要邮件的功能。通过摘要邮件,我们可以发送商业KPI的相关内容。本节,我们将给管理员发送已借阅的图书。

准备

步骤

1. 继承模型并添加KPI字段:

class Digest():

_inherit = ''

kpi_book_rent = n('Book Rent')

kpi_book_rent_value = r(compute='_compute_kpi_book_rent_value')

def _compute_kpi_book_rent_value(self):

for record in self:

start, end, company = record._get_kpi_compute_parameters()

_book_rent_value = [''].search_count([

('create_date', '>=', start),

('create_date', '<', end)

])

2. 继承模型的form视图并添加KPI字段:

. y

更新模块,可在Settings | Technical | Emails | Digest Emails中查看如下内容:

但我们启⽤了该功能并订阅了摘要邮件后,我们将收到相关提醒邮件喽。

原理

为了创建⾃定义的摘要邮件,我们需要Boolean字段(⽤于启停KPI功能)及compute字段(⽤于获取KPI的值)。我们compute字段中使⽤了

_get_kpi_compute_parameters()函数。这个函数由三个返回值,开始⽇期、结束⽇期以及公司记录。我们可以使⽤这三个值⽣成KPI。在本例中,我们返回了特定

周期内借阅图书的数量。如果我们的KPI是多站点的,那么我们还需要使⽤company参数。

步骤2,我们在digest form视图添加了⽤于启停摘要邮件的字段。如果启⽤了该功能,则可以收到摘要邮件了。