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