可观测性AI 评测LLMOpsAI 应用人工智能【免费下载链接】phoenixAI Observability Evaluation项目地址https://gitcode.com/gh_mirrors/phoenix13/phoenix点击查看免费下载导读本文围绕 Phoenix 开源仓库中内置的开发用 SMTP 服务器位于 scripts/docker/devops/smtp-server展开讲解它如何在本地开发环境中拦截 Phoenix 发出的所有邮件、通过 Web UI 可视化邮件内容并辅助调试邮件模板与 SMTP 发送链路。读完本文你将掌握该服务器的启动方式、端口与环境变量配置、邮件查看与 REST API 用法以及它与 Phoenix 端PHOENIX_SMTP_*配置的联动方式。这是什么一个只收不发的邮件调试工具Phoenix 在开发阶段会通过 SMTP 发送邮件例如密码重置、通知类邮件。如果直接让开发环境连接真实邮件服务既无法及时查看邮件内容也可能产生脏数据。为此仓库内置了一个仅用于开发环境的简单 SMTP 服务器其设计目标见 README非常明确捕获 Phoenix 在开发过程中发送的所有邮件提供 Web 界面查看邮件的 HTML、纯文本、原始数据与头部信息邮件仅保存在内存中用于快速调试不执行真实的邮件投递只做可视化展示。需要特别强调的是该服务器的 README 第一行就明确标注Not for production use——它刻意保持简单定位是开发期的邮件调试工具。快速开始随开发环境自动启动该 SMTP 服务器不需要单独部署它作为 Phoenix 开发环境的一部分随 Docker Compose 一起启动。使用仓库根目录的 tox 命令即可# 启动 Phoenix 开发环境包含 SMTP 服务器 tox r -e docker_devops启动完成后在浏览器访问邮件管理界面http://localhost:18273/mail其中18273是开发环境统一对外暴露的 HTTP 端口由 Traefik 反向代理统一路由见 docker-compose.yml 中 Traefik 的18273:80端口映射。除了 tox也可以直接使用dev.sh脚本见 devops README./dev.sh up # 等价于 tox r -e docker_devops ./dev.sh down # 停止所有服务 ./dev.sh rebuild # 依赖变化时全量重建停止开发环境后SMTP 服务器也会随之停止由于邮件存储在内存中重启后历史邮件会清空。工作机制三层结构的源码拆解从源码结构看该服务器由三个部分组成SMTP 接收层src/smtp/handler.ts基于smtp-server库实现 SMTP 协议服务负责接收邮件数据流Web 服务层src/server.ts基于 Fastify 提供 REST API 与静态文件服务前端 UI 层ui/基于 React Vite Tailwind CSS 构建的邮件查看界面。三个部分通过一个SMTPHandler类共享内存中的邮件列表。src/server.ts启动时打印的启动信息可以直观看到关键参数 SMTP Port: 1025 Web Port: 8025 Host: 0.0.0.0 Max Emails: 1000邮件接收与解析链路当邮件到达时SMTPHandler的handleData回调会通过mailparser库的simpleParser解析原始数据流再转换为统一的Email结构见 handler.ts。解析出的字段在 shared/types.ts 中定义包括字段含义id邮件唯一 IDrandomUUID生成messageIdSMTP Message-ID若存在from/to/cc/bcc收发人地址列表subject主题缺省时显示(No Subject)text/html纯文本与 HTML 正文attachments附件文件名、Content-Type、大小内容以 Base64 编码headers完整 SMTP 头部键值对timestamp时间戳size估算大小text 长度 html 长度 附件大小之和为了让开发调试更省心SMTP 服务器配置为authOptional: true认证可选且allowInsecureAuth: true允许不安全认证即任何客户端都能连接并投递邮件无需密码。onAuth回调会直接接受任意凭据见 handler.ts。内存存储与容量控制收到的邮件被unshift到内存数组头部最新邮件在前一旦总数超过maxEmails默认 1000最旧的邮件会被自动丢弃见 handler.ts。这意味着调试会话中邮件量很大时早期邮件会被自动淘汰这也是 README 中重启即清空、有上限说法的来源。配置项详解环境变量与默认值服务器配置通过环境变量注入src/server.ts启动时用 Zod schemaServerConfigSchema见 types/index.ts做校验非法配置会直接报错退出环境变量默认值说明SMTP_PORT1025SMTP 接收端口Phoenix 向此端口发送邮件WEB_PORT8025Web 服务端口经 Traefik 路由到/mailHOST0.0.0.0监听地址MAX_EMAILS1000内存中最多保留的邮件数超出自动淘汰最旧邮件ALLOWED_HOSTS空可选逗号分隔的允许访问主机列表在 docker-compose.yml 的smtp-dev服务中可以看到实际生效的配置smtp-dev: build: context: ./smtp-server dockerfile: Dockerfile restart: unless-stopped expose: - 1025 - 8025 environment: - SMTP_PORT1025 - WEB_PORT8025 - HOST0.0.0.0 - MAX_EMAILS1000 - LOG_LEVELinfo labels: - traefik.enabletrue - traefik.http.routers.smtp.ruleHost(localhost) PathPrefix(/mail) - traefik.http.services.smtp.loadbalancer.server.port8025 - traefik.http.middlewares.smtp-stripprefix.stripprefix.prefixes/mail注意这里的路由细节Traefik 将/mail前缀剥离后转发到容器的8025端口因此外网访问路径是http://localhost:18273/mail而不是直接访问8025端口——这正是 README 故障排查一节特别提醒的事项。镜像构建方式Dockerfile 采用 Node.js 22 的多阶段构建builder 阶段用 pnpm 12 安装依赖并编译 TypeScript 与前端 UIruntime 阶段以非 root 用户nodejsuid 1001运行node dist/server.js并暴露1025、8025两个端口。前端构建产物位于ui/dist由 Fastify 的fastify/static插件直接托管。Phoenix 侧联动SMTP 配置如何指向该服务器要让 Phoenix 发出的邮件进入这个调试服务器需要在 Phoenix 容器中配置 SMTP 指向localhost:1025。该配置同样在 docker-compose.yml 的 Phoenix 服务环境变量中完成# SMTP Configuration - PHOENIX_SMTP_HOSTNAMElocalhost - PHOENIX_SMTP_PORT1025 - PHOENIX_SMTP_USERNAMEdev - PHOENIX_SMTP_PASSWORDdev - PHOENIX_SMTP_MAIL_FROMnoreplyphoenix.dev - PHOENIX_SMTP_VALIDATE_CERTSfalse要点说明PHOENIX_SMTP_PORT1025正是 SMTP 服务器的接收端口两条配置必须一致用户名/密码dev/dev由于服务器authOptional接受任意凭据这里可以随意填写PHOENIX_SMTP_VALIDATE_CERTSfalse开发环境不校验 TLS 证书PHOENIX_SMTP_MAIL_FROMnoreplyphoenix.dev定义发件地址便于在邮件列表中快速识别。邮件查看界面四种视图与操作前端 UI见 ui/src/components提供左右分栏的调试界面左侧为邮件列表右侧为选中邮件的详情视图。点击邮件列表中的条目即可切换查看界面顶部提供Refresh刷新与Clear All清空全部两个操作按钮并支持明暗主题切换。针对单封邮件EmailViewer组件提供四种内容视图对应 README 中的四种查看方式视图说明HTML渲染后的邮件 HTML在iframesandboxallow-same-origin中展示以保证样式隔离也可一键切换查看 HTML 源码Text纯文本正文等宽字体展示Raw完整邮件数据以 JSON 格式化输出含所有解析出的字段HeadersSMTP 头部键值对列表详情头部区域会展示发件人、收件人、抄送、日期与邮件大小自动格式化为 B/KB/MB。若邮件带附件还会列出附件文件名、Content-Type 与大小内容以 Base64 存储在内存中不提供下载入口。邮件列表每项展示发件人、收件人、主题、时间与大小悬停可进行单封删除。REST API给脚本与自动化用的调试接口除了 Web UI服务器还通过 Fastify 暴露了一组 REST API见 server.ts可用来做自动化断言或集成到测试脚本方法路径功能GET/api/health健康检查返回{ success: true, data: { status: healthy } }GET/api/emails?page1pageSize50分页获取邮件列表返回emails / total / page / pageSizeGET/api/emails/:id按 ID 获取单封邮件DELETE/api/emails/:id删除单封邮件返回是否删除成功DELETE/api/emails清空全部邮件返回被清除的数量GET/api/stats统计信息总邮件数、最大容量、最旧/最新邮件时间戳、进程 uptime所有 API 响应遵循统一的ApiResponse结构success: true/falsedata或error见 shared/types.ts。注意在 Traefik 路由下这些接口的实际前缀是/mail/api/...——前端组件正是通过/mail/api/emails拉取数据见 EmailDebugger.tsx。前端开发模式Vite dev server下服务器还配置了 CORS允许localhost:5173与localhost:4173跨域访问见 server.ts。使用流程从触发邮件到定位问题按照 README 给出的使用步骤完整的调试循环是启动开发环境SMTP 服务器随tox r -e docker_devops自动启动在 Phoenix 中触发邮件例如触发密码重置、通知等任何会走 SMTP 的邮件功能查看邮件访问http://localhost:18273/mail新邮件会出现在列表顶部调试邮件内容在 HTML / Text / Raw / Headers 四种视图间切换核对 Phoenix 实际发送的正文与头部。常见问题排查收不到邮件按 README 的排查建议依次检查Phoenix 是否正确配置为向localhost:1025发送邮件确认 docker-compose.yml 中PHOENIX_SMTP_HOSTNAME与PHOENIX_SMTP_PORT与 SMTP 服务器端口一致开发环境是否在运行smtp-dev容器是否处于运行状态浏览器控制台是否有报错前端通过/mail/api/emails拉取数据若 API 请求失败会在控制台输出Failed to load emails。无法访问 Web UI务必使用http://localhost:18273/mail而非直接访问8025端口8025是容器内端口外部只能通过 Traefik 的/mail路由访问确认 Traefik 路由正常smtp-dev服务的 Traefik 标签/mail前缀 strip prefix 中间件是否正确生效。小结Phoenix 开发环境内置的 SMTP 服务器是一个刻意保持简单的开发期调试工具它以内存存储捕获所有入站邮件通过 Web UI 和 REST API 提供 HTML、文本、原始数据与头部四种视图无需任何真实邮件投递即可完成邮件内容验证。对于 Phoenix 开发者而言掌握tox r -e docker_devops启动方式、18273/mail访问入口以及PHOENIX_SMTP_*与SMTP_PORT等环境变量的联动关系就能在本地快速定位邮件模板与发送链路的问题。若需深入了解实现细节可继续阅读 handler.ts、server.ts 与 docker-compose.yml 中的smtp-dev服务定义。赞分享可观测性AI 评测LLMOpsAI 应用人工智能【免费下载链接】phoenixAI Observability Evaluation项目地址https://gitcode.com/gh_mirrors/phoenix13/phoenix点击查看免费下载相关推荐Laradock 集成 MailCatcher 实战指南在 Docker 开发环境中捕获邮件并调试 SMTPLaradock 集成 MailCatcher 实战指南在 Docker 开发环境中捕获邮件并调试 SMTP MailCatcher 是一款基于 Ruby 的后端开发工具DevOps如何为Remark42配置邮件服务器SMTP设置与故障排除终极指南如何为Remark42配置邮件服务器SMTP设置与故障排除终极指南 Remark42是一款功能强大的评论引擎为网站提供高效的评论管理系统。配置邮件服务器是使后端前端Spring Boot邮件服务开发SMTP配置与邮件发送完整指南Spring Boot邮件服务开发SMTP配置与邮件发送完整指南 想要快速掌握Spring Boot邮件服务开发吗 本终极指南将带你从零开始轻松配置S示例工程上一篇OpenMetadata实战指南构建企业级数据治理平台的5个关键步骤下一篇新闻长文自动摘要用 T5 微调文本摘要的一条最小路径创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
BAML 编译器分歧登记册(COMPILER_DIVERGENCE):规范与实现的偏差追踪机制 编程语言AI Agent编译器CLI人工智能 【免费下载链接】baml The programming language for agents 项目地址: https://gitcode.com/gh_mirrors/ba/baml 点击查看 免费下载 BAML 的类型系统规范文档 TYPE_SYSTEM.md 是一份**规定性(prescriptiveÿ… · 2026/9/25 3:19:03
Inoproshop指令库与库文件详解:从安装调用到封装避坑 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:25
SpringBoot学生考勤管理系统源码实战:环境搭建、数据库导入与二次开发 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:25
higgsfield项目深度解析:从强化学习原理到PyTorch实战 很多人第一眼看到“higgsfield”这个词,脑子里蹦出来的可能是物理课上那个给粒子赋予质量的希格斯场。我第一次在开源社区刷到这个项目名,也愣了一下,以为是某个理论物理方向的代码库。点进去才发现,这其实是一个聚焦强化学习和自… · 2026/9/25 4:25:19
汽车IMU原理与实战:从六轴感知到智能驾驶定位基石 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:13
ISO/SAE 21434网络安全合规落地:从风险评估到供应链治理 简介:本资源为ISO/SAE DIS 21434:2020(E)《道路车辆—网络安全工程》国际标准草案官方英文原版PDF文档,面向汽车电子工程师、信息安全研究人员、整车及零部件企业合规与功能安全团队,以及参与智能网联汽车认证与开发的技术人员。该草案构建了… · 2026/9/25 4:25:13
Elsevier期刊排版全指南:Neurocomputing投稿格式与LaTeX模板实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 4:25:07
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37