Email诞生记(下)

Flask新手注册系统实战:从零实现邮箱验证与密码安全存储 Web注册系统是理解HTTP请求生命周期、表单处理与数据持久化的经典入门场景。其核心原理在于服务端接收用户输入、执行多层校验(格式、业务规则、唯一性)、安全哈希密码并持久化至数据库。技术价值体现在可控的安全实践——如手动SQL参数化防注入、bcrypt显式盐值管理、SQLite事务异常捕获,避免ORM抽象带来的认知盲区。典型应用场景包括MVP产品冷启动、教学沙盒环境搭建及全栈基础能力验证。本文以Flask+SQLite+原生SQL为技术栈,聚焦邮箱验证、密码二次确认与错误反馈等关键环节,还原真实新手从‘写不 阅读详情

上次在《Email诞生记》说到小王和老周设计了电子邮件的系统, 但是不能支持附件 -- 这也是本文要解决的重点。 

3

附件

小王回去后想了很久, 怎么才能给在邮件中加上附件呢?  邮件的正文是文本格式的, 但图片,word这些文件是二进制的,完全不同啊?


小王躺在床上翻来覆去很久才睡着, 甚至做了一个Email的梦 :-)


第二天小王找到了师傅老周讲了自己的困惑。 


老周说: "我们搞计算机行业的,遇到问题解决方法通常有两个: 1. 增加一个抽象层  2. 分而治之。"


小王不满的心想: 这不等于什么都没有说嘛!


老周笑了:你想想, 我们把原始问题划分成两个子问题来解决: 1.  如何让邮件正文和附件区分开来。   2. 如何把二进制的数据加入到邮件中。 


小王说: “第一个问题我觉得很简单, 在正文中画一道分隔线不就行了, 上面是正文 ,下面是附件”


“你犯了一个错误,小王,  你把计算机当成人了 , 其实计算机很笨,你需要精确的定义那个分隔线到底是什么, 我们还得精确的告诉计算机,这个邮件分为多个部分, 有些是正文,有些是附件”


小王不好意思的笑了: “的确是, 我们要不这样,先定义一个邮件的内容类型,例如Content-type=plain-text , 那这个邮件就是纯文本的, 如果Content-type=mixed, 就代表是有文本就有附件”


老周想了想说:“这样的话扩展性不好, 我们把Content-type 分为主类型/子类型, 像这样:” 


老周说着在白板上画了起来:

Content-type = 主类型/子类型

其中主类型和子类型都可以扩展。 

现阶段:如果主类型是Text , 那子类型可以是 plain, 代表纯文本,  也可以是别的东西, 现在我也不知道, 可以扩展。


如果主类型是Multipart , 就代表这个文件有多个部分组成, 那子类型可以是mixed, 即多个部分是混合的。


例如:  

Content-type=text/plain   : 这是个纯文本邮件

Content-type=multipart/mixed  : 这是一个由正文和附件混合组成的邮件。


(码农翻身注: text 除了plain之外,还支持html ,   multipart 还支持alternative, related  , 为了简化,这里不再展开 )


小王说:师傅你考虑的可真是长远啊, 但是这个文本和附件之间的分隔符怎么弄? 


老周说: “我们可以让发邮件的客户端,像我们的Quickmail 自己来选择, 但是选择以后要告诉我们, 我想可以在Content-type后面加个分隔符的属性


Content-type=multipart/mixed;  

boundary="----=_NextPart_AEDGREGREWGREWGFDSFGSGFDSFTTRFSGGFD_001_0051_01A";


只要这个boundary的属性和邮件中的数据不冲突就可以 。”


小王说:“我试着设计一个包含附件的正文, 师傅你看看。 ”


//定义这是一个混合的邮件, 每个部分的分隔符由boundary定义。 为了便于阅读, 我把这个boundary故意写的很简单, 实际复杂的多


Content-type=multipart/mixed;  

boundary="--A001_0051_01A";


//以分隔符来开始邮件正文

----A001_0051_01A


//这是“为了庆祝产品发布, 今晚在海底捞聚餐”的base64编码的结果

5Li65LqG5bqG56Wd5Lqn5ZOB5Y+R5biD77yMIOS7iuaZmuWcqOa1t+W6leaNnuiBmumkkA==


----A001_0051_01A

Content-type:audio/wav

name:"fly.wav"

<这里是附件1的数据>


----A001_0051_01A

Content-type: image/jpg

name:"sky.jpg"


<这里是附件2的数据>

//整个邮件结束的标记

----A001_0051_01A


老周说: 怪不得老板夸你说你一点就透,果然是啊, 你都能想到给每个附件加个名称和类型了


“还是师傅你考虑的周到,这个Content-type可以随便扩展啊, 想写成啥写成啥。 那第二个问题:附件的内容怎么办? ”


“刚才你写那个邮件正文的base64编码的时候,没有给你启发吗? ”老周反问到


“啊,对了, 这些附件无非就是二进制的数据, 完全可以像处理汉字那样用base64来编码啊! 为了扩展性, 我们要不给每一个部分加一个编码类型的属性? 例如:”

Content-type: image/jpg

name:"sky.jpg"

encoding: base64


老周满意的说:“没问题,可以的”

4

扩展

小王和老周已经设计了一个收取邮件, 发送邮件的系统, 这个系统还可以支持附件。

 

在老周的带领下, 小王和其他同事经过几个月的时间把这个系统的客户端和服务器端开发了出来,经过同事的使用, 反响非常的好, 现在公司里每个人都可以快速的收发邮件了,工作效率有了极大的提升。

 

有一天老板的朋友来参观公司, 看到了这个神奇的系统,也立刻自己的公司部署了一套,包括一个QuickMail服务器和多个客户端,  发现真是好用。

 

Email 系统就这么一传十,十传百的传开了。 


小王所在的MSHP公司仅仅靠出售QuickMail 系统,每年都活的非常滋润。 


但是很快大家就遇到了一个问题: Email 在一个公司内运转的良好, 但是两个公司之之间还是没法发送邮件, 商务合作就不顺畅了。 


小王想:既然我们的QuickMail 客户端和邮件服务器可以通过SMTP来通信 ,那两个邮件服务器之间是否也也可这么通信呢?


小王找到师傅提出了这个问题。 


老周说:当然可以, 比方说吧, 有两个公司, 他们的邮件服务器分别是mailA.com   和 mailB.com  , 当userA@mailA.com 给 userB@mailB.com发信的时候, 我们可以这么处理:


1.  用户userA通过SMTP把邮件发给mailA.com  这个邮件服务器


2.  mailA.com  发现目标用户userB@mailB.com 并不在 自己的服务器上, 它就把信件暂时放到队列里。


3.  mailA.com 从队列中取出邮件, 然后尝试向mailB.com 投递 ,也是通过SMTP, 如果发送失败, 就给userA 发一个投递失败的消息。


4.  mailB.com 接收到以后, 存到userB的邮箱里, userB 就可以通过POP3 协议进行收取了 


这里唯一做的变化就是让邮件服务器可以暂存邮件, 转发邮件。 


于是他们发布了QuickMail 的第2版, 大受欢迎, 很快全世界的邮件服务器都连起来了。 


小王和老周由于设计和实现了电子邮件的系统, 在IT界声名鹊起。

5

创业

时间过得很快,90年代初, 有个叫做蒂姆·伯纳斯·李的家伙发明了WWW 互联网, 之前大家只是通过主机相连, 通过telnet , email, bbs 等交流信息, 没想到html ,http以及浏览器出现以后,互联网能够如此的多彩多姿。 


小王( 不, 这时候已经是老王了)看到了其中的商机: 既然大家都习惯用浏览器上网, 为什么不把Quickmail 也搬到互联网上去呢?  


我可以开发一个基于Web 的邮件系统, 任何想要的人都可以分配一个免费的电子邮件账户 ! 并且在浏览器中使用 !


老王去找老板, 可是老板一直觉得之前的Quickmail 卖的这么好,是公司的主要现金流来源,  搞个免费的Web系统, 那不是革了自己的命吗?  所以一直不支持。 


老王感慨于老板的短视, 于是联合老周出来创业了, 有了之前的系统做基础, 他们很快搞出了一套叫做coolmail 的web系统, 在推广上, 他们创造性的采用了一种叫做“病毒营销”的策略: 


系统刚开始的时候不接受公开注册申请,而是通过自己的员工等首批成功注册的用户对外发出测试邀请。


即每个用户拥有若干个coolmail账号发放的权限,以邀请的形式发给若干个朋友,幸运者加入后各自也将拥有几个邀请资格,发放给更多的朋友。


试想想,全球每天有多少人接收了coolmail邀请,又有多少人在将他的邀请当作礼物一样发放出去,不需要自己费时费力做推广,业务就像病毒曼延一样由用户自动传播开去,每个参与者都在帮自己宣传。


当然coolmail本身产品质量也是非常过硬的。 


coolmail 用户群迅速的爆炸式的增长, 到了1998年, 已经有了几亿的用户, 这引起了想进入互联网的大鳄 microhard 公司的注意, 经过若干轮的谈判, 老王和老周把coolmail 以5亿美金卖了出去,  两人摇身一变成了亿万富豪, 从此就退休了。 


后记

2001年, 我在中科院计算所做本科的毕业实习, 做的就是一个基于Web的Email 系统, 虽然很简陋, 但真的学到很多的东西, 尤其是第一次觉得这些协议和系统没什么神秘的,自己也能实现一套出来,那种成就感是无与伦比的。 


回想起那时候啃RFC英文协议的痛苦, 以及调试SMTP,POP3客户端程序时的挣扎, 真是感慨万千。 


特以此文作为纪念。 


扩展阅读:

给小白的HTTP指南

IE为什么把Chrome和火狐打伤了

我是一个线程

我是一个Java class

Javascript: 一个屌丝的逆袭

CPU 阿甘

Node.js :我只需要一个店小二

假如我是计算机系老师

假如时光倒流,我会这么学Java


0?wx_fmt=jpeg

公众号:码农翻身

“码农翻身”公众号由工作15年的前IBM架构师创建,分享编程和职场的经验教训。

Flask新手注册系统:从零实现用户注册与密码安全存储 Web注册功能是后端开发的入门核心场景,涉及HTTP请求处理、表单数据解析、数据库持久化及密码安全防护等基础能力。其底层原理基于GET/POST方法语义区分、request.form参数解析、SQLite轻量级存储与bcrypt加盐哈希机制,技术价值在于以最小依赖(Flask+bcrypt+sqlite3)构建可运行、可调试、可验证的闭环流程。典型应用场景包括学习型项目、MVP原型验证和教学实践,尤其适合Python基础扎实但缺乏Web开发经验的新手。本文聚焦‘极简注册动线’,完整呈现从HTML表单提交、F 阅读详情

相关推荐

Flask新手注册系统实战:从零搭建安全可用的用户注册流程

用户注册是Web应用最基础的身份入口,其本质是HTTP表单提交、服务端验证、密码安全存储与数据库持久化的完整闭环。理解这一流程需掌握请求响应机制、CSRF防护原理、密码哈希必要性及SQLite轻量事务特性。技术价值在于以最小依赖(Flask+Werkzeug+WTForms+SQLite)实现防重复、防明文、防伪造的核心安全能力,适用于内部工具登录、MVP产品验证、教学实验等低并发但高可靠需求场景。本文聚焦真实新手视角,详解如何绕过Django/FastAPI等重型框架,用原生Flask构建可运行、可调试、

weixin_34082854的博客 441

EMail诞生记

前言:本文主要介绍EMail的原理和协议, 人物,公司,情节纯属虚构,请勿对号入座。上个世纪80年代初, 小王从计算机系毕业了, 进入了很多人梦寐以求的MSHP公司,一...

码农翻身 1033

Flask新手注册系统:从零实现安全用户注册全流程

Web用户注册是全栈开发的基础能力,其本质是前端表单与后端服务的协同交互,涉及HTTP请求处理、数据校验、密码安全存储及数据库事务管理等核心原理。技术价值在于建立最小可行的用户身份认证闭环,为登录、会话、权限等后续功能奠定数据与安全基础。典型应用场景包括个人项目起步、教学实验、内部工具搭建及MVP产品验证。本文以Flask为框架,聚焦真实新手视角,详解如何用SQLite+WTForms+werkzeug.security构建具备邮箱查重、密码哈希、CSRF防护和错误反馈的健壮注册系统,覆盖从项目初始化、表单

weixin_30628801的博客 334

AI编排实战:MuleSoft+LangChain构建企业级AI交响指挥系统

AI编排(AI Orchestration)是打通大模型与企业核心系统的关键技术,其本质是通过标准化数据流转、确定性服务治理与可解释AI逻辑,在复杂异构环境中实现‘对的数据、对的模型、对的流程’协同。它既不是单纯调用LLM的Prompt工程,也不是传统ESB的简单升级,而是融合API集成、业务规则引擎、向量检索与合规管控的分层架构范式。在金融、制造、SaaS等强治理场景中,MuleSoft提供企业级数据管道的契约性与审计能力,LangChain则承载动态推理与语义理解,二者协同解决数据断层、能力断层与治理断

332

Skill工程:用开放标准重构AI协作范式

AI能力封装正从非结构化的Prompt工程,迈向标准化、可验证、可编排的Skill工程——这是一种以能力契约为核心的新型接口范式。它将AI功能抽象为带输入输出Schema、SLA约束与安全策略的‘数字员工’,通过统一注册发现机制实现跨系统自动协同。相比依赖人工调试的提示词,Skill工程提供可复用性、可组合性与可审计性,支撑企业级AI中台建设、智能体编排及多组织能力共享。本文深入解析Skill的构成要素、开放标准实践(如OSI)、Registry设计原理及生产级治理方案,覆盖产品经理、后端工程师与技术负责人

diaoqi6581的博客 434

Git alias 配置实战:提升开发效率与团队协作的配置层API

Git alias 是 Git 内置的命令映射机制,本质是配置层的轻量级 API,不依赖 shell 环境、无需额外工具,通过 .gitconfig 实现跨平台、跨终端的一致行为。其核心原理在于 Git 进程启动时解析 alias 配置并重写命令流,具备环境无关性、可继承性和安全边界。技术价值体现在降低输入错误率、固化高频操作肌肉记忆、强化操作防护(如 force-push 二次确认)及支撑团队规范落地。典型应用场景包括日常状态查看(git st)、分支切换(git co)、可视化日志(git lg)、差异

weixin_30797199的博客 343

OpenClaw:面向工程师的本地化AI编程操作系统

AI编程操作系统是一种将大语言模型与本地开发环境深度集成的新型工具范式,其核心在于通过命令行接口(CLI)实现确定性调度、以可审计的Skill单元封装真实世界操作能力,并依托本地部署保障数据主权与系统亲和力。相比传统代码补全工具,它强调Agent主动理解工作流而非被动响应光标;相比云端AI助手,它支持直接访问.gitconfig、SSH密钥、内网API等敏感上下文。OpenClaw正是这一范式的典型实践,提供YAML定义Skill、POSIX兼容执行、LLM后端灵活切换等关键能力,适用于运维提效、Agent

weixin_34377919的博客 439

模板驱动型文档自动化:从填空到智能交付的技术实践

模板驱动型文档自动化是一种以预定义结构化模板为核心,通过动态内容填充、样式继承与条件逻辑编排实现标准化文档批量生成的技术范式。其原理在于将业务规则编码进模板的占位符、样式链与动态区块中,替代人工重复操作,保障输出一致性与合规性。相比AI生成侧重内容创作,该技术更强调确定性、可审计性与品牌可控性,具备低代码、高复用、多格式一致等工程优势。典型应用场景覆盖销售提案、法律合同、培训手册、医疗SaaS方案等需高频交付、强格式约束的业务文档。本文深入解析Sqribble模板引擎在结构化占位符、样式继承链、动态区块管理

cishan3804的博客 407

Trac-Slack 集成实战:用 Tracbot 实现事件驱动的智能通知

Trac 作为经典的开源项目管理工具,其 ticket 生命周期管理能力强大但信息封闭;Slack 则是团队实时协作中枢,二者割裂将导致状态不同步、响应延迟与协作熵增。本文围绕事件驱动架构原理,解析如何通过轻量级 Tracbot 插件,在不侵入 Trac 核心、不引入外部服务的前提下,实现 ticket 创建、状态变更、代码提交等关键事件的语义化 Slack 推送。技术价值在于零网络依赖、高上下文保真、配置即代码;适用于 DevOps 过渡期团队及 Trac 1.2–1.4 环境。核心热词:Tracbot、

weixin_30385925的博客 356

MuleSoft+LLM企业级AI编排:打通大模型与ERP/CRM的生产级集成

大语言模型(LLM)作为新一代智能引擎,其真正价值不在于单点对话能力,而在于深度融入企业核心业务系统——如SAP、Salesforce、ServiceNow等承载真实事务的ERP/CRM平台。实现这一融合的关键,在于可靠的API编排与数据治理能力:需将LLM的非结构化语义理解,精准转化为符合企业系统契约的结构化指令,并反向注入实时、可信、可审计的业务上下文。MuleSoft Anypoint Platform凭借原生企业连接器、可视化流程编排、端到端数据血缘追踪及开箱即用的可观测性,成为跨越‘AI演示’与‘

weixin_33724659的博客 401

SpringBoot+Vue+Mysql社区医院信息平台(源码+文档)

SpringBoot+Vue+Mysql学生宿舍信息管理系统 WEB端软件项目(源码+文档) 项目包含:①完整源码(后端+管理后台+用户前台);②数据库脚本文件;③万字论文文档;④开题报告;⑤答辩PPT;⑥项目运行视频教程。 项目架构: B/S 架构、MVC 分层设计 技术栈: Java、MySQL、SpringBoot、MyBatis-Plus、Token 权限校验、管理后台 Vue+ElementUI+ECharts、用户前台 Layui+jQuery、Maven 构建。 一、角色设计 学生用户: 注册登录、浏览宿舍信息、查询宿舍安排、在线报修、缴费查询、失物招领、桶装水预订、评论交流、收藏等。 商家用户: 注册登录、桶装水品牌与商品信息维护、预订订单查看与处理。 维修人员: 注册登录、查看待处理报修、接单维修、填写报修处理结果与进度反馈。 管理员: 学生管理、班级管理、宿舍信息管理、宿舍安排管理、报修处理管理、缴费信息管理、卫生检查与文明宿舍管理、失物招领管理、桶装水与商家管理、维修人员管理、公告资讯与轮播图管理等。 二、前台功能模块(学生端) 1. 首页展示:轮播图、宿舍公告、最新动态推荐、常用服务快速入口 2. 宿舍信息模块:宿舍列表、楼栋与房间条件筛选、宿舍详情查看、我的宿舍安排查询 3. 在线报修模块:在线提交宿舍设施报修申请、上传故障描述、查看报修进度与维修处理结果 4. 缴费模块:水电等缴费记录查询、缴费状态查看 5. 卫生检查与文明宿舍:宿舍卫生检查结果公示、文明宿舍展示 6. 失物招领模块:失物信息发布、招领信息发布、详情查看、评论互动 7. 桶装水预订:桶装水品牌与商品浏览、在线预订、我的预订记录查询 8. 假期留宿:假期留校申请提交、申请记录查询 9. 评论与收藏:信息评论、查看他人评论、评论回复互动、收藏感兴趣的内容 10. 个人中心...

钓鱼邮件攻击全解析:从SMTP协议漏洞到社会工程学防御实战

网络钓鱼攻击是当前网络安全领域最常见的社会工程学攻击手段之一,其核心原理是利用邮件协议的基础缺陷和人性心理弱点。SMTP协议在设计之初缺乏强制的身份验证机制,使得攻击者能够轻易伪造发件人地址、操纵邮件头信息,这是钓鱼邮件得以广泛传播的技术基础。通过结合相似域名欺骗、显示名伪装等技术手段,攻击者能够制作出极具迷惑性的钓鱼邮件。这类攻击的技术价值在于其低成本、高回报的特性,能够绕过传统安全设备的静态检测,直接针对组织中最薄弱的环节——人员。在实际应用场景中,钓鱼邮件常被用于窃取登录凭证、传播恶意软件、实施金融诈

weixin_33690963的博客 333

数据挖掘实战:决策树 + 聚类 + 关联规则,零 Key 离线可跑(Python 源码)

数据挖掘实战包。用 Python 标准库实现 CART 风格决策树、K-Means 聚类与 Apriori 关联规则,在虚构「星河便利店」会员表和购物篮上跑通分类、分群与购物篮分析,并给出准确率、轮廓系数、支持度/置信度/提升度。零第三方依赖、零 API Key 即可离线跑通。含 4 个样例、离线冒烟、中文 README(含「使用方法」)。均为作者原创可运行源码。MIT。作者 blog.youkuaiyun.com/mtl1994

模板驱动文档自动化:零代码实现业务人员自助生成

文档自动化是企业提升运营效率的关键技术路径,其核心在于解耦内容与格式,通过模板引擎实现结构化渲染。相比AI生成易导致责任模糊、数据不一致和审计缺失,也区别于代码定制带来的高维护成本与知识壁垒,模板驱动方案以零代码、可视化、强可控为特征,天然适配市场、销售、法务等非技术人员。它依托占位符(如{{client_name}})、条件区块与循环列表等轻量逻辑,结合API/CSV等数据源绑定,支撑合同、对账单、报价单等高频文档的批量精准生成,在金融、SaaS、医疗等强合规场景中保障可追溯性与版本一致性。

Dendy之Java小屋 331

产业园区如何高效对接企业技术需求与高校科研成果?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

国央企创新负责人如何快速掌握本地科技资源分布与匹配情况?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

AI Agent落地实战:自主决策、环境交互与分层架构设计

AI Agent并非简单调用大模型的智能助手,而是一种具备感知—推理—行动闭环能力的工程化系统。其核心原理在于将复杂任务解耦为可验证、可隔离的职责单元,并深度适配真实业务环境——包括API稳定性、数据噪声、规则变更等动态变量。技术价值体现在高可靠决策(如92%准确率)、低延迟响应(350ms内)与强容错能力(故障自动降级)。典型应用场景覆盖电商退货自动化、工业预测性维护、慢病管理干预等需实时判断与多系统协同的领域。本文聚焦生产级AI Agent的分层架构实践,深入解析感知、决策、执行与协调四层如何协同工作,

vanadiumlin 181

国央企创新负责人如何实现科技成果的精准识别与高效筛选?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

上一篇: EMail诞生记
下一篇: 小王的架构师之路
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值