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郵箱就沒有要求,可以隨便填,但有些郵件服務器是有要求的,只有服務器認可的客戶端和版本才可以正常使用,服務器會拒絕非法客戶端的,一切看郵件服務端的要求。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM