【教程】小白也能看懂的自建Cloudflare临时邮箱教程(域名邮箱)

写在前面

我一开始也没怎么用过Cloudflare,就最早的时候是用它来部署过Openai的接口中转,防止被墙(已经是很早很早之前的事情了,已经失效了),然后呢那天我打开cloudflare临时邮箱项目的官方教程文档,给我搞的一脸懵的,不过好在最后是成功搭建好了!写这个教程,也是为了帮助那些想搭,但是弄不明白的佬友,希望可以帮到你!

注意

此为临时邮箱,如果你需要注册自己觉得比较重要的平台且账号数据需要保留的情况下,请不要使用临时邮箱注册!!! 除非你打算一直使用你的域名邮箱!且自己有能力一直维护自己的邮箱服务!

我为什么想搭临时邮箱?

起初是一天晚上,半夜没睡着,然后不知道抽什么风,就想去域名注册看看,看能不能弄个好看点的域名,然后我试啊试,最终注册了一个goai.love,我想着不浪费的情况下,用它来做点什么,于是首先想到的就是搭建临时邮箱供给自己的朋友们一起使用,对打算搭个私有的临时邮箱

临时邮箱有什么好处?

我们知道,很多平台注册都会使用到邮箱,我们见过的常用邮箱有 gmailqq163等,一般会给一个固定的前缀,例如[email protected],这时,你会发现注册cursoropenaiclaude你只能用一个邮箱来注册,无法多次注册!说人话就是方便你可以无限注册薅羊毛(当然我也知道gmail可以有特殊的办法使它前缀不一致发送给同一个邮箱,我没试过就不说啦)

什么是临时邮箱?

标题上已经写了,它其实就是域名邮箱,只是我们用到的这个项目取名叫做临时邮箱,它是通过你自己购买的域名来在Cloudflare上搭建一个邮箱服务来实现的,所以你也可以叫它自建域名邮箱

准备

关于域名

  • 你可以寻找便宜的服务商去注册,我一般会在阿里云、腾讯云买域名,比如我为了写教程就买了一个linuxdo.love
  • 如果你想便宜,那就用不常见的后缀且域名前缀给长一点,不要学我,我这个域名续费180一年,18首年!
  • 在买域名的时候,你可以注意一下之后续费是多少钱一年,如果看不到,你可以尝试把1年加到2年一般就可以看到之后续费的价格了

项目原作者

第一步,将域名交给Cloudflare托管

打开Clouflare,配置转移域





打开域名服务商,这里以我的腾讯为例,其它平台都是同理的






回到Cloudflare继续,一般改过之后需要等一阵子才会生效(大概10分钟)









如果你不需要搭临时邮箱服务,只需要自己的域名邮箱

自此你可以设置成发送到电子邮件,也就是说这个xxx所有的邮件@linuxdo.love都会转发到你指定的邮箱里去
例如:

如果你需要继续搭建临时邮箱,请往下看!

搭建临时邮箱服务

创建D1数据库


打开项目地址,找到db/schema.sql

直达请点我




部署邮箱服务后端



nodejs_compat可以在这里复制!


代码直达地址,点我!

下载代码后,打开代码直接全部复制!


然后我们返回,继续配置D1数据库!





接下来,我们设置环境变量

你可以直接按我给的配置来配,如果你需要额外的配置可以查阅官方文档

文档直达

类型 说明
ADMIN_PASSWORDS JSON [“your_password”,“your_password_two”] admin 控制台密码, 不配置则不允许访问控制台,大白话:管理员密码不配置你怎么管理?可以多个,你也可以只配置一个!
ADMIN_USER_ROLE 纯文本 admin admin 角色配置, 如果用户角色等于 ADMIN_USER_ROLE 则可以访问 admin 控制台 大白话:如果角色是admin的用户就可以直接看到admin控制台
DEFAULT_DOMAINS JSON [“”] 这里给了一个空数组,也就是说没有登录的用户没有可用的域名,如果你想给没有登录的用户使用域名,你可以加上自己的域名[“linuxdo.love”] 它是一个数组也可以多个
DOMAINS JSON [“你的域名.love”] 这里是用来配置你的域名的,例如我的域名就是linuxdo.love,实际上还可以添加多个,例如[“linuxdo.love”,“goai.love”],当然配置的域名都得接入cloudflare哈!没接入你配了也没用!
ENABLE_AUTO_REPLY 纯文本 false 是否允许自动回复邮件,官方默认是false,我们也设置为false
ENABLE_USER_CREATE_EMAIL 纯文本 true 是否允许用户随机创建邮箱账户,默认为true就行,这样就可以创建不同的邮件账户啦!
ENABLE_USER_DELETE_EMAIL 纯文本 true 是否允许用户删除邮件,如果你不想用户删除邮件改成false就行
JWT_SECRET 纯文本 自己去生成一个! 这里需要一个密钥,打开https://www.librechat.ai/toolkit/creds_generator 生成后复制“JWT_SECRET”里的内容
NO_LIMIT_SEND_ROLE 纯文本 admin 可以无限发送邮件的角色,我设置成了admin,也就是说admin角色的用户可以无限发送邮件了!
USER_ROLES JSON [{“domains”:[“你的域名.love”],“prefix”:“”,“role”:“vip”},{“domains”:[“你的域名.love”],“prefix”:“”,“role”:“admin”}] 别从这里复制从表格下的代码块复制这个不然报错 设置两个系统角色,一个为vip一个为admin!
[{"domains":["你的域名.love"],"prefix":"","role":"vip"},{"domains":["你的域名.love"],"prefix":"","role":"admin"}]

如何配置?看图


一次性可以配置多个哈!


配置KV缓存






配置邮件转发【非常重要,必须配置】



自此!恭喜你!临时邮箱后端服务搭建完成!

搭建前端服务,也就是操作界面!

我们需要生成前端代码,打开官方文档,一个生成器!

直达地址

【注意】这里图片里打错字了,图片里说的是“自定义域”,我打成了“兹定于”









也许也不需要等十分钟,你可以用无痕浏览器,或者别的浏览器访问一下,看是否可以访问了!

测试是否正常

创建用户




测试接收邮件





调用API创建邮件获取邮件(请根据实际情况去修改代码!这是之前测试用的代码!)

import requests
import json
from time import sleep
import random
import string
import re

# 配置信息
WORKER_DOMAIN = ""  # 替换为你的后台域名,比如我的,apimail.linuxdo.love
EMAIL_DOMAIN = "" # 你的域名地址
ADMIN_PASSWORD = "" # 你的管理员密码

def generate_random_name():
    """生成随机邮箱名称"""
    letters1 = ''.join(random.choices(string.ascii_lowercase, k=5))  # 5个小写字母
    numbers = ''.join(random.choices(string.digits, k=random.randint(1, 3)))  # 1-3个数字
    letters2 = ''.join(random.choices(string.ascii_lowercase, k=random.randint(1, 3)))  # 1-3个小写字母
    return letters1 + numbers + letters2

def create_test_email():
    """创建测试邮箱"""
    try:
        random_name = generate_random_name()
        res = requests.post(
            f"https://{WORKER_DOMAIN}/admin/new_address",
            json={
                "enablePrefix": True,
                "name": random_name,
                "domain": EMAIL_DOMAIN,
            },
            headers={
                'x-admin-auth': ADMIN_PASSWORD,
                "Content-Type": "application/json"
            }
        )
        
        if res.status_code == 200:
            data = res.json()
            print("创建邮箱成功:")
            print(f"JWT: {data.get('jwt')}")
            print(f"邮箱地址: {data.get('address')}")
            return data.get('jwt'), data.get('address')
        else:
            print(f"创建邮箱失败: {res.status_code}")
            return None, None
    except Exception as e:
        print(f"创建邮箱出错: {e}")
        return None, None

def check_verification_code(jwt):
    """查看验证码"""
    try:
        limit = 10
        offset = 0
        res = requests.get(
            f"https://{WORKER_DOMAIN}/api/mails",
            params={
                "limit": limit,
                "offset": offset
            },
            headers={
                "Authorization": f"Bearer {jwt}",
                "Content-Type": "application/json"
            }
        )
        
        if res.status_code == 200:
            data = res.json()
            # print("\n收到的邮件:")
            # print(json.dumps(data, indent=2))
            
            # 使用正则表达式提取验证码
            if data.get('results') and len(data['results']) > 0:
                raw_content = data['results'][0].get('raw', '')  # 获取最新邮件的raw内容
                # 使用更简单的正则表达式,直接匹配数字
                code_matches = re.findall(r'code is: (\d{6})', raw_content)
                if code_matches:
                    verification_code = code_matches[0]  # 获取第一个匹配的6位数字
                    print(f"\n提取到的验证码: {verification_code}")
                    return True, verification_code
                else:
                    # 尝试另一种匹配方式
                    code_matches = re.findall(r'code is:\s*(\d{6})', raw_content)
                    if code_matches:
                        verification_code = code_matches[0]
                        print(f"\n提取到的验证码: {verification_code}")
                        return True, verification_code
                    print("未找到验证码")
                    return False, None
            else:
                print("邮件列表为空")
                return False, None
        else:
            print(f"获取邮件失败: {res.status_code}")
            return False, None
            
    except Exception as e:
        print(f"获取邮件出错: {e}")
        return False, None

def main():
    # 1. 创建测试邮箱
    jwt, address = create_test_email()
    if not jwt or not address:
        print("无法继续测试")
        return
        
    print("\n创建的邮箱信息:")
    print(f"JWT: {jwt}")
    print(f"邮箱地址: {address}")
        
    # 2. 等待一会儿,让邮件有时间送达
    print("\n等待10秒钟让邮件送达...")
    sleep(10)
    
    # 3. 查看验证码
    success, code = check_verification_code(jwt)
    if success:
        print(f"成功获取验证码: {code}")
    else:
        print("获取验证码失败")

结束

啊,从21点写到现在01点03分,终于写完了,希望能帮到佬友,发送邮件我就不写了,需要的可以去看看官方文档,第一次写教程,如果有错误或者欠缺的地方,欢迎佬友们补充!我去睡觉了!我还说我调整作息呢…又熬到1点了
访问地址:https://mail.linuxdo.love/

最后接好运

昨天中了40 5块钱中了40块钱!自己买疯狂星期四! - #6,来自 XiaoHuang
今天中了50

祝佬友们也好运连连!

本教程允许搬运,但请标注出处,谢谢

282 个赞

事无巨细,赞了

13 个赞

感谢分享有时间试试

10 个赞

实在太棒了,:+1:给了

10 个赞

好强啊,感谢分享~

10 个赞

很细,感谢佬友

9 个赞

我靠!这个教程也太长长长长了!!!!

9 个赞

:tieba_087: 写给小白的,不得细点!

10 个赞

太详细了,太适合新手了

10 个赞

太强了,感谢佬的精心制作分享

10 个赞

这个手把手教学写起来很费时间,谢谢分享

12 个赞

这也太细了吧 :+1:

我直接 catch all 转 duck 再转飞书。

12 个赞

整挺好!! :tieba_087:

12 个赞

太细心啦tieba_013

9 个赞

很吊,很详细,收藏了

9 个赞

太详细了老友

9 个赞

学了。感谢大佬

9 个赞

教程很好很细,为了写教程专门买域名,大受震撼!赞赞支持!

7 个赞

刚刚好之前建这个一直失败)
谢谢啦

7 个赞

祝佬友发大财

8 个赞