package main import ( "crypto/tls" "io" "log" "log/slog" "os" "github.com/emersion/go-imap/v2" "github.com/emersion/go-imap/v2/imapclient" "github.com/emersion/go-message/mail" ) func main() { logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) // err := godotenv.Load() // if err != nil { // logger.Error("Error Loading Environment variables! ", "error", err) // } // logger.Info("Setting up DB") // db := utils.SetupDatabase(os.Getenv("DB_DSN"), logger) // logger.Info("Done setting up DB") // appCtx := utils.Application{Logger: logger, DB: db} // Register to jobs. // auth := smtp.PlainAuth("", "me@kocoder.xyz", "&,25,upMeddeEnTYPTifaccEptIonaAlErGiE", "mx.kocoder.xyz") // logger.Info("Before sending Email") // err := smtp.SendMail("mx.kocoder.xyz:587", auth, "me@kocoder.xyz", []string{"oss@kocoder.xyz"}, []byte( // "From: Konstantin Hintermayer \r\n"+ // "To: oss@kocoder.xyz\r\n"+ // "Subject: discount Gophers!\r\n"+ // "\r\n"+ // "This is the email body lel.\r\n")) // if err != nil { // logger.Error("Unable to send EMail", "err", err) // } else { // logger.Info("Successfully sent Email") // } c, err := imapclient.DialTLS("10.1.0.2:993", &imapclient.Options{TLSConfig: &tls.Config{ServerName: "mx.kocoder.xyz"}}) if err != nil { log.Fatalf("failed to dial IMAP server: %v", err) } defer c.Close() if err := c.Login("me@kocoder.xyz", "&,25,upMeddeEnTYPTifaccEptIonaAlErGiE").Wait(); err != nil { log.Fatalf("failed to login: %v", err) } log.Print("Connected") mailboxes, err := c.List("", "%", nil).Collect() if err != nil { log.Fatalf("failed to list mailboxes: %v", err) } log.Printf("Found %v mailboxes", len(mailboxes)) for _, mbox := range mailboxes { log.Printf(" - %v", mbox.Mailbox) } selectedMbox, err := c.Select("INBOX", nil).Wait() if err != nil { log.Fatalf("failed to select INBOX: %v", err) } log.Printf("INBOX contains %v messages", selectedMbox.NumMessages) i := 0 for { // Send a FETCH command to fetch the message body seqSet := imap.SeqSetNum(uint32(i)) bodySection := &imap.FetchItemBodySection{} fetchOptions := &imap.FetchOptions{ BodySection: []*imap.FetchItemBodySection{bodySection}, } fetchCmd := c.Fetch(seqSet, fetchOptions) defer fetchCmd.Close() msg := fetchCmd.Next() for msg != nil { // Find the body section in the response var bodySectionData imapclient.FetchItemDataBodySection ok := false for { item := msg.Next() if item == nil { break } bodySectionData, ok = item.(imapclient.FetchItemDataBodySection) if ok { break } } if !ok { log.Fatalf("FETCH command did not return body section") } // Read the message via the go-message library mr, err := mail.CreateReader(bodySectionData.Literal) if err != nil { log.Fatalf("failed to create mail reader: %v", err) } // Print a few header fields h := mr.Header if date, err := h.Date(); err != nil { log.Printf("failed to parse Date header field: %v", err) } else { log.Printf("Date: %v", date) } if to, err := h.AddressList("To"); err != nil { log.Printf("failed to parse To header field: %v", err) } else { log.Printf("To: %v", to) } if subject, err := h.Text("Subject"); err != nil { log.Printf("failed to parse Subject header field: %v", err) } else { log.Printf("Subject: %v", subject) } if err := fetchCmd.Close(); err != nil { logger.Error("FETCH command failed", "err", err) } // Process the message's parts for { p, err := mr.NextPart() if err == io.EOF { break } else if err != nil { log.Fatalf("failed to read message part: %v", err) } switch h := p.Header.(type) { case *mail.InlineHeader: // This is the message's text (can be plain-text or HTML) b, _ := io.ReadAll(p.Body) log.Printf("Inline text: %v", string(b)) case *mail.AttachmentHeader: // This is an attachment filename, _ := h.Filename() log.Printf("Attachment: %v", filename) } } msg = fetchCmd.Next() } i++ if i > 10 { break } } }