SMTP
Ez az az alcsomag, amit egy projekt akkor importál, amikor ténylegesen levelet akar küldeni, nem csak a mail-ben definiált interfészt használni.
import "github.com/gp-system/mail/smtp"
A mail/smtp a konkrét driver, ami ténylegesen elhagyja a processzt: SMTP-n keresztül küld, a wneessen/go-mail-lel. Ez az egyetlen mailer a modulban, ami hálózati kapcsolatot nyit; a tesztekben és a mail nélküli környezetekben használt no-op alternatívákért lásd az áttekintő oldal Dev mailerek szakaszát.
Konstruktorok
mailer, err := smtp.New(ctx, cfg.Mail) // hibázik üres Host vagy FromAddress esetén
mailer, err := smtp.NewIfConfigured(ctx, cfg.Mail) // üres Host -> mail.NewDiscard(), nincs hiba
mailer := smtp.MustNewIfConfigured(ctx, cfg.Mail) // panicol hiba esetén; a szokásos main()-konstruktor
Konfiguráció
Az smtp.Config MAIL_ prefixszel kerül a projekt configjába:
type Config struct {
// ...
Mail smtp.Config `envPrefix:"MAIL_"`
}
| Változó | Default | Jelentés |
|---|---|---|
MAIL_HOST | (üres = nincs transport) | SMTP szerver címe |
MAIL_PORT | 587 | SMTP port |
MAIL_USERNAME / MAIL_PASSWORD | üres | üresen: nincs auth (Mailpit, belső relay) |
MAIL_AUTH | auto | auto | plain | login | cram-md5 | none |
MAIL_TLS | starttls | starttls | starttls-opportunistic (dev, TLS nélküli szerver) | tls (implicit TLS, 465) | none |
MAIL_FROM_ADDRESS | kötelező, ha MAIL_HOST be van állítva | default feladó cím |
MAIL_FROM_NAME | üres | default feladó megjelenített neve |
MAIL_TIMEOUT | 15s | dial/send timeout |
A teljes lista a konfiguráció-referenciában.
TLS- és auth-módok
A MAIL_TLS négy mód közül választja ki a kapcsolat titkosítását: a starttls egy plaintext kapcsolatot frissít a kezdeti handshake után (a szokásos 587-es port beállítása, és itt a default); a starttls-opportunistic ugyanezt próbálja, de eltűri, ha a szerver nem ajánlja fel, hasznos egy plain SMTP-t beszélő dev relay (Mailpit) ellen; a tls implicit TLS-sel tárcsáz az első bájttól (465-ös port); a none nyílt szövegben küld, kizárólag megbízható belső hálózathoz.
A MAIL_AUTH a SASL-mechanizmust választja: az auto a szerver által hirdetett legerősebb mechanizmust egyezteti, és ez a helyes default bármi éleshez. A plain és a login explicit fallback szűkebb hirdetésű szerverekhez; a cram-md5 egy legacy challenge-response mechanizmus régebbi relay-ekhez. A none teljesen kihagyja az authot, ugyanaz a "nincs credential" álláspont, amit az üres MAIL_USERNAME/MAIL_PASSWORD már úgyis jelez, hasznos, ha maga a relay hálózati hely alapján, nem credentiallel korlátoz.
Timeoutok és az indulási kapcsolat-ellenőrzés
A New konstruáláskor egy dial+close-lal ellenőrzi a kapcsolatot, ugyanaz a konvenció, mint a pg.NewPool/queue.NewClient pingje: a hibás konfig induláskor bukik, nem az első levélnél. A MAIL_TIMEOUT mind ezt az induláskori ellenőrzést, mind minden további dial/send-et korlátoz. Minden Send saját OTel spant nyit (smtp.send), címzett-darabszámmal; címekkel soha.
NewIfConfigured: a dev/prod kapcsoló
A Host és a FromAddress nem required env-tag: az üres Host azt jelzi, hogy a projektnek nincs mail-transportja beállítva (jellemzően devben, vagy egy olyan service-ben, ami sosem küld levelet ténylegesen). A NewIfConfigured (és a panicoló párja, a MustNewIfConfigured) ezt mail.NewDiscard()-ra fordítja hiba helyett; a New továbbra is hibázik üres FromAddress-re, ha a Host be van állítva, mert az néma módon félrecímezné minden üzenetet. A NewIfConfigured-t köti be az add mail egy generált projektbe.
new project-tel generált projekt compose.yml-je már futtat egy mailpit service-t (SMTP-t fogad, a UI-ja a MAILPIT_HOST-on érhető el), a .env.example pedig a hozzá illő MAIL_* sorokkal, de az smtp.Config bekötése a projekt configjába, és az smtp.NewIfConfigured/MustNewIfConfigured hívása egyszer, az első add mail hívásakor történik meg.Kapcsolódó oldalak
- Áttekintés: a
Mailerinterfész, aMessagebuilder és a dev mailerek. - MJML: az az MJML template-fordítás, aminek a HTML-jét ez a driver küldi.
add mail: a generátor, ami egy notifiert és ezt a drivert köti be egy modulba.