// custom_sender 展示如何接入一个全新的发送通道(自定义 Sender)。 // // 适用场景:公司内部自研邮件网关、短信通道、钉钉/飞书通知等, // 只需实现 mailx.Sender 接口(Name + Send),即可复用 Manager 的 // 注册路由、默认通道、日志注入、消息校验等全部能力。 // // 怎么运行:在项目根目录执行:go run ./examples/custom_sender package main import ( "context" "fmt" "log" "code.yun.ink/pkg/mailx" ) // printSender 自定义通道:仅把消息打印到控制台,不真正发送。 // 只需实现 Sender 接口的两个方法:Name() 和 Send()。 type printSender struct { name string // 通道类型名 } func newPrintSender(name string) *printSender { return &printSender{name: name} } // Name 返回通道类型名(如 "print"),用于 Manager 注册与路由 func (p *printSender) Name() string { return p.name } // Send 实现发送逻辑。ctx 里可通过 mailx.LoggerFromContext 拿到注入的日志器。 func (p *printSender) Send(ctx context.Context, msg *mailx.Message) error { logger := mailx.LoggerFromContext(ctx) // 读取 Manager 注入的 Logger(可选) logger.Infof(ctx, "printSender Send called") fmt.Printf("[%s] to=%v cc=%v subject=%q text=%q html=%q\n", p.name, msg.To, msg.Cc, msg.Subject, msg.TextBody, msg.Body) return nil } // appLogger 实现 mailx.Logger 接口(4 个方法)。 // 生产中可改用 zap / logrus / slog 等,只需实现同样 4 个方法即可接入。 type appLogger struct{} func (appLogger) Debugf(_ context.Context, format string, args ...any) { log.Printf("[debug] "+format, args...) } func (appLogger) Infof(_ context.Context, format string, args ...any) { log.Printf("[info] "+format, args...) } func (appLogger) Warnf(_ context.Context, format string, args ...any) { log.Printf("[warn] "+format, args...) } func (appLogger) Errorf(_ context.Context, format string, args ...any) { log.Printf("[error] "+format, args...) } func main() { ctx := context.Background() mgr := mailx.NewManager() mgr.SetLogger(appLogger{}) // 注入 Logger,自定义通道内可读取 // 注册自定义通道 _ = mgr.Register(newPrintSender("print")) // 同一自定义类型也可注册多份实例(不同配置) _ = mgr.RegisterNamed("print-debug", newPrintSender("print")) msg := mailx.NewMessage(). To("user@example.com"). Subject("hello"). Text("from custom sender"). HTML("from custom sender"). Build() // 通过 Manager 统一发送 if err := mgr.Send(ctx, msg); err != nil { fmt.Println("send failed:", err) return } fmt.Println("send ok") }