📜  使用 Rasa 聊天机器人发送自动电子邮件(1)

📅  最后修改于: 2023-12-03 15:06:50.733000             🧑  作者: Mango

使用 Rasa 聊天机器人发送自动电子邮件

Rasa 是一种流行的开源聊天机器人开发框架,能够帮助程序员快速开发复杂的对话系统。在本文中,我们将介绍如何使用 Rasa 聊天机器人来自动发送电子邮件。

安装 Rasa

要使用 Rasa,首先需要安装 Rasa 的 Python 包。可以通过以下命令来安装:

pip install rasa
设置邮件账户

要从聊天机器人中发送电子邮件,必须将邮件账户配置到 Rasa 的配置文件中。可以在 credentials.yml 文件中配置邮件账户,例如:

# credentials.yml
smtp:
  # 发件人邮箱地址
  username: example@gmail.com
  # 发件人邮箱密码或授权码
  password: password123
  # 发件人的SMTP服务器
  server: smtp.gmail.com
  # 发件人SMTP服务器的端口
  port: 587
  # 是否启用TLS加密
  tls: true

上面的示例使用 Gmail 作为 SMTP 服务器,需要提供正确的发件人地址和密码/授权码。请注意,这种方式可能需要开启Gmail的“允许较低安全性应用访问您的账号”设置。

编写 Rasa 对话流程

接下来,需要编写 Rasa 的对话流程,以便让用户告诉机器人要发送哪封电子邮件,以及邮件的主题和内容。下面是一个简单的对话流程示例,可以在 domain.yml 文件中定义:

# domain.yml
intents:
  - send_email:
      # 匹配这个意图的常见说法
      examples: |
        - 发送邮件
        - 发送电子邮件
        - 发送一封邮件
      # 用于提取主题和内容的实体
      entities:
        - subject
        - body

actions:
  - action_send_email:
      # 发送邮件的实现代码(参见下面的代码段)
      smtp_server: smtp.gmail.com
      smtp_port: 587
      smtp_username: "\<email address\>"
      smtp_password: "\<email password or auth token\>"
      to_email: ""
      subject: ""
      body: ""

templates:
  utter_ask_email_to:
    - "请告诉我收件人的邮箱地址。"
  utter_ask_email_subject:
    - "请告诉我邮件的主题。"
  utter_ask_email_body:
    - "请告诉我邮件的正文。"
  utter_email_sent:
    - "电子邮件已发送。"

上面的示例定义了一个意图 send_email,其中包含 subjectbody 实体,用于提取电子邮件的主题和内容。还定义了一个动作 action_send_email,用于实现发送电子邮件的逻辑。

utter_ask_email_toutter_ask_email_subjectutter_ask_email_body 模板中,指定了对话中问询用户的对话动作。当机器人遇到 send_email 意图时,将提示用户提供收件人、邮件主题和内容。当邮件发送成功时,机器人将显示 utter_email_sent 模板。

实现电子邮件发送动作

下面是一个 Python 实现的发送电子邮件动作的示例,可以在 actions.py 文件中定义:

# actions.py
from typing import Dict, Text, Any, List
from rasa_sdk import Action, Tracker
from rasa_sdk.executor import CollectingDispatcher
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

class ActionSendEmail(Action):
    def name(self) -> Text:
        return "action_send_email"

    def run(self, dispatcher: CollectingDispatcher,
            tracker: Tracker, domain: Dict[Text, Any]) -> List[Dict[Text, Any]]:

        smtp_server = tracker.get_slot("smtp_server")
        smtp_port = tracker.get_slot("smtp_port")
        smtp_username = tracker.get_slot("smtp_username")
        smtp_password = tracker.get_slot("smtp_password")
        to_email = tracker.get_slot("to_email")
        subject = tracker.get_slot("subject")
        body = tracker.get_slot("body")

        # 创建包含正文和附件的多部分邮件
        msg = MIMEMultipart()
        # 将HTML内容添加到邮件正文中
        body = MIMEText(body, "html")
        msg.attach(body)

        try:
            # 使用SMTP凭证进行登录
            server = smtplib.SMTP(smtp_server, smtp_port)
            server.starttls()
            server.login(smtp_username, smtp_password)

            # 设置邮件头部
            msg["From"] = smtp_username
            msg["To"] = to_email
            msg["Subject"] = subject

            # 将多部分邮件转换为字符串并发送
            server.sendmail(smtp_username, to_email, msg.as_string())
            server.quit()

            dispatcher.utter_message(template="utter_email_sent")
        except Exception as e:
            dispatcher.utter_message(text="发送邮件时出错:{}".format(str(e)))

        return []

上面的示例使用 smtplib 库与 SMTP 服务器进行交互,以便将电子邮件发送到给定的收件人地址。在 ActionSendEmail 类中, run 方法获取从对话轨迹中提取到的电子邮件的主要信息,并使用以下步骤将邮件发送出去:

  1. 创建一个多部分邮件对象,将正文和附件(如果有的话)添加到其中。
  2. 使用 SMTP 凭据进行登录。
  3. 设置邮件头部,包括发件人地址、收件人地址和邮件主题。
  4. 将多部分邮件对象转换为字符串并发送邮件。
测试聊天机器人

最后,启动 Rasa 服务并通过终端或聊天客户端与机器人进行交互。使用以下命令启动 Rasa 服务:

rasa run --endpoints endpoints.yml --credentials credentials.yml --enable-api --debug

现在可以向机器人说 “发送一封邮件” 并按照提示提供收件人、主题和内容信息。当一切正常时,机器人将发送一封电子邮件到指定的收件人地址,并显示“电子邮件已发送”的消息。

结论

在本文中,我们介绍了如何使用 Rasa 聊天机器人框架来自动发送电子邮件。通过定义意图、实体和对话流程,以及实现发送电子邮件动作,可以轻松地集成电子邮件发送功能到聊天机器人中,以提供更强大的用户体验。