最近做的企微二开,销售每天收几十封客户邮件——询价、投诉、合同确认,要在企微和邮件两个地方切换处理。业务方要求把邮件接入企微——邮件进来自动推送到企微,AI 分类后给销售,销售在企微里就能回复邮件。这篇重点讲邮件和企微怎么打通、AI 怎么分类邮件、回复怎么从企微回到邮件。把调了哪些接口记下来。

 Eyun 平台开放的企微 API,统一 POST+JSON,鉴权用 App Token 加 appid(Authorization: Bearer eyk_xxxx),路径 {BASE_URL}/wx-api/api/<模块>/<动作>,响应封套 {code, data, detail, message, time},code 为 0 成功。

邮件接收:IMAP 拉新邮件

后端定时用 IMAP 协议拉新邮件:

import imaplib
import email

def fetch_new_emails():
    mail = imaplib.IMAP4_SSL("imap.example.com")
    mail.login("sales@example.com", "password")
    mail.select("inbox")
    
    # 拉未读邮件
    _, data = mail.search(None, "UNSEEN")
    emails = []
    for num in data[0].split():
        _, msg_data = mail.fetch(num, "(RFC822)")
        msg = email.message_from_bytes(msg_data[0][1])
        emails.append({
            "from": msg["From"],
            "subject": msg["Subject"],
            "body": get_body(msg)
        })
    return emails

拉到新邮件后,每封邮件要推送到企微给对应销售。

查销售:调联系人接口

邮件要推给谁,按邮件发件人匹配负责销售。调联系人接口查:

import requests

BASE = "https://api.eyun.com"
HEADERS = {"Authorization": "Bearer eyk_xxxx", "Content-Type": "application/json"}

def find_sales_for_customer(appid, customer_email):
    # 按邮箱查客户,找到负责销售
    resp = requests.post(
        f"{BASE}/wx-api/api/contact/search",
        headers=HEADERS,
        json={"appid": appid, "keyword": customer_email}
    )
    data = resp.json()["data"]
    if data.get("list"):
        customer = data["list"][0]
        return customer.get("owner_uin")  # 负责销售uin
    return None

查不到负责销售的邮件推给公共客服组。接口路径在 Eyun 平台开发文档。

AI 分类邮件

邮件推给销售前,AI 先分类——询价、投诉、合同、其他,让销售一眼看出优先级:

def classify_email(subject, body):
    prompt = f"""
    邮件主题:{subject}
    邮件内容:{body[:500]}
    
    分类到:询价 / 投诉 / 合同 / 售后 / 其他
    并提取关键信息(客户公司、产品、金额如有)
    """
    result = llm.chat(prompt)
    return {"category": result["category"], "info": result["info"]}

AI 分类让销售不用每封邮件都读全文,看分类和关键信息就知道该不该优先处理。

推送邮件到企微:调 sendRichText

邮件分类后推送到销售的企微,发卡片带分类标签和操作按钮:

def push_email_card(appid, to_uin, email_data, classification):
    card = {
        "title": f"[{classification['category']}] {email_data['subject']}",
        "description": f"发件人:{email_data['from']}\n{classification['info']}",
        "url": f"https://mail.example.com/view/{email_data['id']}",
        "buttons": [
            {"text": "查看邮件", "url": f"https://mail.example.com/view/{email_data['id']}"},
            {"text": "在企微回复", "action": "reply_email", "data": {"email_id": email_data["id"]}}
        ]
    }
    requests.post(
        f"{BASE}/wx-api/api/message/sendRichText",
        headers=HEADERS,
        json={"appid": appid, "to": to_uin, "cards": [card]}
    )

卡片带"在企微回复"按钮——销售点按钮直接在企微里输入回复内容,不用切到邮件客户端。关于消息卡片和交互按钮,在Eyun 企业微信 API 平台有说明。

接收回复:Webhook 收按钮回调

销售点"在企微回复"输入内容,Webhook 回调进来:

from flask import Flask, request

app = Flask(__name__)

@app.route("/wx-api/webhook/", methods=["POST"])
def webhook():
    event = request.headers.get("X-Eyun-Event")
    if event == "card.action.trigger":
        payload = request.json["data"]
        if payload["action"] == "reply_email":
            email_id = payload["data"]["email_id"]
            from_uin = payload["fromUin"]
            # 接下来让销售输入回复内容
            send_text(payload["appid"], from_uin, "请输入回复内容")
    
    elif event == "message":
        # 销售输入的回复内容
        payload = request.json["data"]
        if waiting_for_email_reply(payload["fromUin"]):
            content = payload["content"]
            email_id = get_pending_email(payload["fromUin"])
            send_email_reply(email_id, content)
            send_text(payload["appid"], payload["fromUin"], "邮件已回复")
    
    return "ok"

卡片按钮回调和消息回调都走 Webhook,按事件类型区分。销售在企微输入回复内容,后端拿到后调邮件接口发出去。

发送邮件:SMTP

回复内容从企微拿到后,通过 SMTP 发邮件:

import smtplib
from email.mime.text import MIMEText

def send_email_reply(email_id, reply_content):
    original = email_store.get(email_id)
    
    msg = MIMEText(reply_content, "plain", "utf-8")
    msg["Subject"] = f"Re: {original['subject']}"
    msg["From"] = "sales@example.com"
    msg["To"] = original["from"]
    
    smtp = smtplib.SMTP_SSL("smtp.example.com", 465)
    smtp.login("sales@example.com", "password")
    smtp.send_message(msg)
    smtp.quit()

邮件发完后调企微接口通知销售"邮件已回复"。不做通知,销售不知道发出去没。

邮件转任务:调标签接口

重要邮件(投诉、合同)要转成任务跟踪。调标签接口给客户打标签记录:

def create_task_from_email(appid, email_data, classification):
    if classification["category"] == "投诉":
        # 调标签接口给客户打投诉标签
        customer_uin = find_customer_uin(appid, email_data["from"])
        requests.post(
            f"{BASE}/wx-api/api/label/updateLabel",
            headers=HEADERS,
            json={"appid": appid, "uin": customer_uin, "labels": ["投诉待处理"]}
        )

邮件不只是看完就完,重要邮件要转成任务、打标签、跟踪到闭环。关于标签和客户管理接口,在开发文档里。

写在最后

AI 邮件助手这套东西,本质是把邮件协议(IMAP/SMTP)和企微接口串起来——IMAP 拉邮件、contact/search 查负责销售、AI 分类、sendRichText 推卡片到企微、销售在企微回复、SMTP 发邮件、updateLabel 打标签转任务。把邮件和企微打通,销售不用在两个系统切换,邮件进来企微就看到、企微里回复就发出。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐