Skip to content

pruthvirajsinh/go-Simap

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

go-Simap

A simple Imap client which --Fetches,Copies,Moves emails from mailboxes. --Creates,Deletes Mboxes/Folders on the Server. --Marks,Unmarks Imap Flags from the mails. --Can Skip Certificate Verification of the IMAP Server. (Good for IMAP servers using SelfSigned Cerificates.)

Also outputs JSON of emails stored on Imap server. It is based on https://github.com/sqs/go-synco

Following is a command line based example to Show usage of the package.

package main

import (
	"flag"
	"fmt"
	"github.com/pruthvirajsinh/go-Simap/Simap"
	"os"
	"strconv"
)

var query = flag.String("query", "after:2012/09/12", "query to limit fetch")
var mbox = flag.String("mbox", "inbox", "name of mail box/folder from which you want to get mail")
var destBox = flag.String("dbox", "", "name of mail box/folder where you want to move mail")
var jobSize = flag.Int("jobsize", 2, "Number of Emails to be processed at a time")
var move = flag.Bool("move", false, "Weateher to move or copy the mails while dbox is given")
var del = flag.Bool("delete", false, "Just Delete the fetched mails.Just to check Delete Functionality.")
var skipCerti = flag.Bool("skipCerti", false, "If your IMAP server uses self signed certi then make this true to skip Certification verification.")
var imapFlag = flag.String("imapflag", "", "Flag the emails")

func usage() {
	fmt.Fprintf(os.Stderr, "usage: main [server] [port] [username] [password]\n")
	flag.PrintDefaults()
	os.Exit(2)
}

//Example
//To Copy all the Read mails since 1st,April 2014 fom inbox to processed.
//./main --skipCerti=false --query="SINCE 01-APR-2014 SEEN" --mbox=inbox --dbox=processed imap.gmail.com 993 user@gmail.com supersecretpassword

func main() {
	flag.Usage = usage
	flag.Parse()

	args := flag.Args()
	if len(args) != 4 {
		usage()
	}
	portI, _ := strconv.Atoi(args[1])
	port := uint16(portI)
	server := &Simap.IMAPServer{args[0], port}
	acct := &Simap.IMAPAccount{args[2], args[3], server}

	mails, err := Simap.GetEMails(acct, *query, *mbox, *jobSize, *skipCerti)
	if err != nil {
		fmt.Println("Error while Getting mails ", err)
		return
	}
	var uids []uint32
	fmt.Println("Fetched Mails ", len(mails))
	fmt.Println("UID		|	From		|	To		|		Subject		|Body	| HTMLBODY	|GPGBody")
	for _, msg := range mails {
		//PRocess Emails here
		errP := processEmail(msg)
		if errP != nil {
			continue
		}
		//If successfull then append them to be moved to processed
		uids = append(uids, msg.Imap_uid)
	}
	if *imapFlag != "" {
		err = Simap.MarkEmails(acct, *mbox, *imapFlag, uids, *jobSize, *skipCerti)
		if err != nil {
			fmt.Println("Main : Error while Marking ", err)
		}
	}

	if *del == true {
		err = Simap.DeleteEmails(acct, *mbox, uids, *jobSize, *skipCerti)
		if err != nil {
			fmt.Println("Main : Error while Deleting ", err)
		}
		return

	}

	if *destBox != "" {
		if *move == true {
			err = Simap.MoveEmails(acct, *mbox, *destBox, uids, *jobSize, *skipCerti)
			if err != nil {
				fmt.Println("Eror while moving ", err)
			}
		} else {
			err = Simap.CopyEmails(acct, *mbox, *destBox, uids, *jobSize, *skipCerti)
			if err != nil {
				fmt.Println("Eror while Copying ", err)
			}
		}
	}

}

func processEmail(msg Simap.MsgData) (err error) {
	fmt.Println("[" + strconv.Itoa(int(msg.Imap_uid)) + "]  |  " + msg.From + "  |  " + msg.To + "  |  " + msg.Subject + "  |  " +
		msg.Body + " | " + msg.HtmlBody + " | " + msg.GpgBody)
	return
}

About

A simple IMAP client which fetches,copies,moves emails from mailboxes.It can also be used with self Signed IMAP Servers.Also has other widely used functionalities.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages