+ {!check.ok && visibleRecords.length > 0 &&
当前解析
{visibleRecords.map((record, index) =>
{record}
)}
}
@@ -2621,36 +2671,61 @@ function dnsDescription(record: DNSRecord): string {
if (record.type === "TXT" && record.name.startsWith("_dmarc")) return "声明域名的 DMARC 策略(如何处理未通过 SPF/DKIM 验证的邮件)。"
if (record.type === "TXT" && record.value.includes("DKIM1")) return "DKIM 公钥。收件服务器用此密钥验证邮件是否由你发出。"
if (record.type === "TXT" && record.value.includes("spf1")) return "声明哪些服务器有权使用你的域名发件,防止伪造。"
- if (record.type === "MX") return `确保 ${record.name} 的 A 记录已指向你的服务器 IP,邮件才能到达。`
+ if (record.type === "MX") {
+ const mx = mxRecordParts(record.value)
+ return `邮件由 ${mx.target} 接收,请确保它的 A 记录指向服务器 IP。优先级 ${mx.priority},数值越小越优先。`
+ }
return ""
}
-function DNSRecordRow({ record }: { record: DNSRecord }) {
+function mxRecordParts(value: string) {
+ const [rawPriority = "10", ...rawTarget] = value.trim().split(/\s+/)
+ const priority = /^\d+$/.test(rawPriority) ? rawPriority : "10"
+ const target = (rawTarget.length > 0 ? rawTarget.join(" ") : value).replace(/\.$/, "")
+ return { priority, target }
+}
+
+function dnsHostForProvider(recordName: string, domainName: string) {
+ const name = recordName.replace(/\.$/, "")
+ const domain = domainName.replace(/\.$/, "")
+ if (name.toLowerCase() === domain.toLowerCase()) return "@"
+ const suffix = `.${domain}`
+ if (name.toLowerCase().endsWith(suffix.toLowerCase())) return name.slice(0, -suffix.length)
+ return name
+}
+
+function DNSRecordRow({ record, domainName }: { record: DNSRecord; domainName: string }) {
const { toast } = useToast()
const desc = dnsDescription(record)
+ const longValue = record.value.length > 180
+ const mx = record.type === "MX" ? mxRecordParts(record.value) : null
+ const displayHost = dnsHostForProvider(record.name, domainName)
+ const displayValue = mx?.target || record.value
+ const [valueExpanded, setValueExpanded] = React.useState(false)
async function copyField(label: string, value: string) {
await navigator.clipboard.writeText(value)
toast({ title: `${label}已复制` })
}
- return
-
+ return
+
{record.type}
+ {longValue && }
- {desc &&
{desc}
}
-
+ {desc &&
{desc}
}
+
主机记录
- {record.name}
-
+ {displayHost}
+
记录值
- {record.value}
-
+ {displayValue}
+
-
-
TTL
-
{record.ttl} 秒
+
+ {mx &&
优先级{mx.priority}
}
+
TTL{record.ttl} 秒