PowerShell
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
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()