• mailkit----163邮箱登录拉取邮件的坑


           在使用mailkit的ImapClient拉取邮件的时候,如果我们使用的是网易的邮箱(如:163、126等),如果你没有按照网易的设置去打开IMAP协议,那么将无法登录邮箱,并且发送一封使用不安全的客户端登录邮箱的邮件到你的邮箱,但是使用网易自己的邮箱大师的话,可以轻易的登录,并不会提示。

          这其实是网易故意设置的障碍,其实是网易需要我们表明我们登录的客户端身份,具体的原理和命令参照我上一篇文章查看IMAP ID COMMAND命令,下面只具体说说mailkit如何使用到这条命令,其实mailkit是提供这个命令的,足见mailkit的强大。

     1 ImapClient client = new ImapClient();
     2 
     3 string account = "xxxxxx@163.com";
     4             string passWord = "xxxxxx";
     5 
     6 
     7             try
     8             {
     9                 client.Connect("imap.163.com", 993, true);
    10             }
    11             catch (ImapCommandException ex)
    12             {
    13                 Console.WriteLine($"---------尝试连接时出错:{0}------------" + ex.Message);
    14             }
    15             catch (ImapProtocolException ex)
    16             {
    17                 Console.WriteLine($"---------尝试连接时的协议错误:{0}------------" + ex.Message);
    18             }
    19             catch (Exception ex)
    20             {
    21                 Console.WriteLine($"---------服务器连接错误:{0}------------" + ex.Message);
    22             }
    23 
    24 
    25             try
    26             {
    27                 client.Authenticate(account, passWord);
    28             }
    29             catch (AuthenticationException ex)
    30             {
    31                 Console.WriteLine($"---------无效的用户名或密码:{0}------------" + ex.Message);
    32             }
    33             catch (ImapCommandException ex)
    34             {
    35                 Console.WriteLine($"---------尝试验证错误:{0}------------" + ex.Message);
    36             }
    37             catch (ImapProtocolException ex)
    38             {
    39                 Console.WriteLine($"---------尝试验证时的协议错误:{0}------------" + ex.Message);
    40             }
    41             catch (Exception ex)
    42             {
    43                 Console.WriteLine($"---------账户认证错误:{0}------------" + ex.Message);
    44             }
    45 
    46 var clientImplementation = new ImapImplementation
    47                             {
    48                                 Name = "xxxxe",
    49                                 Version = "2.0"
    50                             };
    51                             var serverImplementation = imapClient.Identify(clientImplementation);
    52 
    53 List<IMailFolder> mailFolderList = imapClient.GetFolders(imapClient.PersonalNamespaces[0]).ToList();
    54                         if (mailFolderList != null)
    55                         {
    56                             IMailFolder InBoxFolder = mailFolderList.Find(o => o.FullName.ToUpper() == "INBOX");
    57 }

    注意下面这段代码:

    var clientImplementation = new ImapImplementation
    {
    Name = "sssssd",
    Version = "2.0"
    };
    var serverImplementation = imapClient.Identify(clientImplementation);

    这句代码在登录完后需要执行,不然无法拉取文件夹。

    mailkit还提供查询是否支持命令的语句,如果你不知道邮箱是否支持这个命令可以使用下面的函数来判断:


    private static bool HasImapCapabilitiesId(ImapCapabilities sourceFlag, ImapCapabilities targetFlag)
    {
    return ((sourceFlag | targetFlag) == sourceFlag);
    }

    如上面的例子:则可以这样写:

    //判断是否 添加ID COMMOND命令
    if (HasImapCapabilitiesId(imapClient.Capabilities, ImapCapabilities.Id))
    {
    var clientImplementation = new ImapImplementation
    {
    Name = "dddddd",
    Version = "2.0"
    };
    var serverImplementation = imapClient.Identify(clientImplementation);
    }

    则判断是否支持ID COMMAND,

        这个命令主要是表面客户端身份的,参数name和version的值,可以按照需要去写,如上面的163邮箱就没有要求,可以随便填,但有些邮件服务器是有要求的,只有服务器认可的客户端和版本才可以正常使用,服务器会拒绝非法客户端的,一切看邮件服务端的要求。

  • 相关阅读:
    SQL查询
    SQL总结(二)连表查询
    SQL总结(一)基本查询
    SQL游标、函数的使用方法
    理解 Virtual DOM(摘)及评价
    virtual DOM的作用:将DOM的维护工作由系统维护转交给virtual DOM维护
    DOM的回流和重绘(重排、重绘)
    并发编程的核心
    执行流(指令流)的控制层级
    go语言的工资好高
  • 原文地址:https://www.cnblogs.com/zuimengaitianya/p/8579315.html
Copyright © 2020-2023  润新知