实现原理

Autodiscover 目前存在于 Exchange Server 和 Exchange Online 中, 由于 Microsoft 逐渐推广禁止使用基本身份验证, 所以这部分功能可能未来只会在 Exchange Server 中见到了, 目前 Exchange Online 主要从 Active Directory 用户目录中获取配置, 之后才会尝试使用传统的 Autodiscover 去发现配置.

提示

Microsoft 为 Exchange Server 2010 后的服务端和客户端自动发现 API 请求使用 SOAP, 而本文介绍的主要是经典轻量且广泛被其他邮件客户端和服务端使用的 POX 版本自动发现 API.

请求端点的结构由客户端解析用户的邮箱地址后组装而成:

  1. https:// + <用户邮箱地址域名> + /autodiscover + /autodiscover.xml
  2. https:// + autodiscover. + <用户邮箱地址域名> + /autodiscover + /autodiscover.xml
提示

默认使用的是 POST 请求, 并且通常要求进行 HTTP 身份验证, 比如 basic auth.

  • 从 Exchange ActiveSync 中请求配置:
    1. 尝试从 URL 中请求配置: https://example.com/autodiscover/autodiscover.xml
    2. 尝试从 URL 中请求配置: https://autodiscover.example.com/autodiscover/autodiscover.xml
    3. 尝试从主机名 Autodiscover DNS 中寻找重定向 URL: autodiscover.example.com >> CNAME >> autodiscover.exchangeserver.com >> HTTP 301/302 >> autodiscover.mailhoster.com
      1. 尝试从重定向 URL 中请求配置: https://autodiscover.mailhoster.com/autodiscover/autodiscover.xml
        1. 尝试从主机名 Autodiscover DNS 中寻找重定向 URL: autodiscover.mailhoster.com
          ...

Autodiscover 就是不断从主机名和 URI 中寻找配置, 一层一层从上到下尝试寻找, 经过多层重定向之后最终找到文件名为 autodiscover.xml 配置文件, 如果多次重定向之后还是没找到, 那客户端读取不到配置文件就还是需要手动配置了.

响应规范

以下是 Microsoft 提供的适用 Outlook 2010 邮件客户端的服务端配置文件模板:

计划自动在 Outlook 2010 中配置用户帐户 | Microsoft Learn

提示

以下配置文件注释经过笔者翻译.

配置文件模板

autodiscover.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?xml version="1.0" encoding="utf-8"?>
<Autodiscover xmlns="https://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
<!-- Response: 必须
本标签用于指示该 XML 是一个 Autodiscover 响应.
-->
<Response
xmlns="https://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<!-- User: 可选
本标签用于提供用户信息, Autodiscover 必须使用 UTF-8 编码.
-->
<User>
<!-- DisplayName: 可选
服务端使用这个标签提供一个默认显示名称. 客户端可以选择接受或自定义, 这可以免除用户所需要的输入从而节省时间.
-->
<DisplayName>John Doe</DisplayName>
</User>

<!-- Account: 必须
本标签用于指定账户类型, 如电子邮件(Email), 新闻组(Newsgroup)和 SIP 服务器等.
-->
<Account>
<!-- AccountType: 必须
本标签中的值用于指定账户类型.
可用值:
email: 表示该标签内用于定义电子邮件服务器的配置.
nntp: 表示该标签内用于定义 NNTP 服务器的配置(Outlook 2007 没有使用).
-->
<AccountType>email | nntp</AccountType>

<!-- Action: 必须
本标签中的值用于定义直接使用本文件的配置或重定向至另一个可提供 Autodiscover 配置的网络服务器.
可用值:
redirectUrl: 如果指定使用这个值, 那么在 RedirectUrl 标签中必须要包含要定向到的 Autodiscover 配置路径(http/https).
为了防止服务端的重定向将客户端置入请求循环中, 客户端应在 10 次重定向后停止继续重定向.
redirectAddr: 如果指定使用这个值, 表示客户端应当使用 RedirectAddr 标签中的电子邮件地址进行 Autodiscover 配置查找, 而不是使用当前的用户电子邮箱地址.
settings: 如果指定使用了这个值, 表示本 XML 文件中包含进行账户配置所需要的信息. 客户端将使用 Protocol 标签下的服务器配置进行配置客户端.
-->
<Action>redirectUrl | redirectAddr | settings</Action>

<!-- RedirectUrl: 如果 Action 标签值指定为 "redirectUrl", 则本标签值为必须; 如果未指定, 则应该移除本标签.
本标签的值应是一个 http 或 https 协议的 URL, 用于客户端使用该值进一步获取配置.
-->
<RedirectUrl>redirect.URL</RedirectUrl>

<!-- RedirectAddr: 如果 Action 标签值指定为 "redirectAddr", 则本标签值为必须; 如果未指定, 则应该移除本标签.
本标签的值应是一个电子邮件地址, 用于客户端使用该地址重新查找 Autodiscover 配置.
-->
<RedirectAddr>email@address</RedirectAddr>

<!-- Image: 可选
本标签的值是一张网络 JPG 图片, 用作配置电子邮件服务提供商的品牌标志(Outlook 2007 没有使用).
-->
<Image>http://path.to.image.com/image.jpg</Image>

<!-- ServiceHome: 可选
本标签的值是一个指向电子邮件服务提供商主页的 URL, 客户端可以选择是否将这个值显示给用户(Outlook 2007 没有使用).
-->
<ServiceHome>http://web.page.com</ServiceHome>

<!-- Protocol: 如果 Action 标签值指定为 "settings", 则本标签值为必须; 如果未指定, 则应该移除本标签.
本标签只能包含一个账户类型的配置信息, 多个 Protocol 标签可按照服务端的偏好进行配置, 但客户端可以自行选择偏好协议.
-->
<Protocol>
<!-- Type: 必须.
本标签的值指定使用何种账户类型.
可选值:
POP3: 指定连接到服务器的协议使用 POP3. 仅适用于 AccountType 标签值为 "email" 时.
SMTP: 指定连接到服务器的协议使用 SMTP. 仅适用于 AccountType 标签值为 "email" 时.
IMAP: 指定连接到服务器的协议使用 IMAP. 仅适用于 AccountType 标签值为 "email" 时.
DAV: 指定连接到服务器的协议使用 DAV. 仅适用于 AccountType 标签值为 "email" 时.
WEB: 指定客户端使用 Server 标签中的 URL 从浏览器访问电子邮件. 仅适用于 AccountType 标签值为 "email" 时(Outlook 2007 没有使用).
NNTP: 指定连接到服务器的协议使用 NNTP. 仅适用于 AccountType 标签值为 "nntp" 时(Outlook 2007 没有使用).
-->
<Type>POP3 | SMTP | IMAP | DAV | WEB | NNTP</Type>

<!-- ExpirationDate: 可选.
本标签的值指定一个该配置文件最后有效的日期, 在该日期过后客户端应该自动重新查找 Autodiscover 配置. 如果未指定则默认为不过期.
-->
<ExpirationDate>YYYYMMDD</ExpirationDate>

<!-- TTL: 可选.
本标签的值指定该配置文件的有效时间, 单位为小时. 自首次查找该配置文件起算, 经过本标签值的时间后客户端将再次查找 Autodiscover 配置. 如果本标签未指定值, 则默认使用 1 小时的
TTL.
-->
<TTL>168</TTL>

<!-- Server: 必须.
本标签的值指定了与上方 Type 标签值中账户类型对应的服务器地址.
对于 Type 标签值为 POP3, SMTP, IMAP 或 NNTP 的, 该值应是一个主机名或 IP 地址.
对于 Type 标签值为 DAV 和 WEB 的, 该值应是一个 URL.
-->
<Server>mail.contoso.com</Server> <!--服务器的
IP 地址或域名-->

<!-- Port: 可选.
本标签的值指定对 Server 标签值使用的端口号. 如果未指定则根据 Type 标签值使用默认设置. 如果 Server 标签值是一个 URL, 则不使用本标签值.
-->
<Port>110</Port>

<!-- LoginName: 可选.
本标签值指定用户的登录名. 如果未指定, 则默认使用用户设置的电子邮件地址 "@" 前的字串符. 如果本标签值指定为一个域名, 则使用 [用户名]@[域名] 的格式进行配置, 如
"[email protected]".
-->
<LoginName>Alice</LoginName>

<!-- DomainRequired: 可选. 默认为 off.
本标签指定身份验证过程中是否需要域名, 如果设置为 on, 则在身份验证过程中需要域名, off 则为不需要. 如果未在 LoginName 标签中指定一个域名或未指定 LoginName
标签的值, 那么需要用户手动输入域名才能进行身份验证.
-->
<DomainRequired>on | off</DomainRequired>

<!-- DomainName: 可选.
本标签值指定用户域名. 如果未指定值, 则默认将用户电子邮件地址作为 UPN 的格式([用户名]@[域名])来使用. 如 [email protected].
-->
<DomainName></DomainName>

<!-- SPA: (Secure Password Authentication 安全密码验证) 可选.
本标签值指定是否需要安全密码验证. 如果未指定, 则默认为 on.
-->
<SPA>on | off</SPA>

<!-- SSL: 可选.
本标签值指定是否需要进行安全登录. 如果未指定, 则默认为 on.
-->
<SSL>on | off</SSL>

<!-- AuthRequired: 可选.
本标签值指定是否需要身份验证(基于密码). 如果未指定, 则默认为 on.
-->
<AuthRequired>on | off</AuthRequired> <!-- 可选: 是否需要身份验证. -->

<!-- UsePOPAuth: 可选.
本标签值仅在 Type 标签值为 "SMTP" 时可用. 用于指定 POP3 类型的账户使用的身份验证信息是否也将用于 SMTP.
-->
<UsePOPAuth>on | off</UsePOPAuth>

<!-- SMTPLast: 可选. 默认为 off.
本标签值指定在通过 SMTP 发件前是否需要先下载电子邮件. 通常 SMTP 下载邮件时都会检查身份验证是否成功, 所以一般为需要.
-->
<SMTPLast>on | off</SMTPLast>
</Protocol>
</Account>
</Response>
</Autodiscover>

使用这个规范编写的一个典型的 IMAP & POP3 & SMTP 服务器配置应该像这样:

autodiscover.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?xml version="1.0" encoding="utf-8" ?>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
<Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<Account>
<AccountType>email</AccountType>
<Action>settings</Action>
<Protocol>
<Type>IMAP</Type>
<Server>imap.example.com</Server>
<Port>993</Port>
<DomainRequired>off</DomainRequired>
<LoginName></LoginName>
<SPA>off</SPA>
<SSL>on</SSL>
<AuthRequired>on</AuthRequired>
</Protocol>
<Protocol>
<Type>POP3</Type>
<Server>pop3.example.com</Server>
<Port>995</Port>
<DomainRequired>off</DomainRequired>
<LoginName></LoginName>
<SPA>off</SPA>
<SSL>on</SSL>
<AuthRequired>on</AuthRequired>
</Protocol>
<Protocol>
<Type>SMTP</Type>
<Server>smtp.example.com</Server>
<Port>465</Port>
<DomainRequired>off</DomainRequired>
<LoginName></LoginName>
<SPA>off</SPA>
<Encryption>SSL</Encryption>
<AuthRequired>on</AuthRequired>
<UsePOPAuth>off</UsePOPAuth>
<SMTPLast>off</SMTPLast>
</Protocol>
</Account>
</Response>
</Autodiscover>

由于是使用标准的电子邮件协议, 而 Microsoft 提供的给 Exchange 服务器中的协议模板中有部分配置项目并不是必须的, 比如 UPN 就只是 Microsoft 专门用来指定一个账户个体的简称, 实际上和电子邮箱地址并没有区别, 两者几乎是一模一样的定义.

部署应用

多种配置模式适用于不同的电子邮件系统架构和组织部署环境, 需要按照需求选择合适自身的方法.

标准实现

  1. 编写正确规范的 XML 配置文件.

  2. 将电子邮件地址使用的域名解析到一个用于托管配置文件的网络服务器. 如:

    1
    example.com 3600 IN A 1.0.0.1
  3. 将配置文件放入网络服务器, 使其路径为: /autodiscover/autodiscover.xml.

  4. 再次解析邮件地址域名的子域名 autodiscover 到配置文件服务器:

    1
    autodiscover.example.com 3600 IN A 1.0.0.1
  5. 将配置文件放入网络服务器, 使其路径为: /autodiscover/autodiscover.xml

提示

多个配置文件理论并不会相互覆盖, 因为只会使用最先被发现的的那一个配置文件, 其目的是为了冗余. 但是不同客户端可能存在不同的行为, 所以建议同时设置多个方法且保证配置文件内容相同. 如果当前 DNS 解析状况导致解析已存在或不允许再次占用, 那么应该向后选择不冲突的那一种实现方式.

当然使用 CNAME 也是可以的, 因为会自动到 DNS 中的 CNAME 域名寻找.

跳转实现

从 Autodiscover 响应规范小节可以看出, 配置文件中存在一个 RedirectUrl 的标签, 可以让电子邮件客户端解析到时跳转到下一个网络配置文件路径.

因此可以将当前电子邮件域名的两个用于 Autodiscover 的 DNS 记录解析后在网络服务器对应的路径放入一个只用于重定向跳转的 XML:

XML 格式应该为:

autodiscover.xml
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<Autodiscover xmlns="https://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
<Response
xmlns="https://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<Account>
<AccountType>email</AccountType>
<Action>redirectUrl</Action>
<RedirectUrl>https://filesystem.example.com/autodiscover/example.com/Autodiscover.xml</RedirectUrl>
</Account>
</Response>
</Autodiscover>

这样就能将当前电子邮件域名的配置文件重定向到另一个网络文件路径

这样做的好处是能够将大量的域名电子邮件配置集中在一个网络文件系统中管理, 这个文件系统可以是你的服务商管理也可以是企业的 IT 管理员管理, 作为客户及最终用户可以免去维护 XML 配置的步骤. 如果多个域名都使用了相同的电子邮件服务器或电子邮件服务提供商, 那么这些电子邮件服务器的提供的客户端配置一般都是相同的.

但相比直接使用 CNAME 的跳转发现, 还需要配置一个用于跳转的 XML, 所以其实并不太理想. 这样的跳转实现大多用在 Outlook 本地安装的情况, 在本地设备上一次性使用注册表或者组策略将 Outlook 的 Autodiscover 指向这个跳转文件.

除了使用 HTTP 跳转, 还能跳转到另一个邮箱地址进行发现, XML 格式为:

autodiscover.xml
1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<Autodiscover xmlns="https://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
<Response
xmlns="https://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<Account>
<AccountType>email</AccountType>
<Action>redirectAddr</Action>
<RedirectAddr>[email protected]</RedirectAddr>
</Account>
</Response>
</Autodiscover>

同样的, 这样会让客户端解析到这个 XML 文件后直接跳转到 [email protected] 对这个邮箱地址的 example.net 的域名进行配置文件发现. 相较于直接配置一个 XML 的好处是: 避免跳转 URL 的修改可能无法及时同步到用于本地配置. 所以使用了跳转到另一个邮箱域名进行重新发现.

替代实现

Microsoft 还为 Exchange Server 准备了标准自动发现的后备方案, 这些方法会作为标准方法的替代以提高发现成功率和降低部署难度.

使用 GET 方法请求

通常情况下客户端会使用 POST 方法向 /autodiscover/autodiscover.xml 端点发送请求, 并且通常会进行身份验证以获取动态的配置文件.

作为标准实现的备用, 允许客户端使用 GET 方法去请求 autodiscover.example.com 主机的 /autodiscover/autodiscover.xml 端点, 不进行身份验证, 并且此时要求请求发送到的默认端点是 HTTP 协议而非默认的 HTTPS 协议, 如果服务端响应了 HTTP:302 状态码, 则按照 Exchange 新端点请求流程处理, 要求客户端提示用户进行重定向确认.

这种替代实现除了调整为首次请求端点默认使用 GET 方法和明文 HTTP 外, 其他方面和标准的实现原理完全相同.

注释

实际上的一些客户端不会去浪费时间和 "安全性" 去请求 HTTP 端点, 只会在 POST 失败之后就会直接用 GET 方法请求 HTTPS 端点.

使用 DNS 查询 SRV 记录

当所有的实现方法都查询失败后, 客户端最后会使用 DNS 查询用户邮箱域名的 SRV 记录获得其中的值作为新的 Autodiscover 端点主机, 并将获得的值按照记录值的优先级和权重顺序依次使用, Microsoft 要求客户端只能使用 HTTPS 查询这些获得的新端点主机.

用户的邮箱域名应该设置好需要使用的 SRV 记录, 其格式为:

1
_autodiscover._tcp.example.com 3600 IN SRV 10 10 443 autodiscover.example.org
提示

SRV 记录与 MX 记录指定优先级的概念相同, 是以优先级数字编号越小代表越优先; 权重恰恰相反, 数字越大表示权重越高, 但在 SRV 里优先使用优先级, 如果优先级相同再使用权重判定.

当客户端通过 SRV 记录获得了新的 API 端点主机, 就会以实现原理中描述的流程再次进行配置请求. 这实际上是一种将配置文件委托给第三方域的声明, 所以现在也在大量提供电子邮件托管的服务商中常见, 他们为了简化客户的自动发现配置, 会建议客户直接设置 SRV 记录将 Autodiscover 主机委托给他们的中央服务器.

配置验证

配置完成建议模拟客户端协议流程对配置文件进行验证.

Microsoft Remote Connectivity Analyzer

使用 Microsoft 提供的 Exchange Server 在线验证工具模拟 Outlook 连接流程可以快速验证 Autodiscover 配置:

Microsoft Remote Connectivity Analyzer- Outlook 连接

手动验证

标准 POST

使用 HTTP 客户端携带认证和请求体可模拟自动发现流程, 下方将使用 curl 进行流程演示.

提示

在 Exchange Server 2010 之前的服务端软件之外, 实际上并不一定需要构造和传递请求体, 甚至连身份认证都不需要, 大多数只是用了 Microsoft 风格和习惯的 Autodiscover 来分发配置而已. 这类服务器只会传递固定的邮箱配置, 大多数客户端也清楚这一点, 所以现在只需要按实际需求兼容实现即可.

  1. 构造请求体 XML:

    autodiscover-request.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?xml version="1.0" encoding="utf-8"?>
    <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/requestschema/2006">
    <Request>
    <EMailAddress>[email protected]</EMailAddress>
    <AcceptableResponseSchema>
    http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a
    </AcceptableResponseSchema>
    </Request>
    </Autodiscover>
  2. 携带请求体和账户信息发起请求:

    1
    2
    3
    4
    5
    curl -X POST \
    -u "[email protected]:PASSWORD" \
    -H "Content-Type: text/xml" \
    -d "@autodiscover-request.xml" \
    https://autodiscover.example.com/autodiscover/autodiscover.xml
  3. 响应示例:

    autodiscover.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    <?xml version="1.0" encoding="utf-8"?>
    <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
    <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
    <User>
    <DisplayName>users</DisplayName>
    <LegacyDN>
    /o=example.com/ou=Exchange/cn=Recipients/cn=a55be5ac09bb4734812572b46bfc57d4-users</LegacyDN>
    <AutoDiscoverSMTPAddress>[email protected]</AutoDiscoverSMTPAddress>
    <DeploymentId>7d3020ab-d683-4dd2-b5bd-2a82b8e716b4</DeploymentId>
    </User>
    <Account>
    <AccountType>email</AccountType>
    <Action>settings</Action>
    <MicrosoftOnline>False</MicrosoftOnline>
    <ConsumerMailbox>False</ConsumerMailbox>
    <Protocol>
    <Type>SMTP</Type>
    <Server>example.com</Server>
    <Port>465</Port>
    <LoginName>[email protected]</LoginName>
    <DomainRequired>On</DomainRequired>
    <DomainName>example.com</DomainName>
    <SPA>Off</SPA>
    <SSL>On</SSL>
    <AuthRequired>On</AuthRequired>
    </Protocol>
    <Protocol>
    <Type>IMAP</Type>
    <Server>example.com</Server>
    <Port>993</Port>
    <LoginName>[email protected]</LoginName>
    <DomainRequired>On</DomainRequired>
    <DomainName>example.com</DomainName>
    <SPA>Off</SPA>
    <SSL>On</SSL>
    <AuthRequired>On</AuthRequired>
    </Protocol>
    <Protocol>
    <Type>POP3</Type>
    <Server>example.com</Server>
    <Port>995</Port>
    <LoginName>[email protected]</LoginName>
    <DomainRequired>On</DomainRequired>
    <DomainName>example.com</DomainName>
    <SPA>Off</SPA>
    <SSL>On</SSL>
    <AuthRequired>On</AuthRequired>
    </Protocol>
    <Protocol>
    <Type>DAV</Type>
    <Server>https://example.com/webdav</Server>
    <LoginName>[email protected]</LoginName>
    </Protocol>
    <Protocol>
    <Type>X-EXCHANGE-ONLINEMEETING:1</Type>
    <Server>example.com</Server>
    <SSL>On</SSL>
    </Protocol>
    <Protocol>
    <Type>X-EXCHANGE-EXT-APIS:2</Type>
    <Server>example.com</Server>
    <SSL>On</SSL>
    </Protocol>
    </Account>
    </Response>
    </Autodiscover>

后备 GET

使用 HTTP 客户端, 不需要认证, 即可模拟后备 GET 发现流程, 下方将使用 curl 进行流程演示.

  1. 发起请求:

    1
    curl -L http://autodiscover.example.com/autodiscover/autodiscover.xml
  2. 响应示例:

    autodiscover.xml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    <Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006">
    <Response xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
    <Account>
    <AccountType>email</AccountType>
    <Action>settings</Action>
    <Protocol>
    <Type>IMAP</Type>
    <Server>imap.example.com</Server>
    <Port>993</Port>
    <DomainRequired>off</DomainRequired>
    <LoginName></LoginName>
    <SPA>off</SPA>
    <SSL>on</SSL>
    <AuthRequired>on</AuthRequired>
    </Protocol>
    <Protocol>
    <Type>POP3</Type>
    <Server>pop.example.com</Server>
    <Port>995</Port>
    <DomainRequired>off</DomainRequired>
    <LoginName></LoginName>
    <SPA>off</SPA>
    <SSL>on</SSL>
    <AuthRequired>on</AuthRequired>
    </Protocol>
    <Protocol>
    <Type>SMTP</Type>
    <Server>smtp.example.com</Server>
    <Port>465</Port>
    <DomainRequired>off</DomainRequired>
    <LoginName></LoginName>
    <SPA>off</SPA>
    <Encryption>SSL</Encryption>
    <AuthRequired>on</AuthRequired>
    <UsePOPAuth>off</UsePOPAuth>
    <SMTPLast>off</SMTPLast>
    </Protocol>
    </Account>
    </Response>
    </Autodiscover>

后备 SRV

使用 dig 作为 DNS 客户端即可验证 SRV 记录.

  1. 发起查询请求:

    1
    dig _autodiscover._tcp.example.com SRV
  2. 响应示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    ; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> _autodiscover._tcp.example.com SRV
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49228
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

    ;; QUESTION SECTION:
    ;_autodiscover._tcp.example.com. IN SRV

    ;; ANSWER SECTION:
    _autodiscover._tcp.example.com. 3600 IN SRV 0 0 443 autoconfig.example.org.

    ;; Query time: 799 msec
    ;; SERVER: 10.255.255.254#53(10.255.255.254) (UDP)
    ;; WHEN: Fri Feb 21 16:58:31 CST 2025
    ;; MSG SIZE rcvd: 98

    检查其中的 ANSWER SECTION 字段是否符合预期设置, 然后再使用字段值中的 DNS 记录值(本例中为 autoconfig.example.org)作为主机重复标准 POST 发现流程, 得到最终响应配置.