43 lines
1013 B
Go
43 lines
1013 B
Go
package autoconfig
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
func lookupMX(ctx context.Context, domain string) ([]string, error) {
|
|
resolver := net.Resolver{}
|
|
mxRecords, err := resolver.LookupMX(ctx, domain)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
sort.Slice(mxRecords, func(i, j int) bool {
|
|
return mxRecords[i].Pref < mxRecords[j].Pref
|
|
})
|
|
hosts := make([]string, 0, len(mxRecords))
|
|
for _, mx := range mxRecords {
|
|
host := strings.TrimSuffix(strings.ToLower(mx.Host), ".")
|
|
if host != "" {
|
|
hosts = append(hosts, host)
|
|
}
|
|
}
|
|
return hosts, nil
|
|
}
|
|
|
|
func discoverFromMX(ctx context.Context, email, domain string) (Result, bool) {
|
|
hosts, err := lookupMX(ctx, domain)
|
|
if err != nil || len(hosts) == 0 {
|
|
return Result{}, false
|
|
}
|
|
for _, host := range hosts {
|
|
if preset, ok := matchMX(host); ok {
|
|
r := preset.toResult(email, domain, "mx", "high")
|
|
r.Notes = append(r.Notes, "Configuration déduite des enregistrements MX («"+host+"»).")
|
|
return r, true
|
|
}
|
|
}
|
|
return Result{}, false
|
|
}
|