获取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,导致同步邮件或者发送邮件都操作不出来

浙公网安备 33010602011771号