Files
2026-08-15 01:38:05 +08:00

93 lines
2.9 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// manager 展示多通道管理器的完整用法。
//
// 功能:
// 1. 注册多个不同类型的通道(smtp/aliyun/aws),统一路由
// 2. 同一类型注册多份配置(主备 SMTP 切换)
// 3. 发送时按实例名指定通道,或发送时临时指定配置
// 4. 遍历当前注册的通道实例信息
//
// 怎么运行:
// 1. 替换下方各通道的凭据为真实值
// 2. 在项目根目录执行:go run ./examples/manager
package main
import (
"context"
"fmt"
"code.yun.ink/pkg/mailx"
"code.yun.ink/pkg/mailx/aliyun"
"code.yun.ink/pkg/mailx/aws"
"code.yun.ink/pkg/mailx/smtp"
)
func main() {
ctx := context.Background()
mgr := mailx.NewManager()
// ===== 注册多个不同类型的通道 =====
// 用 Register 注册时,实例名 = 通道类型名(smtp / aliyun / aws / mailgun
_ = mgr.Register(smtp.New(smtp.Config{
Host: "smtp.qq.com", Port: 587, User: "a@qq.com", Password: "code",
}))
_ = mgr.Register(aliyun.New(aliyun.Config{
AccessKeyID: "ak", AccessKeySecret: "sk", AccountName: "noreply@example.com",
}))
_ = mgr.Register(aws.New(aws.Config{
AccessKeyID: "ak", AccessKeySecret: "sk", Region: "ap-northeast-1",
Sender: "noreply@example.com",
}))
// ===== 同一类型注册多份配置(主备切换) =====
// 用 RegisterNamed 指定实例名,可注册多个 smtp 实例
_ = mgr.RegisterNamed("smtp-main", smtp.New(smtp.Config{
Host: "smtp.qq.com", Port: 465, User: "a@qq.com", Password: "main-code",
}))
_ = mgr.RegisterNamed("smtp-backup", smtp.New(smtp.Config{
Host: "smtp.163.com", Port: 465, User: "a@163.com", Password: "backup-code",
}))
// ===== 设置默认通道(不设置则用第一个注册的) =====
_ = mgr.SetDefault("aliyun")
// ===== 遍历当前注册的通道实例信息 =====
fmt.Println("registered instances:")
for _, info := range mgr.Senders() {
fmt.Printf(" - %s (type: %s)\n", info.Name, info.Type)
}
fmt.Println("default:", mgr.Default())
msg := mailx.NewMessage().
From("noreply@example.com").
To("user@example.com").
Subject("Notice").
Text("hello").
HTML("<h1>Hello</h1>").
Build()
// ===== 用默认通道发送 =====
if err := mgr.Send(ctx, msg); err != nil {
fmt.Println("default send:", err)
}
// ===== 按实例名指定通道发送 =====
if err := mgr.SendWith(ctx, "aws", msg); err != nil {
fmt.Println("aws send:", err)
}
if err := mgr.SendWith(ctx, "smtp-backup", msg); err != nil { // 主 SMTP 失败时可切备用
fmt.Println("smtp-backup send:", err)
}
// ===== 发送时临时指定配置,无需提前注册 =====
if err := mgr.SendBy(ctx, smtp.New(smtp.Config{
Host: "smtp.163.com", Port: 465, User: "b@163.com", Password: "code",
}), msg); err != nil {
fmt.Println("temp smtp send:", err)
}
// ===== 注销一个实例(可选) =====
mgr.Unregister("smtp-main")
fmt.Println("after unregister, instances:", mgr.Names())
}