Sample code for 30+ languages & platforms
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

Perl
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();