Skip to content

ligadous/go-imap

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-imap

GoDoc Build Status codecov stability-unstable

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

go get github.com/emersion/go-imap

Why?

Other IMAP implementations in Go:

Implemented commands

This package implements all commands specified in the RFC.

Command Client Client tests Server Server tests
CAPABILITY
NOOP
LOGOUT
AUTHENTICATE
LOGIN
STARTTLS
SELECT
EXAMINE
CREATE
DELETE
RENAME
SUBSCRIBE
UNSUBSCRIBE
LIST
LSUB
STATUS
APPEND
CHECK
CLOSE
EXPUNGE
SEARCH
FETCH
STORE
COPY
UID

IMAP extensions

Commands defined in IMAP extensions are available in other packages.

Usage

Client

package main

import (
	"log"

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

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)
	go (func () {
		err = c.List("", "%", mailboxes)
	})()

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

	if 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
	seqset, _ := imap.NewSeqSet("")
	seqset.AddRange(mbox.Messages - 3, mbox.Messages)

	messages := make(chan *imap.Message, 4)
	err = c.Fetch(seqset, []string{"ENVELOPE"}, messages)
	if err != nil {
		log.Fatal(err)
	}

	for msg := range messages {
		log.Println(msg.Envelope.Subject)
	}

	log.Println("Done!")
}

Server

package main

import (
	"log"

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

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

	// Create a new server
	s, err := server.Listen(":3000", bkd)
	if err != nil {
		log.Fatal(err)
	}

	// Since we will use this server for testing only, we can allow plain text
	// authentication over unencrypted connections
	s.AllowInsecureAuth = true

	log.Println("Server listening at", s.Addr())

	// Do something else to keep the server alive
	select {}
}

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

License

MIT

About

An IMAP library written in Go

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 100.0%