Files
imap-copier/internal/imapx/account.go
T
vasyansk 6bf3a6c4ca Add body read timeout recovery to IMAP client
Introduce Client wrapper with socket deadline support
Add reconnection logic for body read timeouts
Implement test cases for underflow scenarios
Update orchestrator to handle reconnections
2026-07-21 05:29:35 +07:00

52 lines
1.3 KiB
Go

package imapx
import (
"context"
"github.com/emersion/go-imap/v2"
)
// FolderMessageCount opens a folder read-only (EXAMINE) and returns how many
// messages it holds — used to plan an accurate overall progress total before
// copying begins. It does not fetch any message bodies.
func FolderMessageCount(c *Client, folder string) (int64, error) {
sel, err := c.Select(folder, &imap.SelectOptions{ReadOnly: true}).Wait()
if err != nil {
return 0, err
}
return int64(sel.NumMessages), nil
}
// ListFolders returns the mailbox names visible on an already-connected, logged-in client.
func ListFolders(c *Client) ([]string, error) {
mboxes, err := c.List("", "*", nil).Collect()
if err != nil {
return nil, err
}
names := make([]string, 0, len(mboxes))
for _, m := range mboxes {
names = append(names, m.Mailbox)
}
return names, nil
}
func TestLogin(ctx context.Context, ep Endpoint, login, pass string) ([]string, error) {
c, err := Connect(ctx, ep)
if err != nil {
return nil, err
}
defer func() { _ = c.Logout().Wait() }()
if err := c.Login(login, pass).Wait(); err != nil {
return nil, err
}
mboxes, err := c.List("", "*", nil).Collect()
if err != nil {
return nil, err
}
names := make([]string, 0, len(mboxes))
for _, m := range mboxes {
names = append(names, m.Mailbox)
}
return names, nil
}