获取outlook邮箱的邮件

 

使用的是MailKit插件,然后下面的代码是通过outlook的账号密码,获取所有的文件夹,然后遍历文件夹,得到里面的所有文件

public void GetMessage(VidaxlEmailAccount account)
        { 
            try
            { 
                var messages = new List<VidaxlEmail>();
                using (var client = new ImapClient())
                {
                    client.Connect(account.Host, account.Port, SecureSocketOptions.SslOnConnect);
                    client.AuthenticationMechanisms.Remove("XOAUTH2");
                    client.Authenticate(account.EmailAccount, account.EmailPassword);
                    account.SyncTime = account.SyncTime.AddDays(-1);  //往前推一天
                    //此处可以看到所有的邮箱上的所有文件夹
                    var folders = client.GetFolders(client.PersonalNamespaces[0]);                    
                    foreach (var folder in folders)
                    {
                        var emails = GetAllEmail(client, account, folder.Name);
                        messages.AddRange(emails);
                    }

                    messages = messages.OrderBy(x => x.ReceiveDate).ToList();
                }

                using (var db = PetaDataBase.Instance)
                {
                    db.BulkInsert(messages);
                    string deleteSQL = $@"DELETE FROM dbo.VidaxlEmail WHERE UniqueId=0";
                    db.Execute(deleteSQL);
                }
            }
            catch (Exception e)
            {
                var insertLog = $@"INSERT INTO dbo.VidaxlEmail_SentLog
	                            ( OrderId, Message, CreateTime, CreateUserId, EmailAccount, IsSuccess, SentLog)
	                            VALUES
	                            ( @0,@1,@2,@3,@4,@5,@6)";
                var param = new List<object>();
                param.Add(0);
                param.Add("邮件同步失败");
                param.Add(DateTime.Now);
                param.Add(1);
                param.Add(account.EmailAccount);
                param.Add(false);
                param.Add(e.Message);
                using (var db = PetaDataBase.Instance)
                {
                    db.Execute(insertLog, param.ToArray());
                }  
            }
        }

  获取对应文件夹中的所有文件

public List<VidaxlEmail> GetAllEmail(ImapClient client,VidaxlEmailAccount account,string path)
        {
            List<VidaxlEmail> messages = new List<VidaxlEmail>();
            var mailFolder = client.GetFolder(path);
            mailFolder.Open(MailKit.FolderAccess.ReadOnly);
            //只要发件人或收件人是指定邮箱的,再加上一个时间的判断,就可以查出邮件集合
            var list = mailFolder
                .Search((SearchQuery.ToContains(Feature).Or(SearchQuery.FromContains(Feature)))
                .And(SearchQuery.SentSince(account.SyncTime)));

            if (list.Count > 0)
                RemoveExist(ref list, path, account.EmailAccount);

            foreach (var item in list)
            {
                try
                {
                    MimeMessage message = mailFolder.GetMessage(item);

                    string content = message.TextBody == null ?
                        ((MimeKit.TextPart)message.Body).Text :
                        message.TextBody;
                    var emailInfo = GetEmailModel(message, content, account.EmailAccount);
                    if (emailInfo.From.Contains(Feature)) emailInfo.MessageType = "Inbox";
                    else if (emailInfo.To.Contains(Feature)) emailInfo.MessageType = "Sent";
                    emailInfo.UniqueId = Convert.ToInt32(item.Id);
                    emailInfo.Validity = Convert.ToInt32(item.Validity);
                    emailInfo.IsValid = item.IsValid;
                    messages.Add(emailInfo);
                    Thread.Sleep(100);
                }
                catch (Exception ex)
                {
                    continue;
                }
            }

            return messages;
        }

  对接过程中,需要注意几点:

  Host:outlook.office365.com;Port:993

  outlook发送邮件必需加上:

_mailServer.TargetName = "STARTTLS/smtp.office365.com"
  
 参考链接:http://www.voidcn.com/article/p-mgynnypj-btn.html

 使用outlook需要在outlook网页版中加对应的ip设置为本人操作,不然outlook会认为异常ip,导致同步邮件或者发送邮件都操作不出来

 

posted @ 2021-04-02 17:18  OnlyUsername  阅读(549)  评论(0)    收藏  举报