diff --git a/backend/services/setup/dns.go b/backend/services/setup/dns.go index 6a694fee..975f36cb 100644 --- a/backend/services/setup/dns.go +++ b/backend/services/setup/dns.go @@ -121,6 +121,14 @@ func buildDNSItemsWithWebIPv4(configData *config.Config, domain, dkimPublicKey, Tips: ipTips, }) } + } else if address != "" { + items = append(items, &DNSItem{ + Type: "A", + Host: webHost, + Value: address, + TTL: dnsRecordTTL, + Tips: "Web 域名尚未解析,已推荐使用邮件服务器公网 IPv4", + }) } else { items = append(items, &DNSItem{ Type: "A", diff --git a/backend/services/setup/dns_test.go b/backend/services/setup/dns_test.go index 7212ee92..465e831b 100644 --- a/backend/services/setup/dns_test.go +++ b/backend/services/setup/dns_test.go @@ -94,21 +94,33 @@ func TestBuildDNSItemsCreatesExpectedRecordShape(t *testing.T) { } } -func TestBuildDNSItemsDoesNotReuseMailIPForUnresolvedWebDomain(t *testing.T) { +func TestBuildDNSItemsReusesMailIPForUnresolvedWebDomain(t *testing.T) { cfg := &config.Config{ Domain: "example.net", WebDomain: "panel.example.net", } items := buildDNSItemsWithWebIPv4(cfg, "example.net", "v=DKIM1; k=rsa; p=test", "198.51.100.30", "", "", nil) - if items[0].Host != "panel" || items[0].Value != "" || items[0].UnavailableReason != unresolvedWebIPv4 { - t.Fatalf("unresolved web A record = %#v", items[0]) + if items[0].Host != "panel" || items[0].Value != "198.51.100.30" || items[0].UnavailableReason != "" { + t.Fatalf("unresolved web A record should fall back to mail public ip: %#v", items[0]) } if items[1].Host != "smtp" || items[1].Value != "198.51.100.30" { t.Fatalf("mail A record = %#v", items[1]) } } +func TestBuildDNSItemsWithoutAnyIPMarksUnresolvedWebDomain(t *testing.T) { + cfg := &config.Config{ + Domain: "example.net", + WebDomain: "panel.example.net", + } + items := buildDNSItemsWithWebIPv4(cfg, "example.net", "v=DKIM1; k=rsa; p=test", "", "", "", nil) + + if items[0].Host != "panel" || items[0].Value != "" || items[0].UnavailableReason != unresolvedWebIPv4 { + t.Fatalf("unresolved web A record without public ip = %#v", items[0]) + } +} + func TestResolvePublicIPv4UsesActualLookupResults(t *testing.T) { lookup := func(ctx stdcontext.Context, host string) ([]net.IP, error) { if host != "panel.example.org" { diff --git a/backend/services/verification/delivery_test.go b/backend/services/verification/delivery_test.go index 58faaf36..f03de8a3 100644 --- a/backend/services/verification/delivery_test.go +++ b/backend/services/verification/delivery_test.go @@ -71,7 +71,7 @@ func TestSMTPDeliveryUsesReferenceHTMLTemplate(t *testing.T) { "", "
<xuans>,您好:
", - "123456
", + ">123456", "7 分钟", "本邮件由 Smail 发送", } { diff --git a/frontend/src/views/components/HomeAside/HomeAside.vue b/frontend/src/views/components/HomeAside/HomeAside.vue index c8f656fb..866a949d 100644 --- a/frontend/src/views/components/HomeAside/HomeAside.vue +++ b/frontend/src/views/components/HomeAside/HomeAside.vue @@ -57,7 +57,7 @@