如何使用python创建从openerp自动发送邮件的程序

Posted

技术标签:

【中文标题】如何使用python创建从openerp自动发送邮件的程序【英文标题】:How to create program for sending mail automatically from openerp using python 【发布时间】:2014-07-17 11:43:57 【问题描述】:

我已经创建了 openerp 模块。当生成客户端 ID 时,我正在尝试向客户端发送邮件。

在 sale.py 的销售文件夹中。将潜在客户转换为客户时,我想向客户发送邮件。所以在 sale.py 中。我添加了以下代码行。

self.pool.get('email.template').send_mail(cr, uid, email_template_id, object_id,False, context=context)

我从 email_template 数据库中获取 email_Template_id。

解释什么是email_template_id、object_id? 什么是模板? 什么是消息?

我完全糊涂了。 有没有其他方法可以自动发送邮件?

提前致谢。

【问题讨论】:

【参考方案1】:

您可以为此目的使用服务器操作。您可以通过访问设置 »» 技术 »» 操作 »» 服务器操作或在您的模块上创建 XML 在 OpenERP 中创建服务器操作。

我将在这里留下一个服务器操作示例,当对象在我正在开发的模块上达到特定状态时,我使用该操作向用户发送电子邮件:

<?xml version="1.0" encoding="UTF-8"?>
<openerp>
    <data>
        <record id="ir_actions_server_send_email_when_closed_nconf" model="ir.actions.server">
            <field name="name">Auto-email when request is closed, not confirmed</field>
            <field name="model_id" ref="model_generic_request"/>
            <field name="state">email</field>
            <field name="type">ir.actions.server</field>
            <field name="condition">True</field>
            <field name="email">object.requestor.email</field>
            <field name="subject">Your request object.name has been closed (not confirmed)</field>
            <field name="message"><![CDATA[
THIS IS AN AUTOMATED EMAIL. DO NOT REPLY.

Hello,

We are here to inform you that the request [[object.name]] you submitted on [[object.request_date]] with the following data:

        | Request - Details
        |=========================
        | Number: [[object.id]]
        |=========================
        | Responsible Person: [[object.responsible_name.name]]
        | Request description: [[object.request_description]]
        | Stating reasons: [[object.stating_reasons]]
        |=========================
        | Notes: [[object.notes]]


Has not been confirmed and is closed.

If you have any question, do not hesitate to contact your supervisor.

Thank you!]]>
            </field>            
        </record>
    </data>
</openerp>

从工作流调用此操作。在您的情况下,您可以在保存表单时调用它(状态=草稿,也许?)。

因此,您必须在工作流活动定义中添加对服务器操作的调用:

    <record model="workflow.activity" id="act_closed_nconf">
        <field name="wkf_id" ref="wkf_request" />
        <field name="name">request_closed_nconf</field>
        <field name="action_id" ref="ir_actions_server_send_email_when_closed_nconf"/>
        <field name="kind">function</field>
        <field name="action">close_nconf_request()</field>
        <field name="flow_stop">True</field>
    </record>

希望这会有所帮助!

------ 对更扩展的答案稍作修改-----

好的,我会尝试做一个简短的几乎可以运行的例子。

如果尚未在您的 python 文件中,您必须添加一些状态才能使工作流正常工作。

class whatever(osv.osv):
    _name='whatever'
    _description='whatever'
    _columns=
        'name': fields.char('whatever', size=64, required=True),
        'state': fields.selection([('draft','Draft'),
            ('sent','Sent'),
            ('closed','Closed'),
            ],
            'Status', readonly=True, track_visibility='onchange',
        ),
        (... some other fields in here...)
    
    _defaults=
        'state': 'draft',
    

    #these 3 functions are called by the workflow
    def draft(self, cr, uid, ids, context=None):
        self.write(cr, uid, ids, 'state': 'draft')
        return True

    def send(self, cr, uid, ids, context=None):
        self.write(cr, uid, ids, 'state': 'sent')
        return True

    def close(self, cr, uid, ids, context=None):
        self.write(cr, uid, ids, 'state': 'closed')
        return True    
whatever()

然后,您必须有一个适用于您的对象的工作流定义,这将是您的 xml 的内容:

<?xml version="1.0"?>
<openerp>
    <data>
        <record model="workflow" id="wkf_whatever">
            <field name="name">whatever.wkf</field>
            <field name="osv">whatever</field>
            <field name="on_create">True</field>
        </record>

        <!-- activities -->
        <record model="workflow.activity" id="act_draft">
            <field name="wkf_id" ref="wkf_whatever" />
            <field name="flow_start">True</field>
            <field name="name">draft</field>
            <field name="action_id" ref="send_automatic_email"/>
            <field name="kind">function</field>
            <field name="action">draft()</field>
        </record>
        <record model="workflow.activity" id="act_send">
            <field name="wkf_id" ref="wkf_whatever" />
            <field name="name">send</field>
            <field name="kind">function</field>
            <field name="action">send()</field>
        </record>
        <record model="workflow.activity" id="act_close">
            <field name="wkf_id" ref="wkf_whatever" />
            <field name="flow_stop">True</field>
            <field name="name">close</field>
            <field name="kind">function</field>
            <field name="action">close()</field>
        </record>

        <!-- transitions -->
        <record model="workflow.transition" id="whatever_t1">
            <field name="act_from" ref="act_draft" />
            <field name="act_to" ref="act_send" />
            <field name="signal">draft</field>
        </record>
        <record model="workflow.transition" id="whatever_t2">
            <field name="act_from" ref="act_send" />
            <field name="act_to" ref="act_close" />
            <field name="signal">close</field>
        </record>
    </data>
</openerp>

活动声明中的&lt;field name="action_id" ref="send_automatic_email"/&gt; 行调用ID为“send_automatic_email”的服务器操作

还有你的动作服务器:

<?xml version="1.0" encoding="UTF-8"?>
<openerp>
    <data>
        <record id="send_automatic_email" model="ir.actions.server">
            <field name="name">Send automatic email</field>
            <field name="model_id" ref="model_whatever"/>
            <field name="state">email</field>
            <field name="type">ir.actions.server</field>
            <field name="condition">True</field>
            <field name="email">object.requestor.email</field>
            <field name="subject">Your whatever: object.name has been created</field>
            <field name="message"><![CDATA[
THIS IS AN AUTOMATED EMAIL. DO NOT REPLY.

Hello,

bla bla bla bla

In here you will write whatever you want, and can access to data stored in your database with, for example [[object.name]] to access the field "name"

            </field>            
        </record>
    </data>
</openerp>

有了这 3 个文件(以及其中的一些更改!),您应该能够做您想做的事。

别忘了,你必须重启 OpenERP 服务器(为了重新编译你在 python 文件中的更改)并更新你的模块来加载 XML 文件!

祝你好运!

-- 差点忘了!

在您的 xml 视图文件中,您必须在表单视图中添加这些按钮才能调用工作流操作:

<header>
    <button name="send" class="oe_highlight" string="Send" type="workflow" states="draft"/>
    <button name="close" class="oe_highlight" string="Close" type="workflow" states="sent"/>
    <field name="state" widget="statusbar" statusbar_visible="draft,sent,closed" />
</header>

【讨论】:

我应该创建新的 xml 文件还是扩展我的旧 xml 文件?如果是新的 xml 文件,我将在哪个路径中创建这个 xml 文件?并且两个xml编码都在一个文件中? 为了简单和可读性,我将所有(视图、工作流、server_actions)放在不同的文件中。请注意,您必须在 __openerp__.py 中以正确的顺序导入它们:首先定义服务器操作,然后是视图和最后一个工作流 对不起,伙计,我正在尝试这个。只需复制此代码并创建为“sale_template.xml”和“sale_workflow_email.xml”的新文件。并在 openerp.py 中添加了这些名称。这种方式正确与否?因为当我点击销售按钮时,它会如何发送邮件?我不明白? 更改了我的答案以便(我希望)更容易理解 老兄,我还有一个问题。你能澄清一下吗? ***.com/questions/23930930/…【参考方案2】:

如果您想发送 html 电子邮件,我发现的唯一方法是通过服务器操作发送电子邮件模板。

创建模板后,通过查看模板并查看 URL 中的 id 参数来发现它的模板 ID。

然后创建一个新的服务器动作,设置对象以匹配模板并将类型设置为python代码。插入以下代码:

self.pool.get('email.template').send_mail(
    cr, uid, <TEMPLATE_ID>, context['active_id'],True, context=context)

用适当的模板 ID 替换 &lt;TEMPLATE_ID&gt;

只是解释一些其他领域

context['active_id'] 给出了用于创建模板的潜在客户/发票/等的当前 ID 第 5 个值 True 强制立即发送电子邮件,而不是将其添加到队列中。最好保留为 False,但由于版本 7 中的错误,添加到队列时可能会丢失电子邮件地址。

您可以查看 addons/email_template/email_template.py 并搜索 send_mail 函数以获取更多信息。

【讨论】:

以上是关于如何使用python创建从openerp自动发送邮件的程序的主要内容,如果未能解决你的问题,请参考以下文章

Python如何一行代码自动发邮件

Access 2016 定时发送自动电子邮件

OpenERP 6.1 - 电子邮件模板默认为 html

从 openERP 中的 mail_message 获取 author_id

Openerp 电子邮件模板位置

如何将BeautifulSoup导入到python方法OpenERP 7模块中