MCPcopy
hub / github.com/emersion/go-imap

github.com/emersion/go-imap @v1.2.1 sqlite

repository ↗ · DeepWiki ↗ · release v1.2.1 ↗
930 symbols 3,371 edges 116 files 305 documented · 33%
README

go-imap

godocs.io builds.sr.ht status

An IMAP4rev1 library written in Go. It can be used to build a client and/or a server.

Usage

Client godocs.io

package main

import (
    "log"

    "github.com/emersion/go-imap/client"
    "github.com/emersion/go-imap"
)

func main() {
    log.Println("Connecting to server...")

    // Connect to server
    c, err := client.DialTLS("mail.example.org:993", nil)
    if err != nil {
        log.Fatal(err)
    }
    log.Println("Connected")

    // Don't forget to logout
    defer c.Logout()

    // Login
    if err := c.Login("username", "password"); err != nil {
        log.Fatal(err)
    }
    log.Println("Logged in")

    // List mailboxes
    mailboxes := make(chan *imap.MailboxInfo, 10)
    done := make(chan error, 1)
    go func () {
        done <- c.List("", "*", mailboxes)
    }()

    log.Println("Mailboxes:")
    for m := range mailboxes {
        log.Println("* " + m.Name)
    }

    if err := <-done; err != nil {
        log.Fatal(err)
    }

    // Select INBOX
    mbox, err := c.Select("INBOX", false)
    if err != nil {
        log.Fatal(err)
    }
    log.Println("Flags for INBOX:", mbox.Flags)

    // Get the last 4 messages
    from := uint32(1)
    to := mbox.Messages
    if mbox.Messages > 3 {
        // We're using unsigned integers here, only subtract if the result is > 0
        from = mbox.Messages - 3
    }
    seqset := new(imap.SeqSet)
    seqset.AddRange(from, to)

    messages := make(chan *imap.Message, 10)
    done = make(chan error, 1)
    go func() {
        done <- c.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope}, messages)
    }()

    log.Println("Last 4 messages:")
    for msg := range messages {
        log.Println("* " + msg.Envelope.Subject)
    }

    if err := <-done; err != nil {
        log.Fatal(err)
    }

    log.Println("Done!")
}

Server godocs.io

package main

import (
    "log"

    "github.com/emersion/go-imap/server"
    "github.com/emersion/go-imap/backend/memory"
)

func main() {
    // Create a memory backend
    be := memory.New()

    // Create a new server
    s := server.New(be)
    s.Addr = ":1143"
    // Since we will use this server for testing only, we can allow plain text
    // authentication over unencrypted connections
    s.AllowInsecureAuth = true

    log.Println("Starting IMAP server at localhost:1143")
    if err := s.ListenAndServe(); err != nil {
        log.Fatal(err)
    }
}

You can now use telnet localhost 1143 to manually connect to the server.

Extensions

Support for several IMAP extensions is included in go-imap itself. This includes:

Support for other extensions is provided via separate packages. See below.

Extending go-imap

Extensions

Commands defined in IMAP extensions are available in other packages. See the wiki to learn how to use them.

Server backends

Related projects

  • go-message - parsing and formatting MIME and mail messages
  • go-msgauth - handle DKIM, DMARC and Authentication-Results
  • go-pgpmail - decrypting and encrypting mails with OpenPGP
  • go-sasl - sending and receiving SASL authentications
  • go-smtp - building SMTP clients and servers

License

MIT

Extension points exported contracts — how you extend this code

Commander (Interface)
A value that can be converted to a command. [30 implementers]
command.go
Handler (Interface)
Handler handles responses. [36 implementers]
responses/responses.go
Handler (Interface)
A command handler. [36 implementers]
server/server.go
UidHandler (Interface)
A command handler that supports UIDs. [5 implementers]
server/cmd_selected.go
Parser (Interface)
(no doc) [34 implementers]
read.go
WriterTo (Interface)
(no doc) [13 implementers]
write.go
Resp (Interface)
Resp is an IMAP response. It is either a *DataResp, a *ContinuationReq or a *StatusResp. [4 implementers]
response.go
Backend (Interface)
Backend is an IMAP server backend. A backend operation always deals with users. [2 implementers]
backend/backend.go

Core symbols most depended-on inside this repo

Error
called by 222
seqset.go
Close
called by 217
server/conn.go
String
called by 84
seqset.go
Println
called by 35
logger.go
Err
called by 33
status.go
Add
called by 28
seqset.go
State
called by 26
client/client.go
Context
called by 26
server/conn.go

Shape

Method 423
Function 334
Struct 122
Interface 30
TypeAlias 16
FuncType 5

Languages

Go100%

Modules by API surface

message.go42 symbols
server/conn.go38 symbols
client/client.go38 symbols
server/cmd_auth_test.go32 symbols
server/cmd_selected_test.go30 symbols
server/cmd_selected.go30 symbols
conn.go27 symbols
write.go26 symbols
server/server.go25 symbols
read.go25 symbols
message_test.go25 symbols
write_test.go24 symbols

Used by 3 indexed graphs manifest dependencies, hub-wide

Dependencies from manifests, versioned

github.com/emersion/go-messagev0.15.0 · 1×
github.com/emersion/go-saslv0.0.0-2020050920344 · 1×
golang.org/x/textv0.3.7 · 1×

For agents

$ claude mcp add go-imap \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact