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
52 lines
1.3 KiB
Go
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
|
|
}
|