70 lines
1.7 KiB
Go
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.",
|
|
},
|
|
}
|
|
}
|