一键部署龙虾,即刻拥有24小时全自动电脑Ai助理

免费下载

如果你还没有完成 OpenClaw 安装部署,可先下载 Claw龙虾部署大师。先把 OpenClaw 部署起来,再按本文完成邮箱收发配置,会更适合作为实际使用前的标准接入流程。

这篇教程解决的是一个很具体的问题:如何在 OpenClaw 里接入 163 邮箱的收件和发件能力。对 OpenClaw 来说,这件事不是在后台点一个“邮箱开关”就结束,而是分成两部分:一部分在 163 邮箱网页端开启 IMAP/SMTP 并生成授权码,另一部分是在 OpenClaw 工作区里写入 .env、放入脚本,再通过提示词或 cron 调起。

适用范围与准备项

本文以网易 163 邮箱为例,配置 OpenClaw 的收件与发件功能。邮箱端使用标准协议,OpenClaw 端使用本地脚本和环境变量完成调用。

项目 建议值 用途
收件协议 IMAP 993 + SSL/TLS 读取收件箱、同步状态
发件协议 SMTP 465 + SSL/TLS 发送测试邮件、通知邮件
登录凭证 163 授权码 同时用于 IMAP 和 SMTP
OpenClaw 运行方式 工作区脚本 + .env + prompt 或 cron 让 Agent 可调用邮箱收发能力

第一步:登录 163 邮箱网页端

先打开 163 邮箱网页端并登录要接入 OpenClaw 的邮箱帐号。后续的 IMAP/SMTP 开关和授权码,都需要在网页端完成。

网易 163 邮箱登录页

第二步:进入 POP3/SMTP/IMAP 设置页

进入邮箱主页后,在顶部菜单点击“设置”,再进入“POP3/SMTP/IMAP”。对于 OpenClaw 的邮箱收发配置,这一步是整个接入流程的起点。

163 邮箱 IMAP/SMTP 开启步骤截图

第三步:开启 IMAP/SMTP 并完成验证

如果你的目标是在 OpenClaw 中读取邮件并发送邮件,优先开启 IMAP/SMTP。这组服务分别负责收件和发件,是本文的主路径。开启过程中如果出现安全提示或手机验证,按页面提示完成即可。

如果你还有兼容旧客户端的需求,可以额外开启 POP3/SMTP;但对 OpenClaw 的自动化收发来说,优先跑通 IMAP/SMTP 即可。

第四步:生成并保存 163 授权码

163 邮箱网页密码不适合直接放进 OpenClaw 工作区脚本。更稳妥的做法,是在协议设置页下方进入授权码管理,生成一枚新的授权码,并把它写入 .env。

163 邮箱授权码获取步骤截图

这里最容易出错的地方只有一个:把网页登录密码当成脚本密码。163 邮箱在第三方客户端接入场景下,应优先使用授权码,而不是网页密码。

第五步:核对 IMAP 和 SMTP 服务器地址

OpenClaw 配置邮箱收发时,收件和发件不是同一个地址。收件通常使用 IMAP,发件通常使用 SMTP。

用途 服务器地址 端口 加密
收件 imap.163.com 993 SSL/TLS
发件 smtp.163.com 465 SSL/TLS

在 OpenClaw 端,授权码通常同时用于 IMAP 和 SMTP 登录。因此你只需要生成一枚新的授权码,并保证它没有被写错、复制错或过期失效。

第六步:在 OpenClaw 工作区写入邮箱参数

邮箱网页端配置完成后,就可以进入 OpenClaw 工作区。这里不建议把参数零散写进多个文件,第一版直接统一放到当前工作目录的 .env 里会更稳。

your-openclaw-workspace/
  .env
  scripts/
    check_163_inbox.py
    send_163_mail.py

建议先按下面这份 .env 模板填写。这里把收件和发件参数放到同一套环境变量里,后面 OpenClaw 调用脚本时更省事。

MAIL_IMAP_HOST=imap.163.com
MAIL_IMAP_PORT=993
MAIL_SMTP_HOST=smtp.163.com
MAIL_SMTP_PORT=465
MAIL_USER=your_name@163.com
MAIL_PASSWORD=replace_with_authorization_code
MAIL_FOLDER=INBOX
MAIL_FETCH_LIMIT=10
MAIL_FROM=your_name@163.com
MAIL_TO=your_other_mail@example.com

OpenClaw 官方环境变量文档说明,当前工作目录中的 .env 会参与变量加载。这意味着你把邮箱参数写在工作区 .env 里之后,后续脚本和 Agent 调用都更容易复用。

第七步:放入收件脚本

收件脚本建议先做到两件事:一是能连上 163 IMAP,二是能输出结构化 JSON。这样 OpenClaw 后面无论是做摘要、分类还是晨报,都会更容易处理。

from dotenv import load_dotenv
import email
import imaplib
import json
import os
from email.header import decode_header


def decode_mime_words(value: str) -> str:
    if not value:
        return ""
    parts = decode_header(value)
    decoded = []
    for text, encoding in parts:
        if isinstance(text, bytes):
            decoded.append(text.decode(encoding or "utf-8", errors="replace"))
        else:
            decoded.append(text)
    return "".join(decoded)


def main() -> None:
    load_dotenv()
    host = os.getenv("MAIL_IMAP_HOST", "imap.163.com")
    port = int(os.getenv("MAIL_IMAP_PORT", "993"))
    user = os.environ["MAIL_USER"]
    password = os.environ["MAIL_PASSWORD"]
    folder = os.getenv("MAIL_FOLDER", "INBOX")
    limit = int(os.getenv("MAIL_FETCH_LIMIT", "10"))

    mail = imaplib.IMAP4_SSL(host, port)
    mail.login(user, password)
    mail.select(folder)

    status, data = mail.search(None, "ALL")
    if status != "OK":
        raise RuntimeError("failed to search mailbox")

    all_ids = data[0].split()
    target_ids = all_ids[-limit:]
    items = []

    for mail_id in reversed(target_ids):
        status, msg_data = mail.fetch(mail_id, "(RFC822)")
        if status != "OK":
            continue

        raw = msg_data[0][1]
        message = email.message_from_bytes(raw)
        items.append(
            {
                "message_id": mail_id.decode(),
                "subject": decode_mime_words(message.get("Subject", "")),
                "from": decode_mime_words(message.get("From", "")),
                "date": message.get("Date", ""),
            }
        )

    mail.close()
    mail.logout()

    print(
        json.dumps(
            {
                "host": host,
                "port": port,
                "user": user,
                "mailbox": {
                    "folder": folder,
                    "total_messages": len(all_ids),
                    "fetched_items": items,
                },
                "result": "success",
            },
            ensure_ascii=False,
            indent=2,
        )
    )


if __name__ == "__main__":
    main()

这段脚本完成后,可以先手动运行一次验证链路。只要返回 result = success,并能看到最近邮件的主题、发件人和时间,说明收件端已经跑通。

pip install python-dotenv
python scripts/check_163_inbox.py

# 或者
uv run --with python-dotenv scripts/check_163_inbox.py

第八步:放入发件脚本

如果你的目标不只是“读邮件”,而是让 OpenClaw 还能主动发提醒、发测试邮件或发汇总邮件,就需要再放一份 SMTP 发件脚本。

from dotenv import load_dotenv
import argparse
import os
import smtplib
import ssl
from email.message import EmailMessage


def main() -> None:
    load_dotenv()

    parser = argparse.ArgumentParser()
    parser.add_argument("--to", required=False, default=os.getenv("MAIL_TO", ""))
    parser.add_argument("--subject", required=True)
    parser.add_argument("--body", required=True)
    args = parser.parse_args()

    host = os.getenv("MAIL_SMTP_HOST", "smtp.163.com")
    port = int(os.getenv("MAIL_SMTP_PORT", "465"))
    user = os.environ["MAIL_USER"]
    password = os.environ["MAIL_PASSWORD"]
    sender = os.getenv("MAIL_FROM", user)

    if not args.to:
        raise ValueError("missing recipient: use --to or MAIL_TO")

    msg = EmailMessage()
    msg["From"] = sender
    msg["To"] = args.to
    msg["Subject"] = args.subject
    msg.set_content(args.body)

    context = ssl.create_default_context()
    with smtplib.SMTP_SSL(host, port, context=context) as server:
        server.login(user, password)
        server.send_message(msg)

    print("result=success")
    print(f"to={args.to}")
    print(f"subject={args.subject}")


if __name__ == "__main__":
    main()

建议先给自己的另一个邮箱发一封测试邮件,确认 SMTP 登录、发件人地址和收件人地址都没有问题。

pip install python-dotenv
python scripts/send_163_mail.py --to your_other_mail@example.com --subject "OpenClaw 邮箱发信测试" --body "这是一封由 OpenClaw 调用 SMTP 脚本发出的测试邮件。"

# 或者
uv run --with python-dotenv scripts/send_163_mail.py --to your_other_mail@example.com --subject "OpenClaw 邮箱发信测试" --body "这是一封由 OpenClaw 调用 SMTP 脚本发出的测试邮件。"

第九步:让 OpenClaw 调用邮箱脚本

OpenClaw 端最稳的做法,不是先把脚本封成复杂技能,而是先让 Agent 直接在当前工作目录里调用脚本。这样最容易验证收件、发件和摘要链路是否真的可用。

收件测试提示词可以直接这样写:

运行 scripts/check_163_inbox.py
读取 JSON 输出
按四类整理最近邮件:
1. 需要处理
2. 安全提醒
3. 系统通知
4. 可忽略邮件

发件测试提示词可以直接这样写:

运行 scripts/send_163_mail.py
收件人使用 MAIL_TO
主题:OpenClaw 邮箱发信测试
正文:这是一封 SMTP 测试邮件

对于第一次接邮箱的用户,建议遵循这个顺序:先跑收件脚本,再跑发件脚本,最后再叠加分类、摘要和定时任务。这样排错成本最低。

第十步:给 OpenClaw 增加邮件晨报任务

如果你希望 OpenClaw 每天定时汇总邮箱内容,可以直接用 Gateway 自带的 cron。当前官方文档推荐使用 openclaw cron add 配置周期任务。

openclaw cron add \
  --name "163 邮箱晨报" \
  --cron "0 9 * * *" \
  --tz "Asia/Shanghai" \
  --session isolated \
  --message "运行 scripts/check_163_inbox.py,汇总昨天邮件。" \
  --announce

openclaw cron list

如果你在 Windows 上通过 WSL2 运行 OpenClaw,官方文档也明确建议把 Gateway 作为用户服务安装并启动,再去执行 cron 相关命令:

openclaw gateway install
systemctl --user enable --now openclaw-gateway.service
openclaw gateway status

也就是说,邮箱协议本身与 WSL 没有强绑定,但如果你后面要用 OpenClaw 的 cron、Gateway 或长期任务,WSL2 的 Gateway 服务状态就必须先正常。

常见问题

OpenClaw 能不能直接读取 163 邮箱,不写脚本行不行

第一版不建议这样做。对大部分用户来说,更稳的路径是:163 网页端开 IMAP/SMTP,OpenClaw 工作区放脚本和 .env,再让 Agent 调脚本。这样职责更清晰,后面也更容易排查。

为什么收件能成功,发件却失败

优先检查四项:SMTP 地址是否写成 smtp.163.com、端口是否写成 465、是否使用 SSL/TLS,以及密码是不是 163 授权码而不是网页密码。

为什么 OpenClaw 里读不到 .env

优先检查脚本所在目录是不是当前工作目录;其次确认 Gateway 当前运行实例对应的工作区是否正确;最后再检查 .env 文件名、变量名和权限是否写对。

163 授权码能不能重复给多个脚本使用

可以,但不建议这么做。更稳妥的方式是把 OpenClaw 这条接入链路单独使用一枚新的授权码,后续排查、重置和权限收缩都会更清楚。

总结

在 OpenClaw 里配置 163 邮箱收发,最稳的路径可以拆成三步:先在 163 网页端开启 IMAP/SMTP 并生成授权码,再在 OpenClaw 工作区写入 .env 和收发脚本,最后再用提示词或 cron 调起。这样做既能完成第一版收件和发件,也方便后面继续扩展成邮件摘要、自动提醒和定时汇总。

如果你希望先把 OpenClaw 更快部署起来,再回头接入邮箱功能,可先下载 Claw龙虾部署大师。先完成 OpenClaw 部署,再按本文配置 163 邮箱收发,会比把部署和邮箱接入混在一起更容易落地。

参考资料

温馨提示:本文由有用科技网站编辑部出品转载请注明出处,违者必究(部分内容来源于网络,经作者整理后发布,如有侵权,请立刻联系我们处理)

收藏

客服
扫描与客服沟通

回顶部
提示

正在拉起鸿蒙应用市场,如遇无法拉起/无法下载的情况,可使用鸿蒙设备,自行前往应用市场,搜索「Win解压缩」安装。

知道了