
简介这份文档面向需要自行搭建邮件服务的技术人员与运维初学者围绕 hMailServer 的部署与配置展开帮助读者理解从协议原理到客户端接入的完整流程。包内共 1 个 doc 文件压缩包约 263KB篇幅精简但内容集中涵盖下载与版本选择、SMTP 收发原理说明、添加域与用户的方法、协议选择、SMTP 参数调整、Routes 路由配置、认证方式设置以及 Log 日志配置等环节并补充服务器自动注册为服务后的管理要点与客户端配置注意事项例如账号须按 xxxserver.com 格式书写、关闭服务器认证等易错细节。资源还给出相关下载地址与 SMTP 原理参考链接便于延伸查阅。目前已有 2642 人学习浏览适合作为邮件服务器入门配置的速查笔记与排错参考也可供搭建测试环境时对照核对关键参数。1. 一份 2008 年的配置记录hMailServer 4.4.1 今天还能不能照着抄翻出一份老手记标题就叫 hmailserver 的完整配置记的版本是 hMailServer-4.4.1-B273.exe。第一反应是这东西还能不能跑——现在的邮件生态对发信方比当年严得多反向解析、SPF、TLS 一样不能少。可照着它的顺序走一遍会发现骨架其实很干净域、账号、协议、SMTP、Routes、认证、日志七步一条线没有一句多余的废话。它适合两类人要在隔离内网里搭自建邮件服务、给应用发通知或者做收发测试的以及想搞明白一封邮件到底卡在 SMTP 链路哪一跳的。对外营业级的公网收发不在射程内这点先说清楚。2. 装之前的三笔前置账版本线、端口占用与域名解析很多人拿到这种配置记录第一步就是双击 exe然后卡在装完了但连不上。邮件服务器这个品类安装只占工作量的三成剩下七成在装之前就该算清楚跑哪个版本、占哪些端口、域名往哪儿解析。这三笔账里任何一笔算错后面所有配置都会表现出看起来对、就是不工作的玄学症状而邮件系统恰好是个几乎不给错误提示的黑匣子——信发出去了日志也写了对方就是没收到。2.1 4.4.x 这条版本线与它的管理客户端hMailServer 的分发形态是单文件 exe4.4.1-B273 属于 4.x 末期的小版本安装过程中会问数据库怎么选内置的精简数据库还是外接一台 MSSQL。除非你手上已经有现成的数据库实例要复用否则直接选内置的那套省掉一堆连接串和权限问题装完就能用账号、域、日志都落在安装目录里备份就是拷文件夹。安装完成后有两个东西要分清。一个是 Windows 服务名字就叫 hMailServer向导默认会把它注册成自启动服务这意味着管理程序关掉、远程桌面断开、机器重启收信发信都不受影响——这是那份记录里可以放心退出管理程序这句话的真实含义不是让你不管它。另一个是管理客户端 hMailServer Administrator它只是个前端通过本地连接去操作服务本身不承载任何邮件逻辑。所以出现管理界面打不开但邮件还在正常收发的时候不用慌先看服务是不是活着。首次打开管理程序会让你设一个管理员密码这个密码和邮箱账号密码完全是两套东西别混。我一般会把它记在和服务器资产台账一起的地方因为 hMailServer 没有忘记密码的找回流程丢了只能进数据库改或者重装。至于系统兼容性4.x 是那个年代的产物如果只是想把这份配置流程复现一遍、验证投递链路扔进虚拟机跑一个同时期的系统最省事也避免和现网环境里的其他服务抢端口。这不是必须但能省掉很多装到一半报错、报错信息还看不懂的时间。2.2 端口清单哪几个必须通哪几个只是本机自嗨邮件服务最容易被忽略的一点它对端口的要求是双向的。你自己监听 25 不代表别人能连上你的 25中间还有防火墙、安全组、运营商策略三道关。先把默认端口列清楚后面配协议时对着这张表勾。用途默认端口加密端口关键说明服务器之间投递信件25465必须允许外部主动连入否则收不到任何外域来信客户端提交待发信件25 / 587465587 更规范很多网络封了出站 25POP3 收信110995单机下载式收信多端不同步IMAP 收信143993多端同步客户端体验更好但占资源表里最要命的是 25。国内多数住宅宽带和部分云主机默认封禁出站 25表现是本地投递正常、发给外域全部超时重试。遇到这种情况不用怀疑配置先确认链路换一个能通 25 的环境测或者在 SMTP 里配中继后面 4.1 会讲把出站交给上游。DNS 那边要准备的记录不多但一条都不能少A 记录把 mail.yourdomain.com 指到服务器的公网地址这台机器必须有固定的、能反向解析的地址MX 记录把 yourdomain.com 的收信指向 mail.yourdomain.com优先级填 10 就行单机没有备选TXT 记录写一条 SPF最小可用形态是vspf1 mx -all意思是只有 MX 指向的那台机器有权用这个域发信反向解析 PTR这条不归你管得找地址的归属方加但是没有它很多接收方会直接把你的信判成可疑。提示域名、IP、SPF 三样东西是绑在一起生效的。改任何一样都要留出解析生效时间别改完立刻测然后判定配置失败。2.3 安装向导里那两个默认勾选别一路下一步向导里有两个地方值得停一下。第一个是数据库选择前面说了单机自用选内置。第二个是端口绑定方式默认是监听所有网络接口对应写法就是只写端口号比如 25等价于 0.0.0.0:25。如果这台机器有多张网卡、或者你只想让它在内网那张卡上提供服务就写成192.0.2.10:25这种地址:端口的形式把监听范围收窄。收窄监听范围不只是洁癖。一台同时连着内网和公网的机器如果 SMTP 在两张卡上都监听而内网那张卡的网段又在 IP 范围里被划成了受信任等于给外部留了一条绕过认证的路。后面讲 IP Ranges 的时候会再提一次这里先把绑定的口子扎紧。装完立刻做一次端口自检别等配完域和账号才发现端口没通# 在服务器本机看监听状态确认 25/110/143 都在 LISTENING netstat -ano | findstr :25 :110 :143 # 从另一台机器测连通性能拿到 220 开头的欢迎语就算通 telnet mail.yourdomain.com 25第一条命令的-ano表示显示所有连接、用数字形式显示地址和端口、附带进程号看到 0.0.0.0:25 说明监听范围是全接口。第二条命令连上以后hMailServer 会回一行类似220 mail.yourdomain.com ESMTP的欢迎语这行里的主机名就是后面要在 SMTP 设置里对齐的 Host name两边不一致会给自己埋坑。如果 telnet 直接卡住然后超时先查 Windows 防火墙的入站规则再看云主机的安全组最后才怀疑服务本身。3. 域、账号与协议把一台邮件服务器立起来的最小闭环到这一步机器有了、端口通了、DNS 也在生效路上接下来要建立的是三个层次的东西域这台机器替谁收发、账号这个域下有哪些人、协议用哪些方式对外提供服务。顺序不能乱先有域才能建账号账号建完才有东西可谈协议。那份记录里写得很简略——添加域和用户针对域只需配置 IP 地址就可以了这句话省略了大量前提照着字面理解很容易翻车。3.1 添加域那个 IP 地址字段到底填不填Domains 节点右键添加会看到两个输入框域名和 IP 地址。域名没什么好说的写你要托管的那个比如 yourdomain.com不要带 www、不要带 、不要写成 mail.yourdomain.com这是 MX 记录指向的主机名不是域本身。IP 地址这一栏是新手最容易填错的地方。它的含义是这个域只在这个本地地址上应答用途是多 IP 场景下做区分——一台机器绑了三个公网地址三个域分别从不同地址出去。绝大多数单机部署根本没有这个需求留空即可留空表示不限制。那份记录写只需配置 IP 地址就可以了在它的语境里大概是指多域共存时用地址区分但这句话被单独摘出来看会让人误以为这栏是必填。真填了一个和本机网卡对不上的地址症状是收信全部超时、日志里连一条 SMTPD 记录都没有——因为服务根本没在那个地址上应答。这种配置项填了但没有任何报错的坑排查起来最费时间。同一个域下面还有几个属性值得顺手设掉最大邮箱大小、单封信最大尺寸、默认账号配额。前两个是域的兜底值账号级别可以单独覆盖但不能超过域的限制。别嫌麻烦不设的话默认值可能大得离谱一台小机器被塞满只是时间问题。3.2 账号为什么必须写成完整的邮箱地址Accounts 节点下添加账号最关键的字段是 Address。hMailServer 这里有个和其他 MTA 不太一样的地方它要求你填完整地址也就是zhangsanyourdomain.com而不是只填zhangsan。填短了不会立刻报错但客户端用完整地址去认证时会匹配不上表现为反复弹密码框、日志里出现认证失败。这不是设计缺陷是它的账号模型决定的——hMailServer 的账号是全局唯一的完整地址同一个域下的账号和别的域下的账号放在同一张表里用短名没法定位。理解了这点后面客户端配置里账号写法需要 xxxserver.com那句就不是玄学了是硬性要求。建账号时顺手要设的还有三样密码、邮箱大小上限单位 MB超过就拒收不是自动清理、以及是否需要自动回复。密码别用弱口令尤其当这台机器后面要暴露在公网上的时候一个被猜中的账号就是一台发垃圾信的中转机。建完先在管理程序里发一封内部测试信收件人写自己这一步只验证账号存在和本地投递通路不涉及任何外部依赖Domains → yourdomain.com → Accounts → 新建 Address: testyourdomain.com Password: 设置一个强口令 Max size: 200MB四行填完点保存账号立刻可用不需要重启服务。如果保存时报地址已存在多半是你之前建过一个同名但大小写不同的hMailServer 对地址是大小写不敏感的。3.3 三个协议的开关、端口与并发限制Settings → Protocols 下面并列着 SMTP、POP3、IMAP 三块每块的结构类似一个启用勾选、一个 TCP/IP ports 列表、一组连接数和尺寸限制。SMTP 是必须开的没有它什么都干不了。端口列表默认是 25想同时跑提交端口就再添一行 587。这里的写法是每行一个格式为地址:端口或只写端口和前面安装时说的是同一套规则。POP3 和 IMAP 按需要开。只做应用通知、只发不收的场景两个都可以不开要给用户提供正常邮箱体验至少开 IMAP因为 POP3 把信下载到本地后服务器上的副本处理策略很别扭多设备场景下容易丢信或者重复收。开了之后端口分别是 110 和 143加密端口 995 和 993 需要在服务端配好证书才会生效。连接数限制这一项容易被忽略。默认值放在内网几十个人的规模够用但如果是应用批量发信瞬时并发很容易顶到上限症状是客户端报连接被拒绝而日志里写着连接数超限。调这个值之前先看机器内存一个 IMAP 连接的开销不算小盲目拉到几百只会让整台机器变慢。3.4 客户端填写模板以及关闭服务器认证的适用边界客户端配置是那份记录的最后一步也是被简化得最厉害的一步。它给了两个要点账号写成完整邮箱、关闭服务器认证。第一条是硬规则第二条有明确前提脱离前提照抄会出事。先把标准模板摆出来按这个填基本不会错客户端字段填写内容备注收件服务器mail.yourdomain.com与 A 记录、MX 一致收件协议/端口IMAP 143 或 POP3 110有证书再用 993/995发件服务器mail.yourdomain.com同上发件端口25 或 58725 被封时用 587用户名testyourdomain.com必须完整不能只写 test密码账号密码不是管理员密码发件服务器需要认证内网受信任段可关公网必须开见下方说明关闭服务器认证这条成立的前提是服务器侧已经把客户的来源地址划进了受信任的 IP 范围通常是本机或内网段服务端对这个范围不要求认证。在这个前提下客户端勾不勾认证都能发信。但如果这台服务器要对外提供服务客户端的来源地址落在 Internet 范围里服务端就会要求认证此时客户端还关着认证结果就是能收不能发或者发出去被拒。更麻烦的是另一种情况服务端把 Internet 范围也设成了不需要认证客户端也关着认证两边一拍即合——这台机器就成了一台谁都能借道发信的中转。这种配置在隔离内网里跑测试没问题接公网就是给自己找麻烦。所以我一般会强制要求只要这台机器的 25 端口对外可达客户端就必须勾上我的发件服务器需要身份验证没有例外。4. SMTP 与 Routes 的组合让邮件既能发出去也能收进来域和账号建完机器只能自己跟自己玩。要让信真正走出去、外面的信真正走进来靠的是 SMTP 面板和 Routes 这两块配合。前者决定我怎么把信交出去后者决定某些特定的收件域我不按常规走。这两块配错的概率最高因为它们的选项名字都很温和看不出哪个会引发事故。4.1 SMTP 面板里必改的四个参数Settings → Protocols → SMTP 下面子项很多先盯这四个。第一是 Host name也叫 HELO 名。它是服务器在 SMTP 对话里自报家门的名字必须是一个能被 DNS 正向解析、且和你出口 IP 对得上的完整域名通常就是 mail.yourdomain.com。填成机器名、localhost、或者干脆留空对端在反查时对不上轻则进垃圾箱重则直接 550 拒收。这一项是公网发信被拒的头号原因比 SPF 还常见。第二是中继SMTP Relayer。当你的出站 25 被封、或者出口 IP 没有干净信誉时把所有出站信交给一个上游服商转发是标准解法。填对方的地址、端口、以及认证用的用户名密码。开了中继以后服务器不再直接连对端的 25所有投递都走这一条路日志里能看到连接目标变了。注意中继和 Routes 是两回事前者管全部出站后者管特定域别混用。第三是重试策略。默认的投递重试次数和间隔在内网够用公网环境下建议把重试拉长一些因为对端临时故障4xx 响应很常见急着判死会让用户以为信丢了。重试到期还没成功服务器会生成一封退信回到发件人那封退信里的诊断码才是真正有用的信息。第四是尺寸与收件人限制。单封信最大尺寸、单封信最大收件人数这两个值不设一个用户往通讯录里全选发一封带附件的信就能把队列堵住。按实际业务定通知类业务通常几 MB、几十个收件人就够。4.2 Routes什么情况下必须配怎么配才不绕回自己Routes 在 Settings → Protocols → SMTP → Routes 下面不同小版本的入口文字略有差异找带 Route 字样的那项。它的作用是当收件域满足某个匹配条件时不要按 MX 去解析直接把信交给指定的主机和端口。什么时候需要它三种典型场景。内网 DNS 解析不到对端的 MX直接投递必然失败某些域名的信必须统一走上游中继不能自己直连服务器迁移期间临时把某个域的收信改道到新机器。配置项的填法配置项含义典型填法Domain匹配哪个收件域partner.internal 或 yourdomain.comTarget SMTP Host交给谁192.0.2.20 或 relay.upstream.comTCP/IP Port对方监听端口25几乎不改匹配范围全部地址还是域内地址单域转发选该域所有地址失败处理目标不可达时怎么办选按正常 MX 重试别选直接退信最后一行的失败处理是个隐藏雷区。如果目标主机挂了而你选的是直接退信所有走这条路由的信会瞬间全部退回用户端看到的就是突然之间所有信都发不出去。选正常重试至少给了你修复的时间窗口。更隐蔽的一个坑是把 Target Host 填成了本机地址加 25 端口。看起来是我先收下来再处理实际效果是形成一个环路服务器收到信按路由交给自己的 25自己又收到一遍再交给自己。日志里同一封信的 ID 反复出现、队列只增不减几分钟就能把磁盘写满。这种邮件风暴一旦起来停服务是唯一止血手段改完配置再启。4.3 认证与那条allow plain text authentication的红线认证这块在 Settings → Advanced → IP Ranges 里默认预置了两个范围My computer本机和 Internet其余全部。每个范围是一组策略的集合控制四件事允许从哪些方向投递、是否需要认证、是否允许明文认证、是否允许中继到外部。四个投递方向要分开看它们的风险等级完全不同方向含义建议Local to local本域账号发给本域账号可不要求认证方便内部应用发通知Local to external本域账号发往外域必须要求认证否则等于开放中转External to local外域发给本域账号不要求认证否则收不到任何外部来信External to external外域经你转发到另一个外域一律禁止这是垃圾邮件最爱的口子这张表里最容易设反的是第三行。有人为了安全把 External to local 也设成需要认证结果所有外域来信全部被拒症状是内部互发完全正常、外部一封信都进不来而且日志里能看到明确的拒绝记录反而好查。现在说那份记录里点名的那条配置 trac 的时候allow plain text authentication不能勾选否则报错。这条结论是对的但它没写原因照抄的人一旦遇到别的现象就会懵。我的理解是这样的这个勾选控制服务器是否接受以明文方式提交用户名密码勾上之后服务器在握手时会向客户端通告支持明文认证机制。trac 的通知是通过脚本调用 SMTP 发信的它用的库在协商认证机制时比较挑如果服务器通告的机制集合和它的预期不一致就会在认证阶段失败表现出来就是通知发不出去、应用日志里一串认证异常而邮件服务器这边只留下一条语焉不详的会话记录。所以这条红线的正确表述不是永远别勾而是当你的发信方是脚本类应用、且它不需要明文认证时把这一项关掉。反过来如果某个老客户端只支持明文认证、你又必须让它发信那就得勾上但要同时保证这条通路是加密的或者仅限内网别让密码在公网上裸奔。注意改 IP Ranges 是即时生效的不需要重启服务。改完立刻用外部地址发一封信验证别等到第二天用户投诉才发现方向设反了。4.4 日志出问题时先看哪几个文件Settings → Logging 里一排勾选框Application、SMTP、POP3、IMAP、TCP/IP、Debug、AWStats。全勾上会让日志量爆炸一天几个 G 很常见而且真正要找的那几行会被淹没。我的习惯是常开 Application SMTP排查期临时加 TCP/IPDebug 只在确认是协议层问题时短时间打开问题定位完立刻关掉。POP3 和 IMAP 的日志只在怀疑客户端同步异常时才开。日志文件落在安装目录的 Logs 下按日期命名格式大致是 hmailserver_YYYY-MM-DD.log。找一封具体的信最快的方式是拿收件人地址去搜顺着会话 ID 往下看能看到这封信从接收、排队、投递到对端的完整过程以及对方返回的三位数字状态码。三位码的第一位是分类2 开头成功4 开头临时失败会重试5 开头永久失败会退信。看第一位就能判断这封信还有没有救。5. 五条踩坑记录现象、原因和最后怎么解决的配置这种事情顺利的时候二十分钟搞定不顺利的时候两天都卡在一个勾选框上。下面这五条是我在实际环境里反复遇到的按看到什么现象、根子在哪、怎么改的顺序写遇到类似情况可以直接对号入座。5.1 日志显示投递成功对方就是说没收到现象SMTP 日志里这封信的状态是已完成对端也返回了 250但收件人翻遍收件箱、垃圾箱都找不到。原因基本不在你这边。250 只代表对端服务器接受了这封信接下来的过滤、归档、垃圾判定都是它内部的事。最常见的三种情况你的 HELO 名和出口 IP 对不上被反查判可疑域没有 SPF 或者 SPF 写错被硬拒或软拒内容命中了对方的规则。解决顺序是先把自身三项对齐Host name 必须是能正向解析的域名PTR 必须指回同一个域名SPF 必须覆盖实际发信 IP。三项对齐后仍然不收就让对方管理员去日志里按时间点查他们那边一定能看到拒收理由比你在自己这边猜快得多。5.2 内部互发正常发给外域全部卡在队列里现象队列里堆着一堆信状态是正在重试日志里连接对端 25 端口超时。原因出站 25 被封这是最常见的。或者本机防火墙只放行了入站没放行出站。判断方法很直接在服务器上换个端口连一下对端连不上就是链路问题跟配置无关。解决把 SMTP Relayer 配上所有出站交给上游转发端口用对方给的通常 587 或 465认证信息填对。配完队列里的信会自动按新路径重投不用手动重发。这条也是内网部署最实用的一个技巧——与其跟运营商扯皮不如老老实实走中继。5.3 客户端能收不能发反复弹密码框现象收信一切正常发信时客户端提示认证失败密码明明是对的。原因有三层按概率排账号写成了短名而不是完整邮箱这是最常见的客户端没勾发件服务器需要身份验证服务端要求认证而客户端没提交或者服务端 IP 范围把该来源划进了不需要认证的范围客户端提交的认证信息被忽略后又被别的策略拒了。解决先把账号改成完整地址重试不行就检查客户端的发件认证勾选再不行去 IP Ranges 看这个来源地址落在哪个范围、那个范围的四个投递方向是怎么设的。三步之内基本能定位。5.4 脚本发通知全部失败邮件服务器日志几乎没记录现象应用侧报 SMTP 认证异常但邮件服务器日志里只有零星几条会话看不出所以然。原因多半就是 4.3 里说的那条明文认证。脚本类客户端在协商认证机制时如果服务器通告的机制集合不匹配会在认证阶段直接失败而失败发生在协议早期应用层的日志往往只有一句笼统的异常。解决临时把 TCP/IP 和 Debug 日志打开重放一次发信看会话里服务器通告了哪些机制、客户端选了哪个、在哪一步断的。定位到是明文认证的问题后把该 IP 范围的允许明文认证关掉或者反过来给脚本换一个支持现代认证方式的发信库。改完记得把 Debug 关掉。5.5 磁盘一夜之间被写满队列里全是同一封信现象早上发现服务器磁盘告警队列里有几万封内容相同的信日志里同一个会话 ID 反复出现。原因Routes 把目标指向了本机地址加 25 端口形成投递环路或者两个域互相把对方设为路由目标A 转给 B、B 转回 A。解决第一步先停服务止血这一步不能犹豫环路每秒都在放大。然后去 Routes 里逐条检查 Target Host凡是等于本机地址或者指向另一个会转回来的域的全部删掉或者改正。改完启服务清空队列里那些重复的信再补一条监控队列长度超过阈值就告警。这个坑我吃过一次从那以后凡是配 Routes我都会先把 Target Host 抄在纸上确认一遍再往框里填。6. 三段式验收把配置从看起来对变成确实通配置全部填完、服务也重启了这时候最容易犯的错是发一封试试收到就算完。自建邮件系统的坑大多藏在边界上——本域互发永远正常一旦跨域就原形毕露。所以验收要走三段从协议层到应用层逐级确认。第一段是协议层手工跟服务器对话确认它该说的都说了# 连上 25 端口看欢迎语里的主机名是否与 Host name 一致 telnet mail.yourdomain.com 25 # 依次输入每行一条看返回码 EHLO test.local # 看服务端通告的能力列表里有没有 AUTH MAIL FROM:testyourdomain.com # 应为 250 RCPT TO:someoneexample.net # 应为 250 或 551不能是 550 拒绝 QUITEHLO的返回里如果出现了 AUTH 关键字说明认证通路是通的如果RCPT TO直接返回 550说明这个域的策略不允许往外投回去看 IP Ranges 的 Local to external 那一行。这一段的价值在于把配置问题和网络问题彻底分开很多人卡一天就是因为没做这一步。第二段看日志走一遍完整的收发然后在 Logs 目录里找到对应的会话确认三件事信被接收时有记录、投递到对端时对端返回了 2xx、没有异常重试。日志里每个会话都带唯一标识顺着它能把一封信的一生看完。第三段才是真实收发。用两个不同域名的邮箱互发一封带中文主题和附件的信确认主题不乱码、附件能打开、时间戳正常。中文乱码这一项单靠本地测试永远测不出来因为它跟客户端编码、服务器转码策略都有关。最后留一个习惯每次改完配置把改动项、改动时间、验证结果记一行到同一个文档里。邮件系统的故障往往不是当场爆发的而是三天后有人反映某类信收不到了这时候那份记录就是唯一的后悔药。希望帮到你。本文还有配套的精品资源点击获取