Email connector improvements
This commit is contained in:
parent
eb92f01ef1
commit
7cef0dee97
|
|
@ -3,6 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
|
"crypto/tls"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
|
@ -55,11 +56,12 @@ func (e *EmailConnector) connect() (*imapclient.Client, error) {
|
||||||
var client *imapclient.Client
|
var client *imapclient.Client
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
|
tlsConfig := &tls.Config{InsecureSkipVerify: true}
|
||||||
switch e.config.TLS {
|
switch e.config.TLS {
|
||||||
case "ssl":
|
case "ssl":
|
||||||
client, err = imapclient.DialTLS(addr, nil)
|
client, err = imapclient.DialTLS(addr, &imapclient.Options{TLSConfig: tlsConfig})
|
||||||
case "starttls":
|
case "starttls":
|
||||||
client, err = imapclient.DialStartTLS(addr, nil)
|
client, err = imapclient.DialStartTLS(addr, &imapclient.Options{TLSConfig: tlsConfig})
|
||||||
default:
|
default:
|
||||||
client, err = imapclient.DialInsecure(addr, nil)
|
client, err = imapclient.DialInsecure(addr, nil)
|
||||||
}
|
}
|
||||||
|
|
@ -108,10 +110,12 @@ func (e *EmailConnector) FetchSince(since time.Time) ([]UnifiedMessage, error) {
|
||||||
}
|
}
|
||||||
defer client.Close()
|
defer client.Close()
|
||||||
|
|
||||||
|
// Search all folders including Archive so we can find recently-processed messages
|
||||||
folders := e.config.Watch
|
folders := e.config.Watch
|
||||||
if len(folders) == 0 {
|
if len(folders) == 0 {
|
||||||
folders = []string{"INBOX"}
|
folders = []string{"INBOX"}
|
||||||
}
|
}
|
||||||
|
folders = appendIfMissing(folders, "Archive", "Trash", "Folders/Shopping")
|
||||||
|
|
||||||
var messages []UnifiedMessage
|
var messages []UnifiedMessage
|
||||||
for _, folder := range folders {
|
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)
|
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
|
folders := e.config.Watch
|
||||||
if len(folders) == 0 {
|
if len(folders) == 0 {
|
||||||
folders = []string{"INBOX"}
|
folders = []string{"INBOX"}
|
||||||
}
|
}
|
||||||
|
// Append fallback folders for finding archived/deleted messages
|
||||||
|
folders = appendIfMissing(folders, "Archive", "Trash", "All Mail", "Folders/Shopping")
|
||||||
|
|
||||||
for _, folder := range folders {
|
for _, folder := range folders {
|
||||||
_, err := client.Select(folder, nil).Wait()
|
_, err := client.Select(folder, nil).Wait()
|
||||||
|
|
@ -624,3 +630,22 @@ func (e *EmailConnector) Stop() {
|
||||||
e.cancel()
|
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
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue