Go
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
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()