diff --git a/apps/api/internal/app/dns_handlers.go b/apps/api/internal/app/dns_handlers.go index 12c8b5c..eccc879 100644 --- a/apps/api/internal/app/dns_handlers.go +++ b/apps/api/internal/app/dns_handlers.go @@ -33,10 +33,12 @@ func (a *App) handleDNSCheck(w http.ResponseWriter, r *http.Request) { } func (a *App) dnsRecordsFor(d *Domain) []DNSRecord { - host := strings.TrimSuffix(a.cfg.PublicHostname, ".") + "." name := strings.TrimSuffix(d.Name, ".") + // MX 建议使用 mail.<域名> 标准格式,而不是直接用 PublicHostname + // 避免 PublicHostname 等于域名本身时出现 MX 指向自己的问题 + mxHost := "mail." + name + "." return []DNSRecord{ - {Type: "MX", Name: name, Value: fmt.Sprintf("10 %s", host), TTL: 300}, + {Type: "MX", Name: name, Value: fmt.Sprintf("10 %s", mxHost), TTL: 300}, {Type: "TXT", Name: name, Value: "v=spf1 mx -all", TTL: 300}, {Type: "TXT", Name: d.DKIMSelector + "._domainkey." + name, Value: "v=DKIM1; k=rsa; p=" + d.DKIMPublicKey, TTL: 300}, {Type: "TXT", Name: "_dmarc." + name, Value: "v=DMARC1; p=quarantine; rua=mailto:postmaster@" + name, TTL: 300}, diff --git a/apps/web/src/pages/admin.tsx b/apps/web/src/pages/admin.tsx index f52d349..2e4b5e4 100644 --- a/apps/web/src/pages/admin.tsx +++ b/apps/web/src/pages/admin.tsx @@ -838,7 +838,14 @@ function DNSPanel({ domain, embedded = false }: { domain?: Domain; embedded?: bo const { toast } = useToast(); const qc = useQueryClient(); const records = useQuery({ queryKey: ["dns-records", domain?.id], queryFn: () => api.dnsRecords(domain!.id), enabled: !!domain }) const check = useMutation({ mutationFn: () => api.checkDns(domain!.id), onSuccess: (res) => { qc.invalidateQueries({ queryKey: ["admin", "domains"] }); toast({ title: res.status === "ok" ? "DNS 检测通过" : "DNS 检测未通过", description: Object.values(res.checks).map((c) => c.message).join(";") }) } }) if (!domain) return 请选择域名 - const content = <>
{records.data?.items.map((r) => )}
{check.data && <>
{Object.entries(check.data.checks).map(([k, v]) =>
{k.toUpperCase()}: {v.message}
)}
} + const content = <> +

以下为需要在域名 DNS 管理中添加的记录:

+
{records.data?.items.map((r) => )}
+ {check.data && <> + +
检测结果
+
{Object.entries(check.data.checks).map(([k, v]) =>
{k.toUpperCase()}: {v.message}
)}
+ } const header =
DNS 记录
if (embedded) return
DNS 记录
{content}
return {header}{content} @@ -846,7 +853,7 @@ function DNSPanel({ domain, embedded = false }: { domain?: Domain; embedded?: bo function DNSRecordRow({ record }: { record: DNSRecord }) { const { toast } = useToast(); const text = `${record.type} ${record.name} ${record.value}` - return
{record.type}
Name: {record.name}
Value: {record.value}
TTL: {record.ttl}s
+ return
{record.type}
Name: {record.name}
Value: {record.value}
TTL: {record.ttl}s
} function fieldValue(form: FormData, name: string, fallback: string) {