C
C
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 C Downloads
#include <C_CkImap.h>
#include <C_CkMessageSet.h>
#include <C_CkFileAccess.h>
#include <C_CkStringBuilder.h>
void ChilkatSample(void)
{
BOOL success;
HCkImap imapSrc;
HCkImap imapDest;
BOOL fetchUids;
HCkMessageSet mset;
HCkFileAccess fac;
HCkMessageSet msetAlreadyCopied;
const char *strMsgSet;
int numUids;
HCkStringBuilder sbFlags;
int i;
int uid;
const char *flags;
const char *mimeStr;
BOOL seen;
BOOL flagged;
BOOL answered;
BOOL draft;
success = FALSE;
imapSrc = CkImap_Create();
// This example requires the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
// Connect to our source IMAP server.
CkImap_putSsl(imapSrc,TRUE);
CkImap_putPort(imapSrc,993);
success = CkImap_Connect(imapSrc,"MY-IMAP-DOMAIN");
if (success != TRUE) {
printf("%s\n",CkImap_lastErrorText(imapSrc));
CkImap_Dispose(imapSrc);
return;
}
// Login to the source IMAP server
success = CkImap_Login(imapSrc,"MY-IMAP-LOGIN","MY-IMAP-PASSWORD");
if (success != TRUE) {
printf("%s\n",CkImap_lastErrorText(imapSrc));
CkImap_Dispose(imapSrc);
return;
}
imapDest = CkImap_Create();
// Connect to our destination IMAP server.
CkImap_putSsl(imapDest,TRUE);
CkImap_putPort(imapDest,993);
success = CkImap_Connect(imapDest,"MY-IMAP-DOMAIN2");
if (success != TRUE) {
printf("%s\n",CkImap_lastErrorText(imapDest));
CkImap_Dispose(imapSrc);
CkImap_Dispose(imapDest);
return;
}
// Login to the destination IMAP server
success = CkImap_Login(imapDest,"MY-IMAP-LOGIN2","MY-IMAP-PASSWORD2");
if (success != TRUE) {
printf("%s\n",CkImap_lastErrorText(imapDest));
CkImap_Dispose(imapSrc);
CkImap_Dispose(imapDest);
return;
}
// Select a source IMAP mailbox on the source IMAP server
success = CkImap_SelectMailbox(imapSrc,"Inbox");
if (success != TRUE) {
printf("%s\n",CkImap_lastErrorText(imapSrc));
CkImap_Dispose(imapSrc);
CkImap_Dispose(imapDest);
return;
}
fetchUids = TRUE;
// Get the set of UIDs for all emails on the source server.
mset = CkImap_Search(imapSrc,"ALL",fetchUids);
if (CkImap_getLastMethodSuccess(imapSrc) != TRUE) {
printf("%s\n",CkImap_lastErrorText(imapSrc));
CkImap_Dispose(imapSrc);
CkImap_Dispose(imapDest);
return;
}
// Load the complete set of UIDs that were previously copied.
// We dont' want to copy any of these to the destination.
fac = CkFileAccess_Create();
msetAlreadyCopied = CkMessageSet_Create();
strMsgSet = CkFileAccess_readEntireTextFile(fac,"qa_cache/saAlreadyLoaded.txt","utf-8");
if (CkFileAccess_getLastMethodSuccess(fac) == TRUE) {
CkMessageSet_FromCompactString(msetAlreadyCopied,strMsgSet);
}
numUids = CkMessageSet_getCount(mset);
sbFlags = CkStringBuilder_Create();
i = 0;
while (i < numUids) {
// If this UID was not already copied...
uid = CkMessageSet_GetId(mset,i);
if (!CkMessageSet_ContainsId(msetAlreadyCopied,uid)) {
printf("copying %d...\n",uid);
// Get the flags.
flags = CkImap_fetchFlags(imapSrc,uid,TRUE);
if (CkImap_getLastMethodSuccess(imapSrc) == FALSE) {
printf("%s\n",CkImap_lastErrorText(imapSrc));
CkImap_Dispose(imapSrc);
CkImap_Dispose(imapDest);
CkFileAccess_Dispose(fac);
CkMessageSet_Dispose(msetAlreadyCopied);
CkStringBuilder_Dispose(sbFlags);
return;
}
CkStringBuilder_SetString(sbFlags,flags);
// Get the MIME of this email from the source.
mimeStr = CkImap_fetchSingleAsMime(imapSrc,uid,TRUE);
if (CkImap_getLastMethodSuccess(imapSrc) == FALSE) {
printf("%s\n",CkImap_lastErrorText(imapSrc));
CkImap_Dispose(imapSrc);
CkImap_Dispose(imapDest);
CkFileAccess_Dispose(fac);
CkMessageSet_Dispose(msetAlreadyCopied);
CkStringBuilder_Dispose(sbFlags);
return;
}
seen = CkStringBuilder_Contains(sbFlags,"\\Seen",FALSE);
flagged = CkStringBuilder_Contains(sbFlags,"\\Flagged",FALSE);
answered = CkStringBuilder_Contains(sbFlags,"\\Answered",FALSE);
draft = CkStringBuilder_Contains(sbFlags,"\\Draft",FALSE);
success = CkImap_AppendMimeWithFlags(imapDest,"Inbox",mimeStr,seen,flagged,answered,draft);
if (success != TRUE) {
printf("%s\n",CkImap_lastErrorText(imapDest));
CkImap_Dispose(imapSrc);
CkImap_Dispose(imapDest);
CkFileAccess_Dispose(fac);
CkMessageSet_Dispose(msetAlreadyCopied);
CkStringBuilder_Dispose(sbFlags);
return;
}
// Update msetAlreadyCopied with the uid just copied.
CkMessageSet_InsertId(msetAlreadyCopied,uid);
// Save at every iteration just in case there's a failure..
strMsgSet = CkMessageSet_toCompactString(msetAlreadyCopied);
CkFileAccess_WriteEntireTextFile(fac,"qa_cache/saAlreadyLoaded.txt",strMsgSet,"utf-8",FALSE);
}
i = i + 1;
}
CkMessageSet_Dispose(mset);
// Disconnect from the IMAP servers.
success = CkImap_Disconnect(imapSrc);
success = CkImap_Disconnect(imapDest);
CkImap_Dispose(imapSrc);
CkImap_Dispose(imapDest);
CkFileAccess_Dispose(fac);
CkMessageSet_Dispose(msetAlreadyCopied);
CkStringBuilder_Dispose(sbFlags);
}