// init/dependencies.go
package appinit
import (
"context"
"fmt"
"net/smtp"
"os"
"golazy.dev/lazydeps"
"golazy.dev/lazymailer"
)
func Dependencies(deps *lazydeps.Scope) error {
_, err := lazydeps.Service(deps, "mailer", func(ctx context.Context) (
context.Context,
*lazymailer.Mailer,
error,
context.CancelFunc,
) {
deliveries := lazymailer.NewRegistry("default", map[string]lazymailer.Delivery{
"default": lazymailer.SMTPDelivery{
Addr: os.Getenv("SMTP_ADDR"),
Auth: smtp.PlainAuth("", os.Getenv("SMTP_USER"), os.Getenv("SMTP_PASSWORD"), os.Getenv("SMTP_HOST")),
},
})
mailer, err := lazymailer.New(ctx, deliveries)
if err != nil {
return ctx, nil, fmt.Errorf("initialize mailer: %w", err), nil
}
return lazymailer.WithContext(ctx, mailer), mailer, nil, nil
})
return err
}
// app/mailers/notice_mailer/noticemailer.go
package noticemailer
import (
"context"
"golazy.dev/lazymailer"
)
type NoticeMailer struct {
base lazymailer.Base
}
func New(ctx context.Context) (*NoticeMailer, error) {
base, err := lazymailer.NewBase(ctx, "notice_mailer", lazymailer.Defaults{
From: lazymailer.MustParseAddress("GoLazy <[email protected]>"),
Delivery: "default",
Layout: "mailer",
})
if err != nil {
return nil, err
}
return &NoticeMailer{base: base}, nil
}
func (m *NoticeMailer) Welcome(to lazymailer.Address, name string) error {
m.base.Set("name", name)
return m.base.Mail(lazymailer.Options{
Action: "welcome",
To: []lazymailer.Address{to},
Subject: "Welcome",
})
}
{{/* app/views/notice_mailer/welcome.html.tpl */}}
<p>Hello {{.name}}</p>