diff --git a/connector_email.go b/connector_email.go index 59fb7eb..9bdfb6b 100644 --- a/connector_email.go +++ b/connector_email.go @@ -3,6 +3,7 @@ package main import ( "bytes" "context" + "crypto/tls" "encoding/base64" "fmt" "log" @@ -55,11 +56,12 @@ func (e *EmailConnector) connect() (*imapclient.Client, error) { var client *imapclient.Client var err error + tlsConfig := &tls.Config{InsecureSkipVerify: true} switch e.config.TLS { case "ssl": - client, err = imapclient.DialTLS(addr, nil) + client, err = imapclient.DialTLS(addr, &imapclient.Options{TLSConfig: tlsConfig}) case "starttls": - client, err = imapclient.DialStartTLS(addr, nil) + client, err = imapclient.DialStartTLS(addr, &imapclient.Options{TLSConfig: tlsConfig}) default: client, err = imapclient.DialInsecure(addr, nil) } @@ -108,10 +110,12 @@ func (e *EmailConnector) FetchSince(since time.Time) ([]UnifiedMessage, error) { } defer client.Close() + // Search all folders including Archive so we can find recently-processed messages folders := e.config.Watch if len(folders) == 0 { folders = []string{"INBOX"} } + folders = appendIfMissing(folders, "Archive", "Trash", "Folders/Shopping") var messages []UnifiedMessage for _, folder := range folders { @@ -271,11 +275,13 @@ func (e *EmailConnector) FetchOne(sourceID string) (*UnifiedMessage, error) { return nil, fmt.Errorf("invalid source ID: %s", sourceID) } - // Try each watched folder + // Try watched folders first, then Archive/Trash/All Mail folders := e.config.Watch if len(folders) == 0 { folders = []string{"INBOX"} } + // Append fallback folders for finding archived/deleted messages + folders = appendIfMissing(folders, "Archive", "Trash", "All Mail", "Folders/Shopping") for _, folder := range folders { _, err := client.Select(folder, nil).Wait() @@ -624,3 +630,22 @@ func (e *EmailConnector) Stop() { e.cancel() } } + +// appendIfMissing adds folders to the slice if not already present +func appendIfMissing(slice []string, items ...string) []string { + result := make([]string, len(slice)) + copy(result, slice) + for _, item := range items { + found := false + for _, s := range result { + if s == item { + found = true + break + } + } + if !found { + result = append(result, item) + } + } + return result +}