dreamhunter2333 / cloudflare_temp_email

CloudFlare free temp domain email 免费收发 临时域名邮箱 支持附件 IMAP SMTP TelegramBot
https://mail.awsl.uk
MIT License
2.63k stars 996 forks source link

[Feature] V0.28 需求改进建议 #164

Closed pdhapy closed 5 months ago

pdhapy commented 6 months ago

倒腾了几天类似的项目也看了不少,本项目基本在功能上基本上是完成度最高的产品了。建议可以优化的是:

邮箱名开通优化:

admin 后台强化:

易用性优化:

不是Bug的Bug

UI优化:

UI优化是大话题,继续用段时间再细细说。当前核心功能已经完全够用了,用来做个人的临时邮箱或是团队的临时邮箱很爽,细节部分无伤大雅,感谢大佬。

dreamhunter2333 commented 6 months ago

感谢整理,我慢慢优化下,一起学习

pdhapy commented 6 months ago

客气了哦。

那我就不客气了,接着补上:

dreamhunter2333 commented 6 months ago
  1. 已添加

    image
  2. 是用来翻页的,每页默认 20 封邮件

    image
  3. 0.2.10 版本已修改

    image
Raejesh commented 6 months ago

我也来提个建议,算是文档的补充吧。关于发送邮件部分,是可以配置子域名发送邮件的。 比方说我想通过subdomain.example.com这个域名发送邮件,我是按下面步骤操作的:

  1. 在域名的电子邮件路由添加一个子域subdomain.example.com, 这可以让cf自动生成一些DNS记录
  2. 添加/修改DNS记录
    • spf记录复制粘贴文档的就好,即v=spf1 include:_spf.mx.cloudflare.net include:relay.mailchannels.net ~all
    • _mailchannels.subdomain的内容复制原本_mailchannels的内容,subdomain可以写全但cf也会帮你自动缩写
    • mailchannels._domainkey.subdomain的内容复制原本mailchannels._domainkey的内容
    • _dmarc.subdomain的内容复制原本_dmarc的内容 一句话概括下,就是你的example.comDNS有哪些TXT的解析记录,给要用来发邮件的子域名复制一份,名称里面就带上子域名。
  3. 把子域名添加到workers变量的DOMAINS里,部署即可. (不知道cf有没有API可以修改DNS记录,这样就可以随时自定义子域名了🤪)
dreamhunter2333 commented 6 months ago

我也来提个建议,算是文档的补充吧。关于发送邮件部分,是可以配置子域名发送邮件的。 比方说我想通过subdomain.example.com这个域名发送邮件,我是按下面步骤操作的:

  1. 在域名的电子邮件路由添加一个子域subdomain.example.com, 这可以让cf自动生成一些DNS记录
  2. 添加/修改DNS记录

    • spf记录复制粘贴文档的就好,即v=spf1 include:_spf.mx.cloudflare.net include:relay.mailchannels.net ~all
    • _mailchannels.subdomain的内容复制原本_mailchannels的内容,subdomain可以写全但cf也会帮你自动缩写
    • mailchannels._domainkey.subdomain的内容复制原本mailchannels._domainkey的内容
    • _dmarc.subdomain的内容复制原本_dmarc的内容 一句话概括下,就是你的example.comDNS有哪些TXT的解析记录,给要用来发邮件的子域名复制一份,名称里面就带上子域名。
  3. 把子域名添加到workers变量的DOMAINS里,部署即可. (不知道cf有没有API可以修改DNS记录,这样就可以随时自定义子域名了🤪)

赞,居然还能这样子

pdhapy commented 6 months ago

(不知道cf有没有API可以修改DNS记录,这样就可以随时自定义子域名了🤪)

必须有, Cloudflare API:

List DNS RecordsCreate DNS RecordDelete DNS RecordUpdate DNS RecordOverwrite DNS Record

pdhapy commented 6 months ago

这里也分享记录一下这几天排查的一个有点意思的苹果系统的Lockdown锁定模式下的问题:

问题表现

在一台系统开了Lockdown锁定模式的苹果测试机上,打开前台一片空白,手动在Safri中关掉了Lockdown锁定模式问题也依旧,换用ChromeFireFoxBrave 等浏览器,问题也都一样,打开前台只有空白。

环境、复现步骤

IOS 17.x+(IOS 16也一样), 打开系统的Lockdown锁定模式

1、所有手机端常见浏览器,打开前台。

2、在Safari中关掉当前站点的锁定模式后再刷新站点前台。

预期行为

站点能正常访问,或者是在Safari中关掉当前站点的锁定模式后能正常访问。

实际问题表现

只要是系统开启了Lockdown锁定模式,即便在Safari中临时关掉锁定模式后也无法正常访问。

偶然把系统的Lockdown关闭后,可以正常打开了。

严重程度/影响范围

严重,影响范围较小。(虽未有确切数据,但普遍认为苹果用户开启Lockdown的不足10%)

当前只测试了iPhone,iPad、Mac未测试,预估是一样的问题。

问题排查与初步结论

在实际使用中,绝大多数web站点都能在锁定模式中正常浏览,少数浏览不正常的,在Safari中关掉Lockdown后也可以正常浏览。但这次不同,基本上不是(单个)浏览器拦截了,而是所有浏览器都不行,结合关闭Lockdown后可以正常访问,因而考虑是从系统层面对站点进行了拦截或禁用。

而关于Lockdown模式,苹果公开的资料并不多。在实际中,会导致在Lockdown中出现问题的常见原因有:

一般这些关掉Safari中的Lockdown后都是可以正常浏览的,但像这次这样彻底屏蔽的还是第一次遇到。

在翻了N多文档排查了两天后,现基本上考虑为使用了WebAssembly的原因。 因为苹果系统在开启Lockdown后,基于安全原因会从系统层面禁用掉对WebAssembly的支持,同时封禁或限制掉JIT、WebGL、WebRTC等的应用,而这些貌似项目中都没用到,那也就只有WebAssembly了,也就是 Mail Parser wasm。 至于安全跨域的问题,不确定是否有,但在CF的HSTS Proxy下,有也不严重。

后续

这个问题基本上无解,当然也没有最终确认,要确认至少需要换一个邮件解析组件后再测试。

当然,如果在兼容性和性能上选择的话,我会选择兼容,也会有人也会选择性能。 鱼和熊掌选什么的问题。

只是不知道能否给前台提供个常规的邮件解析组件做为备选,可以在CLI编译部署时来配置选择(默认也可以是现在的Mail Parser)。

(问题待大佬@dreamhunter2333复现核实)

dreamhunter2333 commented 6 months ago
  • 4.在 iPhone 上的“隐私与安全性”设置中,打开“锁定模式”。

看起来这个锁定模式禁用了 wasm,其实代码中还有wasm之前解析的 js 库,只是这个wasm 加载失败的情况需要做下处理

chrome 使用 --js-flags=--noexpose_wasm 参数启动即可复现

pdhapy commented 6 months ago

chrome 使用 --js-flags=--noexpose_wasm 参数启动即可复现

确实,确定就是这个问题了。

dreamhunter2333 commented 6 months ago

客气了哦。

那我就不客气了,接着补上:

  • 16、同上述5,admin 后台,管理员应该可以查看所有邮件,当前发件箱默认没有列出用户发出去的邮件,只能通过用户账号列表的账号操作来查看用户发出去的邮件,建议是:admin的发件箱默认列出所有用户发出去邮件。

  • 17、admin 后台邮件的查看方式,交互可能真的需要变了,前面说的做成手风琴效果可能都不行,在邮件较多的情况下,还是只能先列表列出邮件,然后在一个二级页面中查看,如:左右分栏的方式。

  • 18、admin 后台账号页,除了当前的,列出用户的账号名称、创建时间,建议统计下账号的邮箱收发数量,并列出来,即:增加账号的 已收邮件 数 和 已发邮件 数的统计结果显示。同时:当统计的数量大于 0 时,点击相应的 邮件数量 可以跳转到相应的收/发件箱中查看。

  • 19、团队使用中,还是需要一个邮件转发功能,即:用户邮箱账号可以绑定转发邮箱,进入该邮箱的邮件可以转发到实际的工作邮箱中。 如果是公开站点,为避免滥用,可以由管理员来设置特定的账号才有此权限,正好可以由上述 3 、说的,admin后台开设用户账号一起使用。

  • 20、可配置参数是否开放用户获取邮箱,如果不开放获取邮箱(相当于关闭注册),前台无获取邮箱的按钮入口(通过接口也不行), 仅能由管理员在 admin 手动开设。

16,17,18,20 最新版 v0.3.1已添加

dreamhunter2333 commented 6 months ago

这里也分享记录一下这几天排查的一个有点意思的苹果系统的Lockdown锁定模式下的问题:

问题表现

在一台系统开了Lockdown锁定模式的苹果测试机上,打开前台一片空白,手动在Safri中关掉了Lockdown锁定模式问题也依旧,换用ChromeFireFoxBrave 等浏览器,问题也都一样,打开前台只有空白。

环境、复现步骤

IOS 17.x+(IOS 16也一样), 打开系统的Lockdown锁定模式

  • 1.打开 “设置” 。

  • 2.轻点“隐私与安全性”。

  • 3.向下滚动,轻点“锁定模式”,然后轻点“打开锁定模式”。

  • 4.在 iPhone 上的“隐私与安全性”设置中,打开“锁定模式”。

  • 5.轻点“打开锁定模式”。

  • 6.轻点“打开并重新启动”,然后输入设备密码。

1、所有手机端常见浏览器,打开前台。

2、在Safari中关掉当前站点的锁定模式后再刷新站点前台。

预期行为

站点能正常访问,或者是在Safari中关掉当前站点的锁定模式后能正常访问。

实际问题表现

只要是系统开启了Lockdown锁定模式,即便在Safari中临时关掉锁定模式后也无法正常访问。

偶然把系统的Lockdown关闭后,可以正常打开了。

严重程度/影响范围

严重,影响范围较小。(虽未有确切数据,但普遍认为苹果用户开启Lockdown的不足10%)

当前只测试了iPhone,iPad、Mac未测试,预估是一样的问题。

问题排查与初步结论

在实际使用中,绝大多数web站点都能在锁定模式中正常浏览,少数浏览不正常的,在Safari中关掉Lockdown后也可以正常浏览。但这次不同,基本上不是(单个)浏览器拦截了,而是所有浏览器都不行,结合关闭Lockdown后可以正常访问,因而考虑是从系统层面对站点进行了拦截或禁用。

而关于Lockdown模式,苹果公开的资料并不多。在实际中,会导致在Lockdown中出现问题的常见原因有:

  • 1、非同源或未定义的跨域资源调用(特别是非htts的):如图标、图片资源的调用等,多表现为跨域资源的显示缺失;

  • 2、不正确/未做安全处理的跨域数据交互,多表现为按钮等交互点击后因浏览器拦截掉前后端的交互调用而失去响应等;

  • 3、前端脚本中过度使用了包含有隐私问题的客户端追踪或控制的脚本代码或组件,导致这部分被拦截后Web的渲染异常;

一般这些关掉Safari中的Lockdown后都是可以正常浏览的,但像这次这样彻底屏蔽的还是第一次遇到。

在翻了N多文档排查了两天后,现基本上考虑为使用了WebAssembly的原因。

因为苹果系统在开启Lockdown后,基于安全原因会从系统层面禁用掉对WebAssembly的支持,同时封禁或限制掉JIT、WebGL、WebRTC等的应用,而这些貌似项目中都没用到,那也就只有WebAssembly了,也就是 Mail Parser wasm。

至于安全跨域的问题,不确定是否有,但在CF的HSTS Proxy下,有也不严重。

后续

这个问题基本上无解,当然也没有最终确认,要确认至少需要换一个邮件解析组件后再测试。

当然,如果在兼容性和性能上选择的话,我会选择兼容,也会有人也会选择性能。 鱼和熊掌选什么的问题。

只是不知道能否给前台提供个常规的邮件解析组件做为备选,可以在CLI编译部署时来配置选择(默认也可以是现在的Mail Parser)。

(问题待大佬@dreamhunter2333复现核实)

最新版已修复,wasm 失败后会使用 js 库解析

pdhapy commented 6 months ago

16,17,18,20 最新版 v0.3.1已添加

大佬这更新效率简直让人惊叹!赞!

现就期待账号绑定多个邮箱别名,和转发功能了(如果邮箱账号绑定有第三方收件箱的,进邮件了本地一份,转发一份)了。

pdhapy commented 6 months ago

建议: 全站类似于这里的 密码 ,叫 密钥登录密钥 可能更合适,用原意 Token令牌 的话,非行业相关的看着很迷糊,如果叫密码的话,习惯上还是手动设置的短的字符串叫密码,这个挺长的,用 密钥 就正合适了。正好也可以把用户名/密码留出来,给注册用(如果这个功能做的话,其实感觉做不做都可以,现在这样我觉得挺好的,只是个人习惯和需求问题)

image

dreamhunter2333 commented 6 months ago

TODO:

REF

  • 1、可配置选用户名时保留用户名关键字,如:info,admin,等等,适用于不启用前缀的公开站点或是团队使用站点;

已增加

  • 2、可配置自选用户名最短长度如5位,(最大长度不知道是否已限制)

目前有限制 0-100 字符 https://github.com/dreamhunter2333/cloudflare_temp_email/blob/fc6b0246b15b5ac7fa7677754eea7601546c4fd3/worker/src/common.js#L9-L14

  • 3、admin 后台可开设邮箱,与用户前台自动生成的区别是:admin可任意自定义邮箱名称,包括无前缀的,同时可配置发信权限等。也可以同前台一样只是自动生成一个随机邮箱;

已增加

  • 4、admin入口路由允许通过配置参数更改(可配置为其它的字符串,默认为admin);

暂未实现

  • 5、admin可以查看所有用户邮件,并批量选择批量删除,普通用户前台批量删除邮件(如果系统开通有普通用户可删除邮件的权限控制时);

暂未实现批量功能

  • 6、会员账号删除后,账号下的邮件归为无收件人,这个逻辑有点别扭,因为这些邮件确实是普通用户建有账号收到的邮件(即便账号已经删除了),而不是catch-all过来的,因而建议是:普通会员删除账号后,其收到的邮件还是列在邮件列表里,但是需要标注为原收取邮件的账号,并且将账号标记为已删除(如:将其账号显示为带删除线样式即可)。

暂未实现, 暂时未做软删除,需要修改数据库 schema,会增加数据库占用

  • 7、自动回复功能可关闭或限制邮件地址回复的次数(不确定代码层面是否有限制),这可能会造成漏洞,如果有人,不停的往域名发邮件,然后系统不停的自动回复....... 实际上,轻量的临时邮件类的产品,用到这个功能并不多。

已增加开关

  • 8、自动刷新秒数倒数(易用性优化:低优先级)

已增加

  • 9、定时自动维护(如:定时12小时删除过去30天的邮件,也就是当前维护功能的trigger版),貌似有人的提过了。

已增加

  • 10、admin邮件阅读展开后,不能再折叠回去了,建议手风琴效果,默认全部折叠,只显示当前浏览的,折叠回其它的。

已修改

  • 11、用户账号收信列表左侧上面的 1/1 不知道具体意思是什么,一直没变,永远都是 1/1。

为翻页按钮

  • 12、普通用户删除账号后,再次尝试用密码登录时提示:“获取地址失败, 请检查你的 jwt 是否有效 或 网络是否正常。”,建议是:“登录密码无效或账号不存在,也可能是网络连接异常,请稍后再尝试。”

已修改

  • 13、满屏自适应,当前的网格布局两边边距太宽了,在大屏显示器下(特别是带鱼屏)这个边距会被放大很多(其实也不是什么大问题,可以后期整下UI的优化一起做);

已增加选项,可隐藏侧边距

  • 14、增加个页脚的版权信息,整个版面会更协调。

已增加

  • 15、HTML信件内容显示优化,这个如果展开来说有点大了,现在的情况是,没有对HTML信件内容的显示方式做样式约束,随意就展开了,整个信件页面显示很乱。

已增加选项,可选择三种显示方式

  • 16、同上述5,admin 后台,管理员应该可以查看所有邮件,当前发件箱默认没有列出用户发出去的邮件,只能通过用户账号列表的账号操作来查看用户发出去的邮件,建议是:admin的发件箱默认列出所有用户发出去邮件。

已修改

  • 17、admin 后台邮件的查看方式,交互可能真的需要变了,前面说的做成手风琴效果可能都不行,在邮件较多的情况下,还是只能先列表列出邮件,然后在一个二级页面中查看,如:左右分栏的方式。

邮件展示已全局统一

  • 18、admin 后台账号页,除了当前的,列出用户的账号名称、创建时间,建议统计下账号的邮箱收发数量,并列出来,即:增加账号的 已收邮件 数 和 已发邮件 数的统计结果显示。同时:当统计的数量大于 0 时,点击相应的 邮件数量 可以跳转到相应的收/发件箱中查看。

已增加

  • 19、团队使用中,还是需要一个邮件转发功能,即:用户邮箱账号可以绑定转发邮箱,进入该邮箱的邮件可以转发到实际的工作邮箱中。 如果是公开站点,为避免滥用,可以由管理员来设置特定的账号才有此权限,正好可以由上述 3 、说的,admin后台开设用户账号一起使用。

暂未实现,转发对发件的消耗很大,暂时没想到怎么实现,如果工作邮箱能绑定到 cf 的话,可以调用使用 cf 的邮件转发

  • 20、可配置参数是否开放用户获取邮箱,如果不开放获取邮箱(相当于关闭注册),前台无获取邮箱的按钮入口(通过接口也不行), 仅能由管理员在 admin 手动开设。

已增加

pdhapy commented 6 months ago

赞! :thumbsup:

  • 2、可配置自选用户名最短长度如5位,(最大长度不知道是否已限制)

目前有限制 0-100 字符

用户名限制0-100可能会有问题哦。 按修订的 RFC 3696规范 ,email 地址的长度标准为: {用户名最长64个字符} + @ + {域名最长255个字符} = 总共最长320个字符 其中用户名最长只允许 64个字符。 在实际使用中,建议使用gmail的规则,用户名为6~30个字符。 最长的30可以写死,最短的,默认6位,建议是可配置的,如:可配置为最短3位,这样就完全可以适用于个人、内部使用对外开放注册的各个场景了。

供参考。

--

  • 19、团队使用中,还是需要一个邮件转发功能,即:用户邮箱账号可以绑定转发邮箱,进入该邮箱的邮件可以转发到实际的工作邮箱中。 如果是公开站点,为避免滥用,可以由管理员来设置特定的账号才有此权限,正好可以由上述 3 、说的,admin后台开设用户账号一起使用。

暂未实现,转发对发件的消耗很大,暂时没想到怎么实现,如果工作邮箱能绑定到 cf 的话,可以调用使用 cf 的邮件转发

现在是这么用的,但是配置很麻烦,而且需要验证转发邮箱有效性,最理想的还是这些功能通过邮件worker来实现,更长远来说,这个项目的邮件worker很有成为全功能的Cloudflare email worker的潜力,甚至于可以替代绝大部份市面上的免费域名邮箱。

而转发功能,对性能的消耗具体我也没有测试过,但是,Cloudflare是有自带有 email worker 的转发功能的,

export default {
  async email(message, env, ctx) {
    const allowList = ["friend@example.com", "coworker@example.com"];
    if (allowList.indexOf(message.from) == -1) {
      message.setReject("Address not allowed");
    } else {

      await message.forward("inbox@corp");

    }
  }
}

这应该也是email worker的初衷,邮件路由Catch-All 到 worker 后,worker 全面接管该域名的邮件服务功能,包括转发规则(当然后台配置的规则优先),只是不确定 message.forward("inbox@corp")是否能直接转发,

参考: Routing an email to more than one address from the same user Email Worker to Forward to Multiple Emails

官方社区的原始需求: Feature: Email Routing - Multiple Catch-all Addresses 和待核实的天坑(转发的目标邮件地址需要先验证)。

pdhapy commented 6 months ago
  • 6、会员账号删除后,账号下的邮件归为无收件人,这个逻辑有点别扭,因为这些邮件确实是普通用户建有账号收到的邮件(即便账号已经删除了),而不是catch-all过来的,因而建议是:普通会员删除账号后,其收到的邮件还是列在邮件列表里,但是需要标注为原收取邮件的账号,并且将账号标记为已删除(如:将其账号显示为带删除线样式即可)。

暂未实现, 暂时未做软删除,需要修改数据库 schema,会增加数据库占用

邮件软删除其实不需要的,毕竟还是定位于轻量级应用,且更偏向于临时性使用,所以对数据的管理要求其实没有这么高,之前是因为删除了用户没有删除用户的邮件,所以才提了这个需求对已删用户的未删邮件进行特殊的标记,看到有人把这个报告为BUG来处理后,在删除了用户的同时也删除了对应的邮件后,那么这个需求也就不存在了。感谢。

dreamhunter2333 commented 5 months ago

已增加普通用户的批量删除/下载

image
pdhapy commented 5 months ago

赞。

关 issue 了,感谢大佬。