Files
vt/integration/mailing/imap_integration.go
2026-02-19 09:16:45 +01:00

93 lines
2.1 KiB
Go

package mailing
import (
"context"
"fmt"
"os"
"strconv"
"time"
"git.kocoder.xyz/kocoded/vt/fx/interfaces"
imap "github.com/BrianLeishman/go-imap"
)
type imapIntegration struct {
id *imap.Dialer
}
// Invoke implements interfaces.BasicIntegration.
func (i *imapIntegration) Invoke() {
fmt.Println("Invoked!")
}
// OnStart implements interfaces.BasicIntegration.
func (i *imapIntegration) OnStart(ctx context.Context) error {
fmt.Println("Integration IMAP started")
return nil
}
// OnStop implements interfaces.BasicIntegration.
func (i *imapIntegration) OnStop(ctx context.Context) error {
fmt.Println("Integration IMAP stopped")
return nil
}
func NewImapIntegration() interfaces.BasicIntegration {
fmt.Println("New Imap Integration")
imap.Verbose = true
imap.RetryCount = 1
imap.DialTimeout = 10 * time.Second
imap.CommandTimeout = 30 * time.Second
port, err := strconv.Atoi(os.Getenv("IMAP_INTEGRATION_PORT"))
if err != nil {
panic(err)
}
m, err := imap.New(os.Getenv("IMAP_INTEGRATION_USER"), os.Getenv("IMAP_INTEGRATION_PASS"), os.Getenv("IMAP_INTEGRATION_HOST"), port)
if err != nil {
panic(err)
}
if err := m.SelectFolder("INBOX"); err != nil {
panic("Failed to select inbox")
}
uids, err := m.GetUIDs("UNSEEN")
if err != nil {
panic("Search")
}
emails, err := m.GetEmails(uids...)
if err != nil {
panic("Getting EMails")
}
for uid, email := range emails {
fmt.Printf("\n--- Email UID %d ---\n", uid)
fmt.Printf("From: %s\n", email.From)
fmt.Printf("To: %s\n", email.To)
fmt.Printf("Subject: %s\n", email.Subject)
fmt.Printf("Date: %s\n", email.Sent.Format("Jan 2, 2006 3:04 PM"))
fmt.Printf("Size: %.1f KB\n", float64(email.Size)/1024)
if len(email.Text) > 100 {
fmt.Printf("Preview: %.100s...\n", email.Text)
} else if len(email.Text) > 0 {
fmt.Printf("Preview: %s\n", email.Text)
}
if len(email.Attachments) > 0 {
fmt.Printf("Attachments: %d\n", len(email.Attachments))
for _, att := range email.Attachments {
fmt.Printf(" - %s (%.1f KB)\n", att.Name, float64(len(att.Content))/1024)
}
}
}
return &imapIntegration{id: m}
}