ultisuite-backend/internal/mail/autoconfig/discover.go
2026-05-24 00:03:36 +02:00

70 lines
1.7 KiB
Go

package autoconfig
import (
"context"
"net/mail"
"strings"
"time"
)
// Discover resolves likely IMAP/SMTP settings for an email address.
func Discover(ctx context.Context, email string) (Result, error) {
email = strings.TrimSpace(email)
parsed, err := mail.ParseAddress(email)
if err != nil || parsed.Address == "" {
return Result{}, ErrInvalidEmail
}
email = strings.ToLower(parsed.Address)
at := strings.LastIndex(email, "@")
if at <= 0 || at >= len(email)-1 {
return Result{}, ErrInvalidEmail
}
domain := strings.ToLower(email[at+1:])
ctx, cancel := context.WithTimeout(ctx, 8*time.Second)
defer cancel()
if preset, ok := matchDomain(domain); ok {
r := preset.toResult(email, domain, "preset", "high")
return r, nil
}
if r, ok := discoverFromMX(ctx, email, domain); ok && r.IMAPHost != "" {
r.Email = email
return r, nil
}
if r, ok := fetchMozillaAutoconfig(ctx, domain); ok {
r.Email = email
r.Domain = domain
if r.IMAPHost != "" || r.SMTPHost != "" {
return r, nil
}
}
return guessFromDomain(email, domain), nil
}
func guessFromDomain(email, domain string) Result {
return Result{
Email: email,
Domain: domain,
ProviderID: "custom",
ProviderName: "Serveur personnalisé",
Source: "guess",
Confidence: "low",
IMAPHost: "imap." + domain,
IMAPPort: 993,
IMAPTLS: true,
SMTPHost: "smtp." + domain,
SMTPPort: 587,
SMTPTLS: true,
UsernameHint: "email",
AuthMethods: []string{"password"},
Notes: []string{
"Aucune configuration connue pour ce domaine.",
"Vérifiez les paramètres auprès de votre hébergeur ou activez les réglages avancés.",
},
}
}