Perl
Perl
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 Perl Downloads
use chilkat();
$success = 0;
$imapSrc = chilkat::CkImap->new();
# 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->put_Ssl(1);
$imapSrc->put_Port(993);
$success = $imapSrc->Connect("MY-IMAP-DOMAIN");
if ($success != 1) {
print $imapSrc->lastErrorText() . "\r\n";
exit;
}
# Login to the source IMAP server
$success = $imapSrc->Login("MY-IMAP-LOGIN","MY-IMAP-PASSWORD");
if ($success != 1) {
print $imapSrc->lastErrorText() . "\r\n";
exit;
}
$imapDest = chilkat::CkImap->new();
# Connect to our destination IMAP server.
$imapDest->put_Ssl(1);
$imapDest->put_Port(993);
$success = $imapDest->Connect("MY-IMAP-DOMAIN2");
if ($success != 1) {
print $imapDest->lastErrorText() . "\r\n";
exit;
}
# Login to the destination IMAP server
$success = $imapDest->Login("MY-IMAP-LOGIN2","MY-IMAP-PASSWORD2");
if ($success != 1) {
print $imapDest->lastErrorText() . "\r\n";
exit;
}
# Select a source IMAP mailbox on the source IMAP server
$success = $imapSrc->SelectMailbox("Inbox");
if ($success != 1) {
print $imapSrc->lastErrorText() . "\r\n";
exit;
}
$fetchUids = 1;
# Get the set of UIDs for all emails on the source server.
# mset is a MessageSet
$mset = $imapSrc->Search("ALL",$fetchUids);
if ($imapSrc->get_LastMethodSuccess() != 1) {
print $imapSrc->lastErrorText() . "\r\n";
exit;
}
# Load the complete set of UIDs that were previously copied.
# We dont' want to copy any of these to the destination.
$fac = chilkat::CkFileAccess->new();
$msetAlreadyCopied = chilkat::CkMessageSet->new();
$strMsgSet = $fac->readEntireTextFile("qa_cache/saAlreadyLoaded.txt","utf-8");
if ($fac->get_LastMethodSuccess() == 1) {
$msetAlreadyCopied->FromCompactString($strMsgSet);
}
$numUids = $mset->get_Count();
$sbFlags = chilkat::CkStringBuilder->new();
$i = 0;
while ($i < $numUids) {
# If this UID was not already copied...
$uid = $mset->GetId($i);
if (!$msetAlreadyCopied->ContainsId($uid)) {
print "copying " . $uid . "..." . "\r\n";
# Get the flags.
$flags = $imapSrc->fetchFlags($uid,1);
if ($imapSrc->get_LastMethodSuccess() == 0) {
print $imapSrc->lastErrorText() . "\r\n";
exit;
}
$sbFlags->SetString($flags);
# Get the MIME of this email from the source.
$mimeStr = $imapSrc->fetchSingleAsMime($uid,1);
if ($imapSrc->get_LastMethodSuccess() == 0) {
print $imapSrc->lastErrorText() . "\r\n";
exit;
}
$seen = $sbFlags->Contains("\\Seen",0);
$flagged = $sbFlags->Contains("\\Flagged",0);
$answered = $sbFlags->Contains("\\Answered",0);
$draft = $sbFlags->Contains("\\Draft",0);
$success = $imapDest->AppendMimeWithFlags("Inbox",$mimeStr,$seen,$flagged,$answered,$draft);
if ($success != 1) {
print $imapDest->lastErrorText() . "\r\n";
exit;
}
# 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",0);
}
$i = $i + 1;
}
# Disconnect from the IMAP servers.
$success = $imapSrc->Disconnect();
$success = $imapDest->Disconnect();