imapserver

package
v0.0.0-...-781c92a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 22, 2024 License: MIT Imports: 19 Imported by: 0

Documentation

Overview

包 imapserver 实现了一个 IMAP 服务器。

包 imapserver 实现了一个 IMAP 服务器。

Index

Constants

View Source
const (
	NumKindSeq = NumKind(imapwire.NumKindSeq) // 序列号类型
	NumKindUID = NumKind(imapwire.NumKindUID) // UID 类型
)

Variables

View Source
var ErrAuthFailed = errAuthFailed

ErrAuthFailed 在 Session.Login 认证失败时返回。

Functions

func MatchList

func MatchList(name string, delim rune, reference, pattern string) bool

MatchList 检查引用和模式是否匹配一个邮箱。 参数:

name - 邮箱名称。
delim - 分隔符。
reference - 引用。
pattern - 匹配模式。

返回值:

如果匹配返回 true,否则返回 false。

Types

type Conn

type Conn struct {
	// contains filtered or unexported fields
}

Conn 代表与 IMAP 服务器的连接。

func (*Conn) Bye

func (c *Conn) Bye(text string) error

Bye 终止 IMAP 连接。

func (*Conn) NetConn

func (c *Conn) NetConn() net.Conn

NetConn 返回被 IMAP 连接包装的底层网络连接。

直接对该连接进行读写操作会破坏 IMAP 会话。

type ExpungeWriter

type ExpungeWriter struct {
	// contains filtered or unexported fields
}

ExpungeWriter 写入 EXPUNGE 更新的结构体。

func (*ExpungeWriter) WriteExpunge

func (w *ExpungeWriter) WriteExpunge(seqNum uint32) error

WriteExpunge 通知客户端指定序列号的邮件已被删除。 参数:

seqNum: 被删除邮件的序列号。

返回值:

返回 nil 表示成功,其他返回值表示错误信息。

type FetchResponseWriter

type FetchResponseWriter struct {
	// contains filtered or unexported fields
}

FetchResponseWriter 为消息写入单个 FETCH 响应。

func (*FetchResponseWriter) Close

func (w *FetchResponseWriter) Close() error

Close 关闭 FETCH 消息编写器的方法。

func (*FetchResponseWriter) WriteBinarySection

func (w *FetchResponseWriter) WriteBinarySection(section *imap.FetchItemBinarySection, size int64) io.WriteCloser

WriteBinarySection 写入二进制部分的方法。

section: 要编码的 imap.FetchItemBinarySection。 size: 二进制数据的大小。

func (*FetchResponseWriter) WriteBodySection

func (w *FetchResponseWriter) WriteBodySection(section *imap.FetchItemBodySection, size int64) io.WriteCloser

WriteBodySection 写入邮件体部分。

返回的 io.WriteCloser 必须在写入任何更多消息数据项之前关闭。

func (*FetchResponseWriter) WriteBodyStructure

func (w *FetchResponseWriter) WriteBodyStructure(bs imap.BodyStructure)

WriteBodyStructure 写入消息的主体结构(可以是 BODYSTRUCTURE 或 BODY)。

bs: 消息的主体结构,可以是不同类型的主体结构。

func (*FetchResponseWriter) WriteEnvelope

func (w *FetchResponseWriter) WriteEnvelope(envelope *imap.Envelope)

WriteEnvelope 写入消息的信封。

envelope: 要编码的 imap.Envelope,包含邮件的信封信息。

func (*FetchResponseWriter) WriteFlags

func (w *FetchResponseWriter) WriteFlags(flags []imap.Flag)

WriteFlags 写入消息的标志。

func (*FetchResponseWriter) WriteInternalDate

func (w *FetchResponseWriter) WriteInternalDate(t time.Time)

WriteInternalDate 写入消息的内部日期。

func (*FetchResponseWriter) WriteRFC822Size

func (w *FetchResponseWriter) WriteRFC822Size(size int64)

WriteRFC822Size 写入消息的完整大小。

func (*FetchResponseWriter) WriteUID

func (w *FetchResponseWriter) WriteUID(uid imap.UID)

WriteUID 写入消息的 UID。

type FetchWriter

type FetchWriter struct {
	// contains filtered or unexported fields
}

FetchWriter 写入 FETCH 响应。

func (*FetchWriter) CreateMessage

func (cmd *FetchWriter) CreateMessage(seqNum uint32) *FetchResponseWriter

CreateMessage 为消息写入 FETCH 响应。

FetchResponseWriter.Close 必须在写入任何更多消息数据项之前调用。

type GreetingData

type GreetingData struct {
	PreAuth bool // 是否预先认证
}

GreetingData 是与 IMAP 问候相关的数据。

type ListWriter

type ListWriter struct {
	// contains filtered or unexported fields
}

ListWriter 写入 LIST 响应。

func (*ListWriter) WriteList

func (w *ListWriter) WriteList(data *imap.ListData) error

WriteList 写入单个邮箱的 LIST 响应。 参数:

data - 包含邮箱和属性数据的结构体。

返回值:

处理过程中的错误,如果没有错误返回 nil。

type Logger

type Logger interface {
	Printf(format string, args ...interface{})
}

Logger 是一个记录错误信息的工具。

type MailboxTracker

type MailboxTracker struct {
	// contains filtered or unexported fields
}

MailboxTracker 用于跟踪邮箱的状态。

一个邮箱可以有多个会话监听更新。每个会话都有自己对邮箱的视图, 因为 IMAP 客户端异步接收邮箱更新。

func NewMailboxTracker

func NewMailboxTracker(numMessages uint32) *MailboxTracker

NewMailboxTracker 创建一个新的邮箱跟踪器。

func (*MailboxTracker) NewSession

func (t *MailboxTracker) NewSession() *SessionTracker

NewSession 创建一个新的会话跟踪器,用于该邮箱。

调用者在完成会话后必须调用 SessionTracker.Close。

func (*MailboxTracker) QueueExpunge

func (t *MailboxTracker) QueueExpunge(seqNum uint32)

QueueExpunge 将新的 EXPUNGE 更新排入队列。

func (*MailboxTracker) QueueMailboxFlags

func (t *MailboxTracker) QueueMailboxFlags(flags []imap.Flag)

QueueMailboxFlags 将新的 FLAGS 更新排入队列。

func (*MailboxTracker) QueueMessageFlags

func (t *MailboxTracker) QueueMessageFlags(seqNum uint32, uid imap.UID, flags []imap.Flag, source *SessionTracker)

QueueMessageFlags 将新的 FETCH FLAGS 更新排入队列。

如果 source 不为 nil,则该更新不会被分发给它。

func (*MailboxTracker) QueueNumMessages

func (t *MailboxTracker) QueueNumMessages(n uint32)

QueueNumMessages 将新的 EXISTS 更新排入队列。

type MoveWriter

type MoveWriter struct {
	// contains filtered or unexported fields
}

MoveWriter 用于写入 MOVE 命令的响应。

服务器必须先调用 WriteCopyData 一次,然后可以调用 WriteExpunge 任意次数。

func (*MoveWriter) WriteCopyData

func (w *MoveWriter) WriteCopyData(data *imap.CopyData) error

WriteCopyData 写入未标记的 COPYUID 响应以处理 MOVE 命令。 参数:

data - 复制数据

返回:错误信息,如果有的话

func (*MoveWriter) WriteExpunge

func (w *MoveWriter) WriteExpunge(seqNum uint32) error

WriteExpunge 写入 EXPUNGE 响应以处理 MOVE 命令。 参数:

seqNum - 邮件的序列号

返回:错误信息,如果有的话

type NumKind

type NumKind int

NumKind 描述一个数字应如何被解释:可以是序列号或 UID。

func (NumKind) String

func (kind NumKind) String() string

String 实现 fmt.Stringer 接口。

type Options

type Options struct {
	// NewSession 在客户端连接时被调用。
	NewSession func(*Conn) (Session, *GreetingData, error)
	// 支持的能力。如果为 nil,则只会广告 IMAP4rev1。该集合必须至少包含 IMAP4rev1 或 IMAP4rev2。
	//
	// 以下能力是 IMAP4rev2 的一部分,需要由仅支持 IMAP4rev1 的服务器显式启用:
	//
	//   - NAMESPACE
	//   - UIDPLUS
	//   - ESEARCH
	//   - LIST-EXTENDED
	//   - LIST-STATUS
	//   - MOVE
	//   - STATUS=SIZE
	Caps imap.CapSet
	// Logger 是用于打印错误消息的记录器。如果为 nil,则使用 log.Default。
	Logger Logger
	// TLSConfig 是用于 STARTTLS 的 TLS 配置。如果为 nil,则禁用 STARTTLS。
	TLSConfig *tls.Config
	// InsecureAuth 允许客户端在没有 TLS 的情况下进行身份验证。在这种模式下,服务器容易受到中间人攻击。
	InsecureAuth bool
	// 原始输入和输出数据将写入此写入器(如果有的话)。
	// 请注意,这可能包含敏感信息,例如身份验证期间使用的凭据。
	DebugWriter io.Writer
}

Options 包含服务器选项。

唯一必需的字段是 NewSession。

type Server

type Server struct {
	// contains filtered or unexported fields
}

Server 是一个 IMAP 服务器。

func New

func New(options *Options) *Server

New 创建一个新的服务器。

func (*Server) Close

func (s *Server) Close() error

Close 立即关闭所有活动的监听器和连接。

Close 返回关闭服务器底层监听器时返回的任何错误。

一旦对服务器调用 Close,就不能再重用;对 Serve 等方法的未来调用将返回错误。

func (*Server) ListenAndServe

func (s *Server) ListenAndServe(addr string) error

ListenAndServe 在 TCP 网络地址 addr 上监听,然后调用 Serve。

如果 addr 为空,则使用 ":143"。

func (*Server) ListenAndServeTLS

func (s *Server) ListenAndServeTLS(addr string) error

ListenAndServeTLS 在 TCP 网络地址 addr 上监听,然后调用 Serve 以处理传入的 TLS 连接。

在 Options.TLSConfig 中设置的 TLS 配置将被使用。如果 addr 为空, 则使用 ":993"。

func (*Server) Serve

func (s *Server) Serve(ln net.Listener) error

Serve 接受在监听器 ln 上的传入连接。

type Session

type Session interface {
	Close() error // 关闭会话

	// 未认证状态
	Login(username, password string) error // 登录方法

	// 认证状态
	Select(mailbox string, options *imap.SelectOptions) (*imap.SelectData, error)                       // 选择邮箱
	Create(mailbox string, options *imap.CreateOptions) error                                           // 创建邮箱
	Delete(mailbox string) error                                                                        // 删除邮箱
	Rename(mailbox, newName string) error                                                               // 重命名邮箱
	Subscribe(mailbox string) error                                                                     // 订阅邮箱
	Unsubscribe(mailbox string) error                                                                   // 取消订阅邮箱
	List(w *ListWriter, ref string, patterns []string, options *imap.ListOptions) error                 // 列出邮箱
	Status(mailbox string, options *imap.StatusOptions) (*imap.StatusData, error)                       // 获取邮箱状态
	Append(mailbox string, r imap.LiteralReader, options *imap.AppendOptions) (*imap.AppendData, error) // 追加邮件到邮箱
	Poll(w *UpdateWriter, allowExpunge bool) error                                                      // 获取更新
	Idle(w *UpdateWriter, stop <-chan struct{}) error                                                   // 空闲状态

	// 选择状态
	Unselect() error                                                                                           // 取消选择
	Expunge(w *ExpungeWriter, uids *imap.UIDSet) error                                                         // 清除邮件
	Search(kind NumKind, criteria *imap.SearchCriteria, options *imap.SearchOptions) (*imap.SearchData, error) // 搜索邮件
	Fetch(w *FetchWriter, numSet imap.NumSet, options *imap.FetchOptions) error                                // 获取邮件
	Store(w *FetchWriter, numSet imap.NumSet, flags *imap.StoreFlags, options *imap.StoreOptions) error        // 存储邮件
	Copy(numSet imap.NumSet, dest string) (*imap.CopyData, error)                                              // 复制邮件
}

Session 是一个 IMAP 会话接口。

type SessionIMAP4rev2

type SessionIMAP4rev2 interface {
	Session
	SessionNamespace
	SessionMove
}

SessionIMAP4rev2 是一个支持 IMAP4rev2 的 IMAP 会话。

type SessionMove

type SessionMove interface {
	Session

	// 选择状态
	Move(w *MoveWriter, numSet imap.NumSet, dest string) error // 移动邮件
}

SessionMove 是一个支持 MOVE 的 IMAP 会话。

type SessionNamespace

type SessionNamespace interface {
	Session

	// 认证状态
	Namespace() (*imap.NamespaceData, error) // 获取命名空间
}

SessionNamespace 是一个支持 NAMESPACE 的 IMAP 会话。

type SessionSASL

type SessionSASL interface {
	Session
	AuthenticateMechanisms() []string              // 获取支持的认证机制
	Authenticate(mech string) (sasl.Server, error) // 执行认证
}

SessionSASL 是一个支持其自己 SASL 认证机制的 IMAP 会话。

type SessionTracker

type SessionTracker struct {
	// contains filtered or unexported fields
}

SessionTracker 跟踪 IMAP 客户端的邮箱状态。

func (*SessionTracker) Close

func (t *SessionTracker) Close()

Close 注销会话。

func (*SessionTracker) DecodeSeqNum

func (t *SessionTracker) DecodeSeqNum(seqNum uint32) uint32

DecodeSeqNum 将客户端视图的邮件序列号转换为服务器视图的序列号。

如果从服务器的角度看邮件不存在,则返回零。

func (*SessionTracker) EncodeSeqNum

func (t *SessionTracker) EncodeSeqNum(seqNum uint32) uint32

EncodeSeqNum 将服务器视图的邮件序列号转换为客户端视图的序列号。

如果从客户端的角度看邮件不存在,则返回零。

func (*SessionTracker) Idle

func (t *SessionTracker) Idle(w *UpdateWriter, stop <-chan struct{}) error

Idle 持续写入邮箱更新。

当停止通道关闭时,返回。

Idle 不能从两个独立的 goroutine 同时调用。

func (*SessionTracker) Poll

func (t *SessionTracker) Poll(w *UpdateWriter, allowExpunge bool) error

Poll 从会话中取消排队的邮箱更新。

type SessionUnauthenticate

type SessionUnauthenticate interface {
	Session

	// 认证状态
	Unauthenticate() error // 执行未认证
}

SessionUnauthenticate 是一个支持 UNAUTHENTICATE 的 IMAP 会话。

type UpdateWriter

type UpdateWriter struct {
	// contains filtered or unexported fields
}

UpdateWriter 用于写入状态更新。

func (*UpdateWriter) WriteExpunge

func (w *UpdateWriter) WriteExpunge(seqNum uint32) error

WriteExpunge 写入EXPUNGE响应。

func (*UpdateWriter) WriteMailboxFlags

func (w *UpdateWriter) WriteMailboxFlags(flags []imap.Flag) error

WriteMailboxFlags 写入FLAGS响应。

func (*UpdateWriter) WriteMessageFlags

func (w *UpdateWriter) WriteMessageFlags(seqNum uint32, uid imap.UID, flags []imap.Flag) error

WriteMessageFlags 写入FETCH响应带FLAGS。

func (*UpdateWriter) WriteNumMessages

func (w *UpdateWriter) WriteNumMessages(n uint32) error

WriteNumMessages 写入EXISTS响应。

Directories

Path Synopsis
imapmemserver包实现了一个内存中的IMAP服务器。
imapmemserver包实现了一个内存中的IMAP服务器。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL