Email connector improvements

This commit is contained in:
James 2026-02-04 22:57:30 -05:00
parent eb92f01ef1
commit 7cef0dee97
1 changed files with 28 additions and 3 deletions

View File

@ -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
}