Sample code for 30+ languages & platforms
PHP Extension

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 PHP Extension Downloads

PHP Extension
<?php

include("chilkat.php");

$success = false;

$imapSrc = new 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.
$imapSrc->put_Ssl(true);
$imapSrc->put_Port(993);
$success = $imapSrc->Connect('MY-IMAP-DOMAIN');
if ($success != true) {
    print $imapSrc->lastErrorText() . "\n";
    exit;
}

// Login to the source IMAP server
$success = $imapSrc->Login('MY-IMAP-LOGIN','MY-IMAP-PASSWORD');
if ($success != true) {
    print $imapSrc->lastErrorText() . "\n";
    exit;
}

$imapDest = new CkImap();

// Connect to our destination IMAP server.
$imapDest->put_Ssl(true);
$imapDest->put_Port(993);
$success = $imapDest->Connect('MY-IMAP-DOMAIN2');
if ($success != true) {
    print $imapDest->lastErrorText() . "\n";
    exit;
}

// Login to the destination IMAP server
$success = $imapDest->Login('MY-IMAP-LOGIN2','MY-IMAP-PASSWORD2');
if ($success != true) {
    print $imapDest->lastErrorText() . "\n";
    exit;
}

// Select a source IMAP mailbox on the source IMAP server
$success = $imapSrc->SelectMailbox('Inbox');
if ($success != true) {
    print $imapSrc->lastErrorText() . "\n";
    exit;
}

$fetchUids = true;

// Get the set of UIDs for all emails on the source server.
// mset is a CkMessageSet
$mset = $imapSrc->Search('ALL',$fetchUids);
if ($imapSrc->get_LastMethodSuccess() != true) {
    print $imapSrc->lastErrorText() . "\n";
    exit;
}

// Load the complete set of UIDs that were previously copied.
// We dont' want to copy any of these to the destination.
$fac = new CkFileAccess();
$msetAlreadyCopied = new CkMessageSet();
$strMsgSet = $fac->readEntireTextFile('qa_cache/saAlreadyLoaded.txt','utf-8');
if ($fac->get_LastMethodSuccess() == true) {
    $msetAlreadyCopied->FromCompactString($strMsgSet);
}

$numUids = $mset->get_Count();
$sbFlags = new CkStringBuilder();

$i = 0;
while ($i < $numUids) {

    // If this UID was not already copied...
    $uid = $mset->GetId($i);
    if (!$msetAlreadyCopied->ContainsId($uid)) {

        print 'copying ' . $uid . '...' . "\n";

        // Get the flags.
        $flags = $imapSrc->fetchFlags($uid,true);
        if ($imapSrc->get_LastMethodSuccess() == false) {
            print $imapSrc->lastErrorText() . "\n";
            exit;
        }

        $sbFlags->SetString($flags);

        // Get the MIME of this email from the source.
        $mimeStr = $imapSrc->fetchSingleAsMime($uid,true);
        if ($imapSrc->get_LastMethodSuccess() == false) {
            print $imapSrc->lastErrorText() . "\n";
            exit;
        }

        $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) {
            print $imapDest->lastErrorText() . "\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',false);
    }

    $i = $i + 1;
}

// Disconnect from the IMAP servers.
$success = $imapSrc->Disconnect();
$success = $imapDest->Disconnect();

?>