Sample code for 30+ languages & platforms
PHP ActiveX

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 ActiveX Downloads

PHP ActiveX
<?php

$success = 0;

$imapSrc = new COM("Chilkat.Imap");

// 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->Ssl = 1;
$imapSrc->Port = 993;
$success = $imapSrc->Connect('MY-IMAP-DOMAIN');
if ($success != 1) {
    print $imapSrc->LastErrorText . "\n";
    exit;
}

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

$imapDest = new COM("Chilkat.Imap");

// Connect to our destination IMAP server.
$imapDest->Ssl = 1;
$imapDest->Port = 993;
$success = $imapDest->Connect('MY-IMAP-DOMAIN2');
if ($success != 1) {
    print $imapDest->LastErrorText . "\n";
    exit;
}

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

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

$fetchUids = 1;

// Get the set of UIDs for all emails on the source server.
// mset is a Chilkat.MessageSet
$mset = $imapSrc->Search('ALL',$fetchUids);
if ($imapSrc->LastMethodSuccess != 1) {
    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 COM("Chilkat.FileAccess");
$msetAlreadyCopied = new COM("Chilkat.MessageSet");
$strMsgSet = $fac->readEntireTextFile('qa_cache/saAlreadyLoaded.txt','utf-8');
if ($fac->LastMethodSuccess == 1) {
    $msetAlreadyCopied->FromCompactString($strMsgSet);
}

$numUids = $mset->Count;
$sbFlags = new COM("Chilkat.StringBuilder");

$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,1);
        if ($imapSrc->LastMethodSuccess == 0) {
            print $imapSrc->LastErrorText . "\n";
            exit;
        }

        $sbFlags->SetString($flags);

        // Get the MIME of this email from the source.
        $mimeStr = $imapSrc->fetchSingleAsMime($uid,1);
        if ($imapSrc->LastMethodSuccess == 0) {
            print $imapSrc->LastErrorText . "\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 . "\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();

?>