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