Mailkit IMAP连接第二次失败

时间:2019-08-13 07:30:01

标签: c# exchange-server imap mailkit

我正在使用Mailkit v2.2.0从使用IMAP的交换服务器中检索电子邮件。首先,我会阅读邮件并进行处理,然后将其删除(如有必要)。因此,我在很短的时间内两次连接到IMAP服务器。

private ImapClient GetImapClient(MailServerConnectionString connectionString) {
    var client = new ImapClient();

    if (connectionString.AcceptAllCertificates) {
        client.ServerCertificateValidationCallback = (s, c, h, e) => true;
    }

    client.Connect(connectionString.Server, connectionString.Port, connectionString.Encryption);

    if (connectionString.AuthenticationRequired) {
        client.Authenticate(connectionString.UserName, connectionString.Password);
    }

    return client;
}

检索邮件:

using (var client = GetImapClient(config.ImapConnectionString)) {
    var inbox = client.Inbox;
    inbox.Open(FolderAccess.ReadWrite);

    var items = inbox.Fetch(0, -1, MessageSummaryItems.UniqueId | MessageSummaryItems.Size | MessageSummaryItems.Flags);

    foreach (var item in items) {
        var message = inbox.GetMessage(item.UniqueId);
        var mail = message.Convert(includeAttachments);

        mail.Seen = item.Flags?.HasFlag(MessageFlags.Seen) ?? false;
        mail.UniqueId = item.UniqueId.Id;

        result.Add(mail);

        inbox.AddFlags(item.UniqueId, MessageFlags.Seen, true);
    }

    inbox.Close();
    client.Disconnect(true);
}

处理完邮件后,将其删除:

using (var client = GetImapClient(config.ImapConnectionString)) {
    var inbox = client.Inbox;
    inbox.Open(FolderAccess.ReadWrite);

    inbox.AddFlags(ids, MessageFlags.Deleted, true);
    inbox.Expunge();

    client.Disconnect(true);
}

很高兴知道

  • hMailServer一切正常,但MS Exchange却不能。

  • 第一个连接有效,第二个连接失败。

  • 第二个连接上的异常:An error occurred while attempting to establish an SSL or TLS connection.

  • 我两次都使用端口993和SecureSocketOptions.SslOnConnect

1 个答案:

答案 0 :(得分:0)

此异常表示System.Net.Security.SslStream.AuthenticateAsClient()失败。

可能是SslStream无法连接到证书颁发机构以检查服务器证书的吊销状态。

要禁用证书吊销检查,可以在连接之前将client.CheckCertificateRevocation属性设置为false

也有可能将Exchange服务器配置为限制来自同一IP地址的频繁连接,以阻止DoS攻击。为了解决这种可能性,您将需要保持ImapClient连接处于活动状态(即像您一样在短时间内停止使用ImapClient),或者在重新连接之间等待更长的时间。