分类: 技术探索

  • 群晖自建个人域名邮件服务

    如何用 MailPlus 搭建自己域名的邮件服务呢?这几天花了点时间走通了,把方法分享给大家。

    前提条件:

    1. 一个自己的域名。我在阿里云上买了一个。
    2. 一个公网 IP 地址。我同样在阿里云上 99 元买了一个 2 核 2GB 内存 3M 带宽的 ECS。

    大概步骤如下,后面有进一步解释:

    1. NAS 上在 MailPlus Server 里配置自己的域名。
    2. 在域名上配置解析。
    3. 云服务器上配置流量中转服务。
    4. NAS 上配置流量中转客户端。
    5. 在阿里云邮件推送服务平台上配置发件账号。
    6. 在 MailPlus Server 那里配置邮件投递的中继设置。

    先声明下,整个配置过程涉及细节较多,我尽可能把重要的环节记录下来,难免疏漏,大家按步骤多试试,不清楚的可以在评论区讨论,也可以问问 AI(我就是这么搞通的),总会成功。

    本文针对的是没有公网 IP 地址的情况,比如笔者家里装的是移动宽带,就没有公网 IP(移动宽带是一个巨大的 NAT 网络)。如果你有公网 IP 地址,那恭喜你,配置非常简单,就只需要做前两步即可(不过你家里的路由器上可能需要配置一些端口映射)。

    特别需要注意的是,没有公网 IP 地址的时候,不能从 NAS 上直接往外发邮件,会极大概率被对方邮件服务器识别为垃圾邮件,丢垃圾桶甚至直接删除。

    第 1 步:配置 MailPlus Server

    假设你的域名是 example.com。如下图将自己的域名填进去。用户那里添加你允许的账户,例如你给自己分配了一个叫 admin@example.com 的邮箱:

    MailPlus Server 域名设置
    MailPlus Server 添加用户

    第 2 步:配置域名解析

    添加下面这些解析:

    1. 一条 A 类型,mail.example.com,指向你的公网 IP 地址,我这边配置成指向购买的 ECS 公网 IP 地址。
    2. 一条 MX 类型,主机记录:@,记录值:mail.example.com。
    3. 三条 TXT 类型:主机记录:@,记录值:v=spf1 include:[地址] -all,如果你有公网 IP 地址,则”[地址]”就填 IP 地址,否则填 spf1.dm.aliyun.com;主机记录:default._domainkey,记录值:v=DKIM1; k=rsa; p=[DKIM 公共密钥];主机记录:_dmarc,记录值:v=DMARC1; p=quarantine; rua=mailto:[你的一个邮箱]。

    DKIM 公共密钥在 MailPlus Server 里,在域名配置那里点击”高级设置”就能看到,如下图把它拷贝下来,填到主机记录里:

    MailPlus Server DKIM 高级设置

    第 3 步:ECS 上配置中转服务

    我们用 frp。下载 frp 后,在 ECS 上运行服务端 frps,配置如下:

    # frps.toml
    bindPort = 7000
    auth.method = "token"
    auth.token = "你的强密码"

    然后用下面的命令运行:

    nohup ./frps -c frps.toml > frps.log 2>&1 &

    nohup 是为了让 frps 能以后台进程的方式一直运行。

    阿里云安全组配置如下:

    1. TCP 7000 → 来源 NAS 公网出口 IP/32(不要对 0.0.0.0/0 开放)
    2. TCP 25, 993, 995, 443 → 来源 0.0.0.0/0

    第 4 步:NAS 上配置流量中转客户端

    使用 frpc,配置如下:

    # frpc.toml
    serverAddr = "47.96.67.98"
    serverPort = 7000
    auth.method = "token"
    auth.token = "你的强密码"
    [[proxies]]
    name = "smtp-25"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 25
    remotePort = 25
    [[proxies]]
    name = "imaps-993"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 993
    remotePort = 993
    [[proxies]]
    name = "pop3s-995"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 995
    remotePort = 995
    [[proxies]]
    name = "webmail-443"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 443
    remotePort = 443

    最好用 Docker 运行 frpc,我偷懒直接命令行脚本运行了,然后通过计划任务让 NAS 每次启动时自动运行这个脚本。

    第 5 步:配置阿里云邮件推送服务

    前面说了,如果你没有公网 IP 地址,不能直接从你的 NAS 上往外发邮件,很容易被对方邮件服务器识别为垃圾邮件。怎么办呢?刚好阿里云有一个邮件推送服务,每个账号每天有 2000 封邮件的额度可以发,一般用用足够了,地址:dm.console.aliyun.com。

    发信域名那里按照提示将自己的域名添加并验证通过。然后在发信地址那里新建发信地址。注意发信类型选择”触发邮件”。然后设置好 SMTP 密码:

    阿里云邮件推送发信地址配置

    第 6 步:配置邮件投递的中继服务

    最后一步,回到 MailPlus Server,配置邮件投递的中继服务:

    MailPlus Server 中继设置

    注意,阿里云邮件推送服务的端口是 80,这个不要搞错!

    好了,顺利的话到这里你就可以登录 MailPlus 客户端网页用 admin@example.com 收发邮件了:

    MailPlus 网页客户端撰写邮件

    给其他用户分配域名邮箱

    如果就自己用的话,到这里就搞定了。但是如果你想给 NAS 其他用户也分配自己域名的邮箱,例如 test@example.com,该怎么办呢?

    如果只在 MailPlus Server 上配置是不够的,因为阿里云邮件推送服务会严格校验发件人地址是否在已知的发件人列表中(还记得第 5 步里我们只配了 admin@example.com 吗?),如果不在,则直接拒绝,用 test@example.com 发出去的邮件就会卡在本地发送队列里,对方收不到。

    解决办法分两步:

    第一步,在阿里云邮件推送管理网页上再配一个发件地址:

    阿里云邮件推送新增发信地址

    第二步,在 MailPlus Server 上添加一个中继例外规则:

    MailPlus Server 中继例外规则

    这样当用 test@example.com 发邮件时,该条中继例外规则就会被命中,MailPlus Server 就会用专用的阿里云邮件推送服务账号来发送。

    每分配一个新的自己域名的邮箱,都需要按照上述两步配置一下。

    好了,在 MailPlus Server 上配置自己域名的邮箱服务就介绍到这里,你配置成功了吗?

  • 在Synology Chat里添加一个聊天机器人

    想在Synology Chat里添加一个自定义聊天机器人,该怎么弄呢?今天这篇文章以一个简单 echo 应答机器人为例,教大家怎么弄。

    第一步,在Chat里新建一个机器人。

    右上角点击“整合”,然后“机器人”,再点击“创建”,创建一个新机器人:

    注意把“在聊天机器人列表中隐藏”给勾掉,不然就不能和这个机器人聊天了。

    Synology Chat是用webhook的方式来实现机器人通信的,上图中“传出URL”就是当有人在Chat里给机器人发消息时,Chat就会把信息通过调用“传出URL”发出去。“传入URL”则是给机器人给用户回复消息用的,也就是说我们在机器人的实现代码里通过调用这个URL实现给用户返回数据的效果。“令牌”则用于验证合法性,调用时必须带上。

    第二步,准备一个Python脚本,这是聊天机器人的主程序,把令牌和“传入URL”填进去:

    import json
    import os
    import threading
    from datetime import datetime
    import requests
    from flask import Flask, request
    
    application = Flask(__name__)
    
    # ====== 配置区 ======
    OUTGOING_TOKEN = "机器人令牌"
    INCOMING_URL = "传入URL"
    # ===================
    
    def push(text: str, user_id: str):
        payload = {"text": text, "user_ids": [int(user_id)]}  # 关键:user_ids 是整数数组
        resp = requests.post(
            INCOMING_URL,
            data={"payload": json.dumps(payload, ensure_ascii=False)},
            verify=False,
            timeout=10,
        )
    
    @application.route("/webhook", methods=["POST"])
    def webhook():
        token = request.form.get("token", "")
        username = request.form.get("username", "")
        text = request.form.get("text", "")
        user_id = request.form.get("user_id", "")  # 新增:取发送者 ID
        if token != OUTGOING_TOKEN:
            return "forbidden", 403
        threading.Thread(
            target=push,
            args=(f"收到 {username} 的消息:{text}", user_id),
            daemon=True,
        ).start()
        return "", 200

    需要特别注意的是:因为我们要在NAS本机上部署聊天机器人服务器,所以要把“传入URL”的前面的地址改为localhost,而不用管聊天机器人配置里的地址(那个地址是Chat根据你打开Chat的网址自动帮你填的,不用管它)。例如我就把这个URL改为http://localhost:5000/webapi开头。

    将这段Python代码保存为main.py,放到NAS的磁盘上,例如我放在了web/webhooks/ChatBot里:

    第三步,搭建一个服务端作为聊天机器人的服务器。

    首先配置Python(如果没装的话,要先在套件中心里装一下):

    确保安装了Flask、requests模块,因为这两个模块在我们的机器人脚本里用到了。如果你还用了其他模块,也都要安装,否则Python脚本无法执行。

    然后在Web Station里新增一个网页服务,选择刚才配置好的Python服务:

    点击“下一步”后,配置好名字,选中我们在磁盘上放好的main.py:

    最后建一个网络门户:

    按下图进行配置,选中我们刚才创建的Python服务,“门户类型”选择“基于端口”,端口号填入8085(你可以自己选择一个端口号,但要和Chat里机器人配置那边保持一致)。

    点击“应用”,我们的聊天机器人服务器就运行起来了。

    做了这些后,终于可以开聊了。

    在“机器人”那里先把我们的机器人加进来:

    发个“你好”试试:

    好了,添加自定义聊天机器人大功告成!

    最后讲讲添加自定义机器人有啥用。我想了几个玩法:

    1. 用来给NAS发各种命令,进行远程控制,例如把喜爱的油管视频链接发给机器人,然后在Python代码里通过yt-dlp进行下载。
    2. 搭建自己的AI问答。我试过连接Kimi,可以成功进行聊天。你也可以连接其他模型,做个智能知识库助理也挺好。
    3. 连接家里的各种智能设备。因为我的NAS放家里,所以我可以在Python脚本里对家里局域网内的各种设备进行控制。

    可能有人会问,这些需求也可以有其他方式实现,为什么选择通过Synology Chat机器人来做呢?那就得提下这个方案的优势了:

    1. 基础设施好,群晖已经构建了完整套件。有Synology Chat Server套件,有各个平台的Chat客户端软件,这些都是现成的,拿来用即可,很稳定。当然现在国区下载这些稍微麻烦些,我后面会讲。
    2. 通过群晖QuickConnect服务连接,任何地方都可以使用,无需自己掏钱购买云服务器或者中转服务,手机app上连消息推送都有。
    3. 数据、代码都在NAS上,安全、稳定。

    最后说下国内如何下载安装Synology Chat。Chat Server在套件中心里已经找不到了,要自行去群晖官网下载:

    https://www.synology.com/en-global/support/download。iOS端的Chat App也在国区下架了,要去美区下载。