imap/README.md

174 lines
4.0 KiB
Markdown
Raw Permalink Normal View History

# IMAP Client Package
[![Go Reference](https://pkg.go.dev/badge/git.b0zal.io/H0llyW00dzZ/imap.svg)](https://pkg.go.dev/git.b0zal.io/H0llyW00dzZ/imap) [![Go Report Card](https://goreportcard.com/badge/git.b0zal.io/H0llyW00dzZ/imap)](https://goreportcard.com/report/git.b0zal.io/H0llyW00dzZ/imap)
This package provides a simple interface to manage IMAP connections for single or multiple users. It allows you to connect to an IMAP server, list messages, export messages, and manage multiple user accounts.
## Features
- Connect and disconnect from an IMAP server
- List messages in a specified mailbox
- Export messages to various formats
- Manage multiple users with separate IMAP clients
## Installation
To install the package, use `go get`:
```bash
go get git.b0zal.io/H0llyW00dzZ/imap
```
## Usage
### Single User
```go
package main
import (
"fmt"
"log"
"git.b0zal.io/H0llyW00dzZ/imap/client"
)
func main() {
config := &client.Config{
Username: "user@example.com",
Password: "password",
Server: "imap.example.com:993",
InsecureSkipVerify: true,
}
imapClient := client.NewIMAP(config)
err := imapClient.Connect()
if err != nil {
log.Fatalf("Failed to connect: %v", err)
}
defer imapClient.Disconnect()
messageConfig := client.MessageConfig{
GrabID: true,
GrabFrom: true,
GrabSubject: true,
GrabBody: true,
}
messages, err := imapClient.ListMessages("INBOX", 10, messageConfig)
if err != nil {
log.Fatalf("Failed to list messages: %v", err)
}
for _, msg := range messages {
fmt.Printf("ID: %s, From: %v, Subject: %s, Body: %s\n", msg[client.KeyID], msg[client.KeyFrom], msg[client.KeySubject], msg[client.KeyBody])
}
}
```
### Multiple Users
```go
package main
import (
"fmt"
"log"
"git.b0zal.io/H0llyW00dzZ/imap/client"
)
func main() {
multiUserIMAP := client.NewMultiUserIMAP()
multiUserIMAP.AddUser("user1@example.com", "password1", "imap.example.com:993", true)
multiUserIMAP.AddUser("user2@example.com", "password2", "imap.example.com:993", true)
err := multiUserIMAP.ConnectUser("user1@example.com")
if err != nil {
log.Fatalf("Failed to connect user1: %v", err)
}
defer multiUserIMAP.DisconnectUser("user1@example.com")
messageConfig := client.MessageConfig{
GrabID: true,
GrabFrom: true,
GrabSubject: true,
GrabBody: true,
}
messages, err := multiUserIMAP.ListUserMessages("user1@example.com", "INBOX", 10, messageConfig)
if err != nil {
log.Fatalf("Failed to list messages for user1: %v", err)
}
for _, msg := range messages {
fmt.Printf("ID: %s, From: %v, Subject: %s, Body: %s\n", msg[client.KeyID], msg[client.KeyFrom], msg[client.KeySubject], msg[client.KeyBody])
}
}
```
### Exporting Messages
```go
package main
import (
"log"
"os"
"git.b0zal.io/H0llyW00dzZ/imap/client"
"git.b0zal.io/H0llyW00dzZ/imap/export"
)
func main() {
config := &client.Config{
Username: "user@example.com",
Password: "password",
Server: "imap.example.com:993",
InsecureSkipVerify: true,
}
imapClient := client.NewIMAP(config)
err := imapClient.Connect()
if err != nil {
log.Fatalf("Failed to connect: %v", err)
}
defer imapClient.Disconnect()
messageConfig := client.MessageConfig{
GrabID: true,
GrabFrom: true,
GrabSubject: true,
GrabBody: true,
}
file, err := os.Create("messages.json")
if err != nil {
log.Fatalf("Failed to create file: %v", err)
}
defer file.Close()
exporter := &export.JSONExporter{Encoder: export.DefaultJSONEncoder}
err = imapClient.ExportMessagesTo(file, exporter, "INBOX", 10, messageConfig)
if err != nil {
log.Fatalf("Failed to export messages: %v", err)
}
}
```
## TODO
- Implement functionality to send emails.
- Add support for folder management (create, delete, rename).
- Enhance error handling and logging.
- Support for message search and filtering.
- Implement message deletion and flagging.
- Add more tests for edge cases and concurrent access.
## License
This project is licensed under the BSD 3-Clause License. See the [LICENSE](LICENSE) file for details.