【问题标题】:Mailkit IMAP connection fails on second timeMailkit IMAP 连接第二次失败
【发布时间】:2019-12-19 17:36:49
【问题描述】:

我正在使用 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

【问题讨论】:

  • 我发现,是否打开收件箱并没有什么不同。即使只是建立连接并立即关闭它也会重现问题。
  • 您是否考虑过保持 ImapClient 连接处于活动状态而不是不断连接和断开连接?
  • 是的。最初,这两个操作都打算成为一个封闭的操作,但如果这不起作用,我必须考虑保持连接打开。
  • 我认为这将是你最好的选择。

标签: c# exchange-server imap mailkit


【解决方案1】:

这个异常意味着System.Net.Security.SslStream.AuthenticateAsClient()失败了。

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

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

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

【讨论】:

猜你喜欢
  • 2017-01-29
  • 1970-01-01
  • 2012-08-30
  • 2017-01-27
  • 1970-01-01
  • 2016-06-09
  • 2013-12-17
  • 2020-10-02
  • 2011-03-22
相关资源
最近更新 更多