Sample code for 30+ languages & platforms
Go

Copy Email from one IMAP Account to Another

See more IMAP Examples

Demonstrates how to copy the email in a mailbox from one account to another.

Chilkat Go Downloads

Go
    success := false

    imapSrc := chilkat.NewImap()

    // This example requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    // Connect to our source IMAP server.
    imapSrc.SetSsl(true)
    imapSrc.SetPort(993)
    success = imapSrc.Connect("MY-IMAP-DOMAIN")
    if success != true {
        fmt.Println(imapSrc.LastErrorText())
        imapSrc.DisposeImap()
        return
    }

    // Login to the source IMAP server
    success = imapSrc.Login("MY-IMAP-LOGIN","MY-IMAP-PASSWORD")
    if success != true {
        fmt.Println(imapSrc.LastErrorText())
        imapSrc.DisposeImap()
        return
    }

    imapDest := chilkat.NewImap()

    // Connect to our destination IMAP server.
    imapDest.SetSsl(true)
    imapDest.SetPort(993)
    success = imapDest.Connect("MY-IMAP-DOMAIN2")
    if success != true {
        fmt.Println(imapDest.LastErrorText())
        imapSrc.DisposeImap()
        imapDest.DisposeImap()
        return
    }

    // Login to the destination IMAP server
    success = imapDest.Login("MY-IMAP-LOGIN2","MY-IMAP-PASSWORD2")
    if success != true {
        fmt.Println(imapDest.LastErrorText())
        imapSrc.DisposeImap()
        imapDest.DisposeImap()
        return
    }

    // Select a source IMAP mailbox on the source IMAP server
    success = imapSrc.SelectMailbox("Inbox")
    if success != true {
        fmt.Println(imapSrc.LastErrorText())
        imapSrc.DisposeImap()
        imapDest.DisposeImap()
        return
    }

    fetchUids := true

    // Get the set of UIDs for all emails on the source server.
    mset := imapSrc.Search("ALL",fetchUids)
    if imapSrc.LastMethodSuccess() != true {
        fmt.Println(imapSrc.LastErrorText())
        imapSrc.DisposeImap()
        imapDest.DisposeImap()
        return
    }

    // Load the complete set of UIDs that were previously copied.
    // We dont' want to copy any of these to the destination.
    fac := chilkat.NewFileAccess()
    msetAlreadyCopied := chilkat.NewMessageSet()
    strMsgSet := fac.ReadEntireTextFile("qa_cache/saAlreadyLoaded.txt","utf-8")
    if fac.LastMethodSuccess() == true {
        msetAlreadyCopied.FromCompactString(*strMsgSet)
    }

    numUids := mset.Count()
    sbFlags := chilkat.NewStringBuilder()

    i := 0
    for i < numUids {

        // If this UID was not already copied...
        uid := mset.GetId(i)
        if !msetAlreadyCopied.ContainsId(uid) {

            fmt.Println("copying ", uid, "...")

            // Get the flags.
            flags := imapSrc.FetchFlags(uid,true)
            if imapSrc.LastMethodSuccess() == false {
                fmt.Println(imapSrc.LastErrorText())
                imapSrc.DisposeImap()
                imapDest.DisposeImap()
                fac.DisposeFileAccess()
                msetAlreadyCopied.DisposeMessageSet()
                sbFlags.DisposeStringBuilder()
                return
            }

            sbFlags.SetString(*flags)

            // Get the MIME of this email from the source.
            mimeStr := imapSrc.FetchSingleAsMime(uid,true)
            if imapSrc.LastMethodSuccess() == false {
                fmt.Println(imapSrc.LastErrorText())
                imapSrc.DisposeImap()
                imapDest.DisposeImap()
                fac.DisposeFileAccess()
                msetAlreadyCopied.DisposeMessageSet()
                sbFlags.DisposeStringBuilder()
                return
            }

            seen := sbFlags.Contains("\\Seen",false)
            flagged := sbFlags.Contains("\\Flagged",false)
            answered := sbFlags.Contains("\\Answered",false)
            draft := sbFlags.Contains("\\Draft",false)

            success = imapDest.AppendMimeWithFlags("Inbox",*mimeStr,seen,flagged,answered,draft)
            if success != true {
                fmt.Println(imapDest.LastErrorText())
                imapSrc.DisposeImap()
                imapDest.DisposeImap()
                fac.DisposeFileAccess()
                msetAlreadyCopied.DisposeMessageSet()
                sbFlags.DisposeStringBuilder()
                return
            }

            // Update msetAlreadyCopied with the uid just copied.
            msetAlreadyCopied.InsertId(uid)

            // Save at every iteration just in case there's a failure..
            strMsgSet = msetAlreadyCopied.ToCompactString()
            fac.WriteEntireTextFile("qa_cache/saAlreadyLoaded.txt",*strMsgSet,"utf-8",false)
        }

        i = i + 1
    }

    mset.DisposeMessageSet()

    // Disconnect from the IMAP servers.
    success = imapSrc.Disconnect()
    success = imapDest.Disconnect()

    imapSrc.DisposeImap()
    imapDest.DisposeImap()
    fac.DisposeFileAccess()
    msetAlreadyCopied.DisposeMessageSet()
    sbFlags.DisposeStringBuilder()