内部说明文档 · 正文统一使用中文

邮件联系人名片与 IM 资料需求说明

版本:V1.1 · 更新:2026 年 10 月 8 日 · 状态:开发评审稿。

本文说明桌面邮件阅读区的联系人点击功能,重点是邮箱与 IM 账号匹配后的用户详情卡。文中区分“已确认规则”“当前原型”“待确认项”,开发不可把禁用占位当作已实现业务,也不可自行补齐待确认规则。

一、目标与范围

用户在阅读邮件时,无需离开邮箱即可查看发件人或收件人的身份资料、复制邮箱地址;邮箱匹配到 IM 账号时,可进一步查看协同用户详情。

本次范围包括联系人入口、邮箱名片、IM 详情卡、邮箱复制提示、加载与异常状态。未匹配 IM 的联系人需要区分是否已添加为邮件联系人,这是已提出的展示需求,尚未实现两态分支。

联系人名片的添加星标、移入免提醒、邮件特别提醒不在系统规划范围内:不展示入口,不保留禁用占位,也不列为后续待开发项。参考截图中的这些功能不纳入需求。

本次不实现真实发信、聊天、语音、视频、联系人维护或权限系统。日程邀请卡片、日历联动、邮件列表原有星标展示和移动端维持原有行为。截图仅用于结构参考,高保真视觉由 UI 设计师负责。

二、入口与打开方式

  1. 在桌面邮件详情头部,点击发件人的头像、名称或邮箱区域,打开对应邮箱名片。
  2. 点击收件人邮箱,打开该收件人的邮箱名片。查询目标是被点击的地址,不是当前登录邮箱或邮件中其他人的地址。
  3. 名片锚定点击位置;打开名片不改变当前邮件选择和阅读位置。
  4. 匹配到 IM 后,点击名片头部打开二级 IM 详情卡。邮箱复制按钮是独立操作,不触发详情展开。
  5. 详情优先显示在名片右侧,空间不足时自动避让至左侧或调整位置,内容不能超出视口而不可访问。
  6. Escape 先关闭最上层详情并返回其触发入口;继续关闭名片时返回原联系人入口。点击外部区域按 Popover 的标准行为关闭。

当前入口不包含邮件正文中的任意地址或 ICS 卡片内部的组织者/参与人。未来若扩展这些入口,应复用同一套组件,不另建名片逻辑。

三、身份判断:两个维度不可混用

“是否匹配 IM”与“是否已添加为邮件联系人”是独立状态:未匹配 IM 的地址也可能已保存为邮件联系人;匹配 IM 也不等于已保存为邮件联系人。

IM 匹配结果邮件联系人状态展示结果当前交付状态
匹配成功独立判断

邮箱名片,可展开 IM 用户详情

名片与详情已实现;联系人保存状态未接入

明确未匹配未添加

未添加邮件联系人名片

两态展示待实现

明确未匹配已添加

已添加邮件联系人名片

两态展示待实现

查询中或失败

不能据此推断

加载或错误状态,不显示“未匹配”结论

加载、错误及重试已实现

IM 匹配规则

四、未匹配 IM 的两种名片

两种名片均显示联系人名称、完整邮箱的可复制入口和头像;不显示 IM 用户详情入口。

状态主操作区更多菜单

未添加邮件联系人

添加为邮件联系人、写邮件、更多

查看往来邮件

已添加邮件联系人

写邮件、往来邮件、更多

编辑联系人、删除联系人

此表整理自两张参考截图,并已按产品确认去除不规划的功能,描述目标展示,不代表当前原型已按此分支渲染。添加/删除是否在原型中切换状态、联系人归属范围及其他操作的实际业务行为仍待确认;未确认前保持禁用,不做虚假成功提示。

五、匹配 IM 后的用户详情卡

保留“邮箱名片 → 点击头部 → IM 详情卡”的两级结构;本次替换的是第二级详情,不是整个邮箱界面。

布局顺序

  1. 右上角更多入口。
  2. 居中圆形头像,下方居中显示用户姓名。
  3. 分隔线下依次为昵称、teleConnect+ ID、电话号码、邮箱、部门。字段名称左对齐,字段值右对齐。
  4. 独立备注行:左侧“备注”,右侧“添加备注”。
  5. 底部三列入口:消息、语音、视频;每列图标在上、文案在下。

当前原型详情卡宽 320px,采用 shadcn Neutral 浅色、统一字体和语义令牌;不复制参考图品牌、人物照片或颜色。原型没有头像资源时使用统一人物图标。性别标识不在当前数据模型与本次要求中,不自行添加。

字段来源与缺失处理

展示字段来源及规则缺失/过长处理
头像、姓名

匹配到的 IM 用户资料,非邮件显示名

头像缺失显示默认人物图标;姓名允许换行

昵称、电话号码

IM 用户可选资料,不用姓名代填昵称,不伪造电话

缺失显示“未提供”;过长单行截断

teleConnect+ ID

协同账号展示标识;原型暂显示模拟 IM ID

生产展示字段与内部主键的映射待确认

邮箱

匹配账号的完整邮箱,点击复制

可截断显示,但复制、可访问名称与完整提示保留原地址

部门

IM 资料的部门信息;原型为演示部门

过长单行截断并保留完整提示;生产缺失情况待确认

备注、更多、消息、语音、视频目前全部禁用。不自动创建聊天、不发起通话、不读写备注。当前详情卡不再保留旧版“往来邮件/查看日程”、企业字段或底部“写邮件”按钮;邮件相关操作仍在外层名片。

六、邮箱点击复制

七、数据与组件实现约束

当前原型已有接口

resolveIMContact(email: string): Promise<IMContact | null>

interface IMContact {
  id: string
  email: string
  name: string
  nickname?: string
  phoneNumber?: string
  jobTitleKey: "designer" | "prototypeRole"
  departmentKey: "productDepartment"
  organizationKey: "demoCompany"
}

这是静态原型的模型与 repository 接口,不是生产 HTTP 契约。jobTitleKey 等键仅服务演示文案,生产数据不应照抄这些固定枚举;也不能将 im-you 等演示 ID 当作实际 teleConnect+ ID。

生产实现需同时提供 IM 匹配结果与邮件联系人状态,不能让前端通过按钮文案猜测是否已添加。具体接口路径、联系人 ID、权限过滤、字段可见性及多邮箱下的联系人归属尚未锁定;应由开发与产品确认后定稿。

当前复用 MailContactTrigger、ContactIdentity、IMProfile、CopyEmail;联系人数据只通过 repository 与查询层进入视图,加载和异常使用统一 AsyncState。资料卡使用批准的 Popover、Avatar、Button 与 Dropdown Menu,不复制原始组件或引入另一套 UI。

界面标签、提示和可访问名称支持中文/英文;姓名与邮箱等用户原始资料保持原值。卡片的邮箱、电话和部门仅来自用户有权查看的资料,不把“已匹配”当作可以展示全部个人资料的授权。本原型不建设服务端或持久化。

八、验收用例

  1. 点击发件人的头像/名称/地址和收件人地址,打开的始终是该地址对应的名片,邮件选择与 URL 不因打开名片而变化。
  2. 查询中显示加载;查询异常显示错误并可重试,不能显示“未匹配”作为异常兜底。
  3. 未匹配 IM 时没有 IM 详情入口;未来接入联系人状态后,两种名片按第四节显示,不用 IM 匹配状态替代保存状态。
  4. 匹配 IM 时显示真实匹配身份;点击头部展开新版详情,资料字段顺序与第五节一致。
  5. 头像、昵称、电话缺失时按规定降级,不出现伪造资料或破图;长邮箱及部门不撑破卡片。
  6. 分别在邮箱名片和 IM 详情复制地址,得到完整邮箱并显示成功气泡;复制不触发资料展开,不关闭卡片。
  7. 剪贴板拒绝/不可用时明确提示失败,不出现成功提示。
  8. 快速切换联系人或邮件,不串用姓名、资料或旧请求结果;重新打开同一地址可复用有效缓存。
  9. 键盘可打开、复制、逐层关闭;关闭回到对应入口,复制后焦点保留;所有可操作目标至少 44px。
  10. 在 1280/1440/1920px 桌面视口检查弹卡边界、左右避让和长字段;满足浅色 AA 对比度及 reduced motion 规范。
  11. 中英文界面标签和复制反馈正确,邮件正文及原始联系人资料不被翻译或改写。
  12. 备注、更多、消息、语音、视频及外层未实现操作仍禁用;不发送真实邮件或建立通信、不持久化。
  13. 匹配或未匹配 IM 的联系人名片均不出现添加星标、移入免提醒、邮件特别提醒入口;此调整不移除邮件列表原有星标标记。

原型可用样本:林语 linyu@example.com 与原型用户 you@telemail.example 已匹配 IM;teleMail 团队 hello@telemail.example 与 Alex Morgan alex@example.com 未匹配。当前没有“未添加/已添加邮件联系人”两态样本,不得把这些未匹配样本直接判为已添加。

九、开发前待确认

以上事项未确认前,不自行推断或扩展。当前可以依照已确认部分开发资料展示与复制;联系人维护和真实通信另行评审。