From 57025f7b8da308d6b038b2ec9c942da56fb6f457 Mon Sep 17 00:00:00 2001 From: AI Engineer Date: Thu, 14 May 2026 21:55:14 +0800 Subject: [PATCH] chore: infrastructure alignment and doc sync (by checkall) --- go.mod | 10 +++++----- go.sum | 14 ++++++++------ mail.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index a5192bb..b4960f1 100644 --- a/go.mod +++ b/go.mod @@ -3,10 +3,10 @@ module apigo.cc/go/mail go 1.26.1 require ( - apigo.cc/go/cast v1.3.0 - apigo.cc/go/config v1.3.0 - apigo.cc/go/file v1.3.0 - apigo.cc/go/log v1.3.0 + apigo.cc/go/cast v1.3.2 + apigo.cc/go/file v1.3.1 + apigo.cc/go/log v1.3.2 + apigo.cc/go/safe v1.3.0 github.com/emersion/go-imap/v2 v2.0.0-beta.8 github.com/jaytaylor/html2text v0.0.0-20260303211410-1a4bdc82ecec github.com/jhillyerd/enmime v1.3.0 @@ -14,10 +14,10 @@ require ( ) require ( + apigo.cc/go/config v1.3.0 // indirect apigo.cc/go/encoding v1.3.0 // indirect apigo.cc/go/id v1.3.0 // indirect apigo.cc/go/rand v1.3.0 // indirect - apigo.cc/go/safe v1.3.0 // indirect apigo.cc/go/shell v1.3.0 // indirect github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect diff --git a/go.sum b/go.sum index 8e5cb00..1e803f1 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,15 @@ -apigo.cc/go/cast v1.3.0 h1:ZTcLYijkqZjSWSCSpJUWMfzJYeJKbwKxquKkPrFsROQ= -apigo.cc/go/cast v1.3.0/go.mod h1:lGlwImiOvHxG7buyMWhFzcdvQzmSaoKbmr7bcDfUpHk= +apigo.cc/go/cast v1.3.2 h1:hh9MWDSwh3T/kQdCHjFpjDwHrh2A05Q4wt1AAWs8NBI= +apigo.cc/go/cast v1.3.2/go.mod h1:lGlwImiOvHxG7buyMWhFzcdvQzmSaoKbmr7bcDfUpHk= apigo.cc/go/config v1.3.0 h1:TwI3bv3D+BJrAnFx+o62HQo3FarY2Ge3SCGsKchFYGg= apigo.cc/go/config v1.3.0/go.mod h1:88lqKEBXlIExFKt1geLONVLYyM+QhRVpBe0ok3OEvjI= apigo.cc/go/encoding v1.3.0 h1:8jqNHoZBR8vOU/BGsLFebfp1Txa1UxDRpd7YwzIFLJs= apigo.cc/go/encoding v1.3.0/go.mod h1:kT/uUJiuAOkZ4LzUWrUtk/I0iL1D8aatvD+59bDnHBo= -apigo.cc/go/file v1.3.0 h1:xG9FcY3Rv6Br83r9pq9QsIXFrplx4g8ITOkHSzfzXRg= -apigo.cc/go/file v1.3.0/go.mod h1:pYHBlB/XwsrnWpEh7GIFpbiqobrExfiB+rEN8V2d2kY= +apigo.cc/go/file v1.3.1 h1:qHgiJsn1K9DazWRrPoHVnXtp6hDGGsUpAE/4G1bFXqY= +apigo.cc/go/file v1.3.1/go.mod h1:pYHBlB/XwsrnWpEh7GIFpbiqobrExfiB+rEN8V2d2kY= apigo.cc/go/id v1.3.0 h1:Tr2Yj0Rl19lfwW5wBTJ407o/zgo2oVRLE20WWEgJzdE= apigo.cc/go/id v1.3.0/go.mod h1:AFH3kMFwENfXNyijnAFWEhSF1o3y++UBPem1IUlrcxA= -apigo.cc/go/log v1.3.0 h1:61Z80WGN6SnhgxgoR8xuVYIieMdjlJKmf8JX1HXzp0Y= -apigo.cc/go/log v1.3.0/go.mod h1:dz4bSz9BnOgutkUJJZfX3uDDwsMpUxt7WF50mLK9hgE= +apigo.cc/go/log v1.3.2 h1:/m3V4MnlYnCG4XPHpWDsa4cw5suMaDVY1SgaVyjnBSo= +apigo.cc/go/log v1.3.2/go.mod h1:dz4bSz9BnOgutkUJJZfX3uDDwsMpUxt7WF50mLK9hgE= apigo.cc/go/rand v1.3.0 h1:k+UFAhMySwXf+dq8Om9TniZV6fm6gAE0evbrqMEdwQU= apigo.cc/go/rand v1.3.0/go.mod h1:mZ/4Soa3bk+XvDaqPWJuUe1bfEi4eThBj1XmEAuYxsk= apigo.cc/go/safe v1.3.0 h1:uctdAUsphT9p60Tk4oS5xPCe0NoIdOHfsYv4PNS0Rok= @@ -69,6 +69,7 @@ github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7 github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf h1:pvbZ0lM0XWPBqUKqFU8cmavspvIl9nulOYwdy6IFRRo= github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf/go.mod h1:RJID2RhlZKId02nZ62WenDCkgHFerpIOmW0iT7GKmXM= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= @@ -81,6 +82,7 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= diff --git a/mail.go b/mail.go index 40f2459..97254f8 100644 --- a/mail.go +++ b/mail.go @@ -90,6 +90,54 @@ type RecvResult struct { Tag uint32 } +// NewWithConfig 是 New 的别名 +func NewWithConfig(cfg *MailboxConfig) (*Mailbox, error) { + return New(cfg) +} + +// MustNew 创建一个邮件客户端实例,如果失败则 panic +func MustNew(cfg *MailboxConfig) *Mailbox { + m, err := New(cfg) + if err != nil { + panic(err) + } + return m +} + +// Send 使用默认邮箱发送邮件 +func Send(to []string, subject, content string, option *SendOption) error { + m := GetMailbox("default") + if m == nil { + return fmt.Errorf("default mailbox not configured") + } + return m.Send(to, subject, content, option) +} + +// MustSend 使用默认邮箱发送邮件,如果失败则 panic +func MustSend(to []string, subject, content string, option *SendOption) { + if err := Send(to, subject, content, option); err != nil { + panic(err) + } +} + +// Recv 使用默认邮箱接收邮件 +func Recv(opt *RecvOption) (*RecvResult, error) { + m := GetMailbox("default") + if m == nil { + return nil, fmt.Errorf("default mailbox not configured") + } + return m.Recv(opt) +} + +// MustRecv 使用默认邮箱接收邮件,如果失败则 panic +func MustRecv(opt *RecvOption) *RecvResult { + res, err := Recv(opt) + if err != nil { + panic(err) + } + return res +} + // GetMailbox 获取或创建一个指定名称的邮件客户端实例 func GetMailbox(name string, configs ...*MailboxConfig) *Mailbox { instMu.RLock()