Sample code for 30+ languages & platforms
PowerShell

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

PowerShell
Add-Type -Path "C:\chilkat\ChilkatDotNet47-x64\ChilkatDotNet47.dll"

$success = $false

$imapSrc = New-Object 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 = $true
$imapSrc.Port = 993
$success = $imapSrc.Connect("MY-IMAP-DOMAIN")
if ($success -ne $true) {
    $($imapSrc.LastErrorText)
    exit
}

# Login to the source IMAP server
$success = $imapSrc.Login("MY-IMAP-LOGIN","MY-IMAP-PASSWORD")
if ($success -ne $true) {
    $($imapSrc.LastErrorText)
    exit
}

$imapDest = New-Object Chilkat.Imap

# Connect to our destination IMAP server.
$imapDest.Ssl = $true
$imapDest.Port = 993
$success = $imapDest.Connect("MY-IMAP-DOMAIN2")
if ($success -ne $true) {
    $($imapDest.LastErrorText)
    exit
}

# Login to the destination IMAP server
$success = $imapDest.Login("MY-IMAP-LOGIN2","MY-IMAP-PASSWORD2")
if ($success -ne $true) {
    $($imapDest.LastErrorText)
    exit
}

# Select a source IMAP mailbox on the source IMAP server
$success = $imapSrc.SelectMailbox("Inbox")
if ($success -ne $true) {
    $($imapSrc.LastErrorText)
    exit
}

$fetchUids = $true

# Get the set of UIDs for all emails on the source server.
$mset = $imapSrc.Search("ALL",$fetchUids)
if ($imapSrc.LastMethodSuccess -ne $true) {
    $($imapSrc.LastErrorText)
    exit
}

# Load the complete set of UIDs that were previously copied.
# We dont' want to copy any of these to the destination.
$fac = New-Object Chilkat.FileAccess
$msetAlreadyCopied = New-Object Chilkat.MessageSet
$strMsgSet = $fac.ReadEntireTextFile("qa_cache/saAlreadyLoaded.txt","utf-8")
if ($fac.LastMethodSuccess -eq $true) {
    $msetAlreadyCopied.FromCompactString($strMsgSet)
}

$numUids = $mset.Count
$sbFlags = New-Object Chilkat.StringBuilder

$i = 0
while ($i -lt $numUids) {

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

        $("copying " + $uid + "...")

        # Get the flags.
        $flags = $imapSrc.FetchFlags($uid,$true)
        if ($imapSrc.LastMethodSuccess -eq $false) {
            $($imapSrc.LastErrorText)
            exit
        }

        $sbFlags.SetString($flags)

        # Get the MIME of this email from the source.
        $mimeStr = $imapSrc.FetchSingleAsMime($uid,$true)
        if ($imapSrc.LastMethodSuccess -eq $false) {
            $($imapSrc.LastErrorText)
            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 -ne $true) {
            $($imapDest.LastErrorText)
            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()