feat: IMAP mail sync with thread-to-contact matching (PRD §6.1)

Real IMAP connection via imapflow library:
- Connects to IMAP server (IMAPFlow, TLS on port 993)
- Fetches recent messages (configurable limit, default 20)
- Extracts: from, fromEmail, subject, date, snippet (200 chars)
- Thread-to-contact matching (PRD §6.1):
  1. Match sender email against persons table
  2. If no person match, extract domain and match against company.website
  3. Returns matchedCompany + matchedPerson for each email
- Audit-logged (action: crm.mailsync:imap)
- Zod validated (host, port, user, password, folder, limit)
- 502 on IMAP connection failure with detail
- 400 on validation failure

Tested: invalid creds → 502 'IMAP connection failed', missing host → 400
This commit is contained in:
Z User committed 2026-10-27 22:50:50 +00:00
1 parent 7acc0c5451
commit e45b68bb8b
1089 files changed
+260614

No files matched your search

+277
View File
@@ -0,0 +1,277 @@
# 排版方向 Text Direction:横排 / 直排 / 混排
中文是世界上少数能**横竖两套排版系统并行**的文字。"用什么方向"是任何中文排版项目的第一个决策,而不是默认横排。本文给出方向决策树、参数对照、CSS 实现、地区风格差异。
## 一、方向决策树
```
内容主要属性是什么?
│
├─ 古籍 / 文言 / 诗词 / 书法集 / 题词 / 对联 ────────────→ 直排
├─ 邀请函 / 请柬 / 礼仪文书 / 书信复古 ──────────────→ 直排
├─ 博物馆图录 / 艺术画册中"诗题画跋"页 ────────────→ 直排
├─ 杂志 / 报纸 / 教材 / 学术论文 / 商务文档 ───────→ 横排
├─ 现代小说 / 散文 / 网页 / H5 / App ───────────────→ 横排
└─ 工具书 / 字典 / 辞海 ───────────────────────→ 横排(直排版多见于民国老版本)
需不需要混排?
│
├─ 直排中遇 1 字英文/缩略词 ────→ 正立排(保持横向单字)
├─ 直排中遇 2-3 位阿拉伯数字 ───→ 纵中横排 tate-chu-yoko(保持横向小组)
├─ 直排中遇整段西文/词组 ───────→ 顺时针 90° 旋转
├─ 直排中遇竖排小注 ──────────→ 双行夹注(注文两行平行,字号 1/2)
├─ 横排中遇直排标题/匾额 ──────→ 局部 writing-mode: vertical-rl
└─ 横排中遇直排小段诗词引文 ───→ 局部直排("插秧式")
```
## 二、横排 vs 直排参数对照
| 维度 | 横排 | 直排 |
|---|---|---|
| 文字方向 | 左 → 右 | 上 → 下 |
| 行方向 | 上 → 下 | **右 → 左** |
| 翻页方向 | 从左向右翻(**左侧装订**) | 从右向左翻(**右侧装订**) |
| 正面页位置 | 右页(奇数页) | 左页(奇数页) |
| 分栏方向 | 垂直切分(左中右栏) | 水平切分(上中下栏) |
| 图/表标题位置 | 上方 / 下方 | 左侧 / 右侧 |
| 表头行位置 | 上方 | 右侧 |
| 表头列位置 | 左侧 | 上方 |
| 末页多栏行数 | 各栏尽量对齐,余空在末栏末尾 | 顺其结束,各栏行数可不齐 |
| 行长上限 | ≤ 48 字 | ≤ 55 字 |
| 行长下限 | ≥ 10 字 | ≥ 10 字 |
| CSS writing-mode | `horizontal-tb`(默认) | `vertical-rl` |
## 三、标点在横/直排中的差异(大陆 GB/T 15834-2011)
**关键差异点。错配会让版面瞬间显业余。**
| 标点 | 横排(大陆) | 直排(大陆) | 港台 |
|---|---|---|---|
| 句号 。 | 字面左下角 | 字面右上角 | 字面正中 |
| 逗号 , | 字面左下角 | 字面右上角 | 字面正中 |
| 顿号 、 | 字面左下角 | 字面右上角 | 字面正中 |
| 冒号 : | 字面左下角,直立 | **直立偏右**(不转 90°) | 居中直立 |
| 分号 ; | 字面左下角,直立 | **直立偏右**(不转 90°) | 居中直立 |
| 问号 ? | 字面左下角,直立 | **直立**(不转 90°) | 居中直立 |
| 叹号 ! | 字面左下角,直立 | **直立**(不转 90°) | 居中直立 |
| 引号(双) | 弯引号 " " | **直角引号 「」**(双) | 直角引号 |
| 引号(单) | 弯引号 ' ' | 直角引号 『』 | 直角引号 |
| 书名号 | 《》〈〉 | 《》(直立) | 甲式波浪 ﹏(台湾)/ 乙式《》 |
| 破折号 | —— 占 2 字水平居中 | **占 2 字垂直居中** | 同 |
| 省略号 | …… 占 2 字,6 点水平居中 | 占 2 字,6 点**垂直居中** | 同 |
**反例(要避免)**:
- 把日文规则套用到中文直排:冒号、分号、问号、叹号在日文直排转 90° 躺倒;**中文必须保持直立**。某代 macOS 因 Unicode UAX#50 早期不完善曾把中文比照日文,是错误案例。
- 直排正文用弯引号 " "(应改用直角「」)。
## 四、直排中混排西文的 3 种方法(W3C CLReq §2.1.3)
直排文本中遇到西文/数字时,根据长度选用:
### 方法 1:正立排(Upright)
- 用于:**单个字母、首字母缩略词**(如 GDP、CPU、A)
- 做法:用与汉字等宽的字体或全角字符,与汉字同方向逐字排
- CSS:`text-orientation: upright`
- 示例:`一个 G D P 增速…` (G、D、P 各占一格,与汉字同方向)
### 方法 2:顺时针 90° 旋转(Rotated)
- 用于:**一般单词 / 句子 / 4 位以上数字**(如 "JavaScript"、"2024"、"the quick brown fox")
- 做法:用比例字体,整词整句旋转
- 汉字与西文之间间距 **≤ 1/4 汉字宽**;西文位于行首/行尾时**不加空白**
- CSS:`text-orientation: sideways`(即默认行为)
### 方法 3:纵中横排(Tate-chu-yoko 縦中横)
- 用于:**2–3 位阿拉伯数字、短缩写**(如 "3.0"、"A+"、"2B"、"21"、"AM"、"99")
- 做法:比例字体,保持正方向横置;宽度与行幅相当或稍出
- 活字时代严格不超过 1 个汉字宽;现今可凸出行间
- CSS:`text-combine-upright: all`
- 示例:年龄 `21` 岁、`3.0` 升发动机、温度 `25` ℃
### 混排间距规则(直排同横排)
- 直排中**通常不用弯引号**(应改用直角引号)
- 若引用西文且用弯引号,需跟随被引文旋转
- 直排中阿拉伯数字内部不可分行,破折号/省略号不可分行
## 五、横排中嵌入直排
现代横排文档中嵌入小段直排的场景:
- 标题 / 匾额 / 题字
- 古诗引文(一首七绝直排展示,强化古意)
- 对联(两幅竖排平行展示)
- 印章、闲章、款识
- 杂志专题"穿插式"页面
**CSS 实现**:
```css
.vertical-quote {
writing-mode: vertical-rl; /* 直排:从右向左 */
text-orientation: mixed; /* 汉字直立,西文转横 */
height: 20em;
margin: 0 1em;
}
```
**注意事项**:
- 直排段在横排里要"做容器"——给定明确高度,不要让它自由撑开
- 直排标点要切换到右上角形态;不要直接搬横排标点
- 嵌入位置遵守"文意停顿"——句间嵌入而非词间
## 六、装订与翻页方向
装订方向直接影响版心位置和阅读体验,不能搞反。
| 方向 | 装订侧 | 翻页方向 | 第一页(正面)位置 | 用途 |
|---|---|---|---|---|
| **横排左翻** | 左侧 | 从左向右 | **右页**(奇数页) | 现代中文书、教材、报告、所有英文书 |
| **直排右翻** | 右侧 | 从右向左 | **左页**(奇数页) | 古籍、文言、诗集、传统书法集 |
| **直排左翻(错的)** | 左侧 | 从左向右 | — | 中日韩三国都不用 |
**关键检查项**:
- 大标题必须出现在**正面页**(横排右页 / 直排左页),不能开在反面页
- 章节末页留出余白时,留白方向匹配阅读方向(横排留下方、直排留下方)
- 跨页大图:横排左页向右延展、直排右页向左延展
## 七、CSS writing-mode 完整指南
```css
/* 横排(默认) */
.horizontal {
writing-mode: horizontal-tb; /* horizontal, top-to-bottom */
}
/* 直排(中文、日文、传统蒙文) */
.vertical {
writing-mode: vertical-rl; /* vertical, right-to-left lines */
text-orientation: mixed; /* 汉字立、半角西文转 90° */
}
/* 直排但行从左向右(少见,部分新蒙文) */
.vertical-lr {
writing-mode: vertical-lr;
}
/* 直排内单字符强制立起来(缩略词、单字母) */
.upright {
text-orientation: upright;
}
/* 纵中横排(数字小组保持横置) */
.tcy {
text-combine-upright: all;
}
```
完整 HTML 示例:
```html
<article style="writing-mode: vertical-rl; height: 30em;">
<p>
秦时明月汉时关,万里长征人未还。
但使<span style="text-combine-upright: all;">21</span>世纪有李广,
不教胡马度阴山。
</p>
</article>
```
## 八、地区风格三大体系
地区差异的索引表——一个项目锁定一个地区,按下面维度逐项对齐。具体执行细节看对应文件:标点详见 `punctuation.md`、字体详见 `fonts.md`、避头尾详见 `punctuation.md § 四`。
| 维度 | 大陆简体 | 港台繁体 | 日文 |
|---|---|---|---|
| 标点位置 | **横排左下、直排右上** | **居中**(横直排都一样) | 横排左下、直排右上(同大陆) |
| 避头尾严格度 | GB 级 / strict 级 | 多不严格(标点居中无突兀) | 严格 |
| 标点风格 | 开明式(句末全宽、句内半宽)多 | 居中式 + 多不调宽度 | 开明式 + 严格挤压 |
| 直排冒号分号 | 直立偏右 | 居中直立 | **转 90° 躺倒** |
| 引号 | 弯引号 ""''(横)/ 直角「」(直) | 直角「」『』(先单后双) | 直角「」 |
| 书名号 | 《》〈〉 | 甲式波浪 ﹏(书底)+ 乙式《》 | 二重括号 『』 |
| 间隔号 · | 占**半字宽** | 占**全字宽** | 占全字宽 |
| 公文字体 | **仿宋** | **楷体** | 明朝体 |
**核心心法**:项目开始就锁定地区风格,不要"中港台日"混用。
## 九、什么时候直排?什么时候横排?
### 必须直排
- 古籍影印 / 古籍今译保留原貌
- 文言文学校教材(部分台湾教材)
- 中医典籍、佛经、道经
- 书法作品集、字帖
- 传统戏曲剧本(旧版)
- 朱批奏折、家书复刻
### 强烈推荐直排
- 当代古典诗词集
- 茶艺 / 香道 / 国画相关书籍
- 高端艺术画册"诗题画跋"页
- 邀请函 / 请柬 / 谢卡(小段)
- 博物馆图录的部分内页(混合)
- 题字 / 题词 / 闲章
### 可以选直排(增加古意 / 仪式感)
- 散文集封面
- 招贴海报标题
- 茶包装、白酒包装文案
- 婚礼喜帖
- 复古风咖啡店菜单
### 不要直排
- 现代长文(用户已习惯横向扫视)
- 表格密集的文档(直排表格难做)
- 大量中英混排的技术 / 学术内容
- 网页正文(写读不便、生态差)
- App / H5(小屏直排压力大)
## 十、混排(横直交叉)的进阶玩法
不要把"混排"理解为"破格"——这是中文排版的基础语法。常见 5 种:
### 1. 横排正文 + 直排引文
正文横排,引用的古诗、对联、题词单段直排,与正文形成节奏对比。
```html
<article class="horizontal-body">
<p>李白《静夜思》写道:</p>
<blockquote class="vertical-quote">
床前明月光,疑是地上霜。<br>
举头望明月,低头思故乡。
</blockquote>
<p>这首诗体现了…</p>
</article>
```
### 2. 直排正文 + 横排数据
古籍今译类,正文直排,但年表、数据表、地图说明等横排。靠纸张/底色区分。
### 3. 跨页"半横半直"
左页直排(古文原文)、右页横排(今译),翻页对照。常见于古籍今译。
### 4. 标题直排、正文横排
封面 / 章首页用直排大字标题,营造仪式感;内页正文回到横排实用。
### 5. 双行夹注(小注)
直排正文中插入双行夹注:两行小注同高,字号为正文 1/2,平行排列。古籍标配。
```
正┃ 双行夹注:
文┃ 上行注┃下行注
正┃ 上行注┃下行注
文┃
```
## 十一、检查清单(方向相关)
排印完成前必过:
- [ ] 排版方向(横 / 直 / 混)是否与内容气质匹配?
- [ ] 装订方向是否与排版方向对应?(横左翻 / 直右翻)
- [ ] 大标题是否在正面页(横右页 / 直左页)?
- [ ] 直排中数字是否用了纵中横排?
- [ ] 直排中单字英文是否用了正立排?
- [ ] 直排标点是否切换到右上角形态?
- [ ] 直排冒号分号是否保持直立(没躺成日式)?
- [ ] 直排引号是否改用了直角「」?
- [ ] 地区风格是否一致?(没把港台居中标点 + 大陆 GB 避头尾混用)
- [ ] 横排嵌直排的段落是否给了明确高度?
- [ ] 图表标题方向是否匹配主排版方向?
- [ ] CSS `writing-mode` 和 `text-orientation` 是否成对设置?