Mailers

// 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>