利用Aspose.Email同步IMAP邮件至Exchange2013

无数年没有写过博客了,一方面是懒惰,一方面是肚子里面没货,没啥可写。


这几天在帮一个朋友安装了一套Exchange,由于Server的环境是Windows 2008 R2,导致无法安装Exchange 2016,而只能安装2013,安装倒是没啥问题,装域、找腾讯申请免费https证书、安装Exchange、导入AD用户、创建邮箱,该干的都干了,这些一切顺利。


往往直觉很灵,感觉总会发生点什么事情,但最终还是来了,并且让我头疼了两天。。。。。


由于朋友公司以前的企业邮箱是使用的腾讯企业邮箱,使用IMAP或POP3方式进行登录,现在需要将里面的邮件同步到Exchange2013中。经过查找,开始了我的人生折腾历程:


1, 原以为Exchange 2013也有一个Transporter Suite之类的工具,信心百倍地去找度娘和谷哥下载去,结果大吃一惊,只支持2007。网上传授的方案都是先安装2007,然后通过Transporter Suite同步邮件,再将2007升级到2013,再用2013的同步工具进行同步。但是,谁能告诉我已经装好的2013该如何卸载?服务器资源有限啊,总不至于重装吧?


2. Transporter Suite方案行不通以后,又找啊找,后来找到了一个利用PST文件导入的方案,自己想着这也行啊,大不了一个个地来,用OutLook先将邮件下载下来,然后再同步,然而,愿望是美好的,现实是骨感的。首先,使用POP3只能下载收件箱中的内容,那些已发送、已删除之类的邮件没法再下载下来了,于是放弃POP3,改用IMAP进行连接。使用IMAP能够同步所有的内容,但是。。。。。。。。生成文件是OST,如何转成PST?一步一个坑啊!!!!


3. 当脑袋想破了以后,于是乎偶尔看到了Aspose.Email(Aspose不用介绍了吧,大家用Aspose.Cells非常熟了),看到Aspose.Email能够读取IMAP,并且能够生成PST文件,大喜!于是开始写代码,将PST生成,利用Exchange PowerShell工具发送New-MailboxImportRequest指令,想着应当没问题了吧,我只同步了一个邮箱,里面有1010封邮件,最后上传完成以后一计算,只有800多封,邮件哪儿去了????于是再一个个地检查,将PST加入到OutLook一看,全都在,打开查看转发什么的都没问题,怎么Exchange对于某些邮件导不过去?想分析原因,就告诉我BadItem,你总得告诉我是怎么回事我好彻底修复啊!!


4. 为了上一步,折腾了一天,一觉醒来,仍是心灰意冷。想当然地认为Exchange的EWS里面只有收发邮件之类的功能,而没有往里面写入一封邮件的功能。漫无头绪地分析了一下Aspose.Email.Exchange,看到里面有一个AppendMessage方法,于是乎,又开始写一段代码,进行简单测试。哦了,成功了!!!!


原理就是左边读右边写。碰到文件夹就创建文件夹,收到邮件就往Exchange里面写入邮件。


累个半死,接下来就让同步程序慢慢去跑去吧。附上同步源代码,今后有同步需求的可以参考下!


using Aspose.Email.Imap;
using Aspose.Email.Mail;
using Aspose.Email.Outlook;
using Aspose.Email.Outlook.Pst;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {
            Aspose.Email.Imap.ImapClient client = new Aspose.Email.Imap.ImapClient("邮箱IMAP地址", "用户名", "密码");
            client.Timeout = 3600000;
            iCount = 0;
            Aspose.Email.Exchange.IEWSClient exClient = Aspose.Email.Exchange.EWSClient.GetEWSClient("https://ExchangeServerAddress/ews/exchange.asmx", "用户名", "密码", "域");
            exClient.Timeout = 3600000;

            DateTime startDate = DateTime.Now;
            SyncFolder(client, null, exClient, exClient.MailboxInfo.RootUri);
            //exClient.MailboxUri
            SyncFolderAndEmail(client, null, exClient);

            DateTime finishDate = DateTime.Now;

            TimeSpan ts = finishDate - startDate;

            Console.WriteLine("完成,总耗时{0}:{1:00}:{2:00}", ts.Hours, ts.Minutes, ts.Seconds);
            Console.Read();
        }

        private static int iCount = 0;

        static List<FolderMapping> folderList = new List<FolderMapping>();
        private static void SyncFolder(ImapClient client, ImapFolderInfo parentFolder, Aspose.Email.Exchange.IEWSClient exClient, string parentFolderUri)
        {
            ImapFolderInfoCollection subFolders = null;
            if (parentFolder == null)
            {
                subFolders = client.ListFolders();
            }
            else
            {
                subFolders = client.ListFolders(parentFolder.Name);
            }

            foreach (ImapFolderInfo folder in subFolders)
            {
                string uri = string.Empty;
                if (parentFolder == null)
                {
                    if (folder.Name.Equals("INBOX", StringComparison.OrdinalIgnoreCase))
                    {
                        uri = exClient.GetMailboxInfo().InboxUri;
                        folderList.Add(new FolderMapping() { ExchangeUri = uri, FullName = folder.Name });
                    }
                    else if (folder.Name.Equals("Sent Messages", StringComparison.OrdinalIgnoreCase))
                    {
                        uri = exClient.GetMailboxInfo().SentItemsUri;
                        folderList.Add(new FolderMapping() { ExchangeUri = exClient.GetMailboxInfo().SentItemsUri, FullName = folder.Name });
                    }
                    else if (folder.Name.Equals("Drafts", StringComparison.OrdinalIgnoreCase))
                    {
                        uri = exClient.GetMailboxInfo().DraftsUri;
                        folderList.Add(new FolderMapping() { ExchangeUri = exClient.GetMailboxInfo().DraftsUri, FullName = folder.Name });
                    }
                    else if (folder.Name.Equals("Deleted Messages", StringComparison.OrdinalIgnoreCase))
                    {
                        uri = exClient.GetMailboxInfo().DeletedItemsUri;
                        folderList.Add(new FolderMapping() { ExchangeUri = exClient.GetMailboxInfo().DeletedItemsUri, FullName = folder.Name });
                    }
                    else if (folder.Name.Equals("Junk", StringComparison.OrdinalIgnoreCase))
                    {
                        uri = exClient.GetMailboxInfo().JunkeMailsUri;
                        folderList.Add(new FolderMapping() { ExchangeUri = exClient.GetMailboxInfo().JunkeMailsUri, FullName = folder.Name });
                    }
                    else
                    {
                        Aspose.Email.Exchange.ExchangeFolderInfo folderInfo = null;
                        bool exists = exClient.FolderExists(parentFolderUri, folder.Name.Split('/').Last(), out folderInfo);

                        if (!exists)
                        {
                            uri = exClient.CreateFolder(parentFolderUri, folder.Name).Uri;
                        }
                        else
                        {
                            uri = folderInfo.Uri;
                        }
                        folderList.Add(new FolderMapping() { ExchangeUri = uri, FullName = folder.Name });
                    }
                }
                else
                {
                    Aspose.Email.Exchange.ExchangeFolderInfo folderInfo = null;
                    bool exists = exClient.FolderExists(parentFolderUri, folder.Name.Split('/').Last(), out folderInfo);

                    if (!exists)
                    {
                        uri = exClient.CreateFolder(parentFolderUri, folder.Name.Split('/').Last()).Uri;
                    }
                    else
                    {
                        uri = folderInfo.Uri;
                    }
                    folderList.Add(new FolderMapping() { ExchangeUri = uri, FullName = folder.Name });
                }

                SyncFolder(client, folder, exClient, uri);
            }
        }

        private static void SyncFolderAndEmail(ImapClient client, ImapFolderInfo parentFolder, Aspose.Email.Exchange.IEWSClient exClient)
        {
            ImapFolderInfoCollection subFolders = null;

            if (parentFolder == null)
            {
                subFolders = client.ListFolders();
            }
            else
            {
                subFolders = client.ListFolders(parentFolder.Name);
            }

            foreach (ImapFolderInfo folder in subFolders)
            {
                string exchangeFolderUri = folderList.Find(item => item.FullName.Equals(folder.Name, StringComparison.OrdinalIgnoreCase)).ExchangeUri;

                if (!folder.Name.Equals("其他文件夹", StringComparison.OrdinalIgnoreCase))   //腾讯企业邮箱该判断如果不加上将报错
                {
                    client.SelectFolder(folder.Name);
                    foreach (ImapMessageInfo msg in client.ListMessages())
                    {
                        for (int i = 0; i < 10; i++)    //如果出错,多重试几次
                        {
                            try
                            {
                                MailMessage mail = client.FetchMessage(msg.UniqueId);

                                iCount++;
                                Console.WriteLine("已同步邮件数{0},已同步{1},位置:{2}", iCount, mail.Subject, folder.Name);

                                string sMessageUri = exClient.AppendMessage(exchangeFolderUri, mail);
                                exClient.SetReadFlag(sMessageUri, msg.IsRead);
                                break;
                            }
                            catch
                            {

                            }
                        }
                    }
                }
                //判断下级
                SyncFolderAndEmail(client, folder, exClient);
            }
        }
    }

    public class FolderMapping
    {
        public string FullName { get; set; }
        public string ExchangeUri { get; set; }

        public override string ToString()
        {
            return string.Format("{0}\t{1}", FullName, ExchangeUri);
        }
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值