81 lines
2.6 KiB
Go
81 lines
2.6 KiB
Go
// 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("<b>from custom sender</b>").
|
||
|
|
Build()
|
||
|
|
|
||
|
|
// 通过 Manager 统一发送
|
||
|
|
if err := mgr.Send(ctx, msg); err != nil {
|
||
|
|
fmt.Println("send failed:", err)
|
||
|
|
return
|
||
|
|
}
|
||
|
|
fmt.Println("send ok")
|
||
|
|
}
|