Sample code for 30+ languages & platforms
Lianja

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 Lianja Downloads

Lianja
llSuccess = .F.

loImapSrc = createobject("CkImap")

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

// Connect to our source IMAP server.
loImapSrc.Ssl = .T.
loImapSrc.Port = 993
llSuccess = loImapSrc.Connect("MY-IMAP-DOMAIN")
if (llSuccess <> .T.) then
    ? loImapSrc.LastErrorText
    release loImapSrc
    return
endif

// Login to the source IMAP server
llSuccess = loImapSrc.Login("MY-IMAP-LOGIN","MY-IMAP-PASSWORD")
if (llSuccess <> .T.) then
    ? loImapSrc.LastErrorText
    release loImapSrc
    return
endif

loImapDest = createobject("CkImap")

// Connect to our destination IMAP server.
loImapDest.Ssl = .T.
loImapDest.Port = 993
llSuccess = loImapDest.Connect("MY-IMAP-DOMAIN2")
if (llSuccess <> .T.) then
    ? loImapDest.LastErrorText
    release loImapSrc
    release loImapDest
    return
endif

// Login to the destination IMAP server
llSuccess = loImapDest.Login("MY-IMAP-LOGIN2","MY-IMAP-PASSWORD2")
if (llSuccess <> .T.) then
    ? loImapDest.LastErrorText
    release loImapSrc
    release loImapDest
    return
endif

// Select a source IMAP mailbox on the source IMAP server
llSuccess = loImapSrc.SelectMailbox("Inbox")
if (llSuccess <> .T.) then
    ? loImapSrc.LastErrorText
    release loImapSrc
    release loImapDest
    return
endif

llFetchUids = .T.

// Get the set of UIDs for all emails on the source server.
loMset = loImapSrc.Search("ALL",llFetchUids)
if (loImapSrc.LastMethodSuccess <> .T.) then
    ? loImapSrc.LastErrorText
    release loImapSrc
    release loImapDest
    return
endif

// Load the complete set of UIDs that were previously copied.
// We dont' want to copy any of these to the destination.
loFac = createobject("CkFileAccess")
loMsetAlreadyCopied = createobject("CkMessageSet")
lcStrMsgSet = loFac.ReadEntireTextFile("qa_cache/saAlreadyLoaded.txt","utf-8")
if (loFac.LastMethodSuccess = .T.) then
    loMsetAlreadyCopied.FromCompactString(lcStrMsgSet)
endif

lnNumUids = loMset.Count
loSbFlags = createobject("CkStringBuilder")

i = 0
do while i < lnNumUids

    // If this UID was not already copied...
    lnUid = loMset.GetId(i)
    if (not loMsetAlreadyCopied.ContainsId(lnUid)) then

        ? "copying " + str(lnUid) + "..."

        // Get the flags.
        lcFlags = loImapSrc.FetchFlags(lnUid,.T.)
        if (loImapSrc.LastMethodSuccess = .F.) then
            ? loImapSrc.LastErrorText
            release loImapSrc
            release loImapDest
            release loFac
            release loMsetAlreadyCopied
            release loSbFlags
            return
        endif

        loSbFlags.SetString(lcFlags)

        // Get the MIME of this email from the source.
        lcMimeStr = loImapSrc.FetchSingleAsMime(lnUid,.T.)
        if (loImapSrc.LastMethodSuccess = .F.) then
            ? loImapSrc.LastErrorText
            release loImapSrc
            release loImapDest
            release loFac
            release loMsetAlreadyCopied
            release loSbFlags
            return
        endif

        llSeen = loSbFlags.Contains("\\Seen",.F.)
        llFlagged = loSbFlags.Contains("\\Flagged",.F.)
        llAnswered = loSbFlags.Contains("\\Answered",.F.)
        llDraft = loSbFlags.Contains("\\Draft",.F.)

        llSuccess = loImapDest.AppendMimeWithFlags("Inbox",lcMimeStr,llSeen,llFlagged,llAnswered,llDraft)
        if (llSuccess <> .T.) then
            ? loImapDest.LastErrorText
            release loImapSrc
            release loImapDest
            release loFac
            release loMsetAlreadyCopied
            release loSbFlags
            return
        endif

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

        // Save at every iteration just in case there's a failure..
        lcStrMsgSet = loMsetAlreadyCopied.ToCompactString()
        loFac.WriteEntireTextFile("qa_cache/saAlreadyLoaded.txt",lcStrMsgSet,"utf-8",.F.)
    endif

    i = i + 1
enddo
release loMset

// Disconnect from the IMAP servers.
llSuccess = loImapSrc.Disconnect()
llSuccess = loImapDest.Disconnect()


release loImapSrc
release loImapDest
release loFac
release loMsetAlreadyCopied
release loSbFlags