Как да установите IMAP връзки в C#
Изброяване на разширенията на IMAP сървъра
Aspose.Email ImapClient позволява ви да извлечете разширенията на сървъра, които той поддържа, като IDLE, UNSELECT, QUOTA и др. Това помага за идентифициране наличността на разширение преди използването на клиента за конкретната функция. GetCapabilities() методът връща поддържаните типове разширения във вид на масив от низове. Следният кодов фрагмент показва как да извлечете разширенията.
Стандартна IMAP връзка
Този ImapClient класът позволява на приложенията да управляват IMAP пощенски кутии, използвайки IMAP протокола. The ImapClient класът се използва за свързване към IMAP пощенски сървъри и управление на имейли в IMAP папките. За да се свържете към IMAP сървър
- Създайте инстанция на ImapClient клас.
- Задайте името на хост, потребителското име и паролата в Конструктор ImapClient.
Забележка: ограниченията за пароли трябва да отговарят на изискванията на сървъра. Имотната програма за електронна поща не налага ограничения за пароли.
След като ImapClient инстанцията се инициализира, следващото повикване към всяка операция с тази инстанция ще се свърже със сървъра. Следният кодов фрагмент показва как да се свържете с IMAP сървър, използвайки горепосочените стъпки.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create an imapclient with host, user and password
ImapClient client = new ImapClient("localhost", "user", "password");
IMAP връзка с включен SSL
Свързване с IMAP сървър описва как да се свържете с IMAP сървър в четири прости стъпки:
- Създайте инстанция на ImapClient клас.
- Задайте името на хост, потребителското име и паролата.
- Задайте порта.
- Посочете опциите за сигурност.
Процесът за свързване към IMAP сървър с включен SSL е подобен, но изисква да зададете още няколко свойства:
- Задайте SecurityOptions към SSLImplicit.
Следният кодов фрагмент показва как да се
- Задайте потребителско име, парола и порт.
- Задайте опция за сигурност.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Create an instance of the ImapClient class
ImapClient client = new ImapClient("imap.domain.com", 993, "user@domain.com", "pwd");
// Set the security mode to implicit
client.SecurityOptions = SecurityOptions.SSLImplicit;
Настройка на прокси връзка
Свързване към сървър чрез прокси
Прокси сървърите се използват често за комуникация със света извън мрежата. В такива случаи имейл клиентите не могат да комуникират през Интернет без да зададат адреса на прокси. Aspose.Email поддържа версии 4, 4a и 5 на SOCKS прокси протокола. Тази статия предоставя работен пример за достъп до пощенската кутия чрез прокси имейл сървър. За достъп до пощенската кутия чрез прокси сървър:
- Инициализиране SocksProxy с необходимата информация, т.е. адрес на прокси, порт и версия на SOCKS.
- Инициализиране ImapClient с адрес на хост, потребителско име, парола и други настройки.
- Задайте на клиента SocksProxy свойство на клиента към SocksProxy обект създаден по-горе.
Следният кодов фрагмент показва как да се извлече пощенската кутия чрез прокси сървър.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Connect and log in to IMAP and set SecurityOptions
ImapClient client = new ImapClient("imap.domain.com", "username", "password");
client.SecurityOptions = SecurityOptions.Auto;
string proxyAddress = "192.168.203.142"; // proxy address
int proxyPort = 1080; // proxy port
SocksProxy proxy = new SocksProxy(proxyAddress, proxyPort, SocksVersion.SocksV5);
// Set the proxy
client.Proxy = proxy;
try
{
client.SelectFolder("Inbox");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Свързване към сървъра чрез HTTP proxy
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
HttpProxy proxy = new HttpProxy("18.222.124.59", 8080);
using (ImapClient client = new ImapClient("imap.domain.com", "username", "password"))
{
client.Proxy = proxy;
client.SelectFolder("Inbox");
}
Връзка в режим само за четене
Този ImapClient класът предоставя ReadOnly свойство, което когато е зададено на true, указва, че не трябва да се правят промени в постоянното състояние на пощенската кутия. Следният пример с код демонстрира използването на ImapClient.ReadOnly свойство. Той получава броя на непрочетените съобщения, след това извлича едно съобщение и отново получава броя на непрочетените съобщения в режим само за четене. Броят на непрочетените съобщения остава същият, което означава, че постоянното състояние на пощенската кутия не е променено.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
ImapClient imapClient = new ImapClient();
imapClient.Host = "<HOST>";
imapClient.Port = 993;
imapClient.Username = "<USERNAME>";
imapClient.Password = "<PASSWORD>";
imapClient.SupportedEncryption = EncryptionProtocols.Tls;
imapClient.SecurityOptions = SecurityOptions.SSLImplicit;
ImapQueryBuilder imapQueryBuilder = new ImapQueryBuilder();
imapQueryBuilder.HasNoFlags(ImapMessageFlags.IsRead); /* get unread messages. */
MailQuery query = imapQueryBuilder.GetQuery();
imapClient.ReadOnly = true;
imapClient.SelectFolder("Inbox");
ImapMessageInfoCollection messageInfoCol = imapClient.ListMessages(query);
Console.WriteLine("Initial Unread Count: " + messageInfoCol.Count());
if (messageInfoCol.Count() > 0)
{
imapClient.FetchMessage(messageInfoCol[0].SequenceNumber);
messageInfoCol = imapClient.ListMessages(query);
// This count will be equal to the initial count
Console.WriteLine("Updated Unread Count: " + messageInfoCol.Count());
}
else
{
Console.WriteLine("No unread messages found");
}
Настройка на CRAM-MD5 удостоверяване
За сигурно удостоверяване и достъп до имейл сървъра, Aspose.Email за .NET предлага метод за удостоверяване CRAM-MD5. Следният кодов фрагмент ще ви покаже как работи с ImapClient:
imapClient.AllowedAuthentication = ImapKnownAuthenticationType.CramMD5;
Задаване на таймаути за IMAP операции
Всяка пощенска операция отнема време в зависимост от много фактори (мрежови закъснения, размер на данните, производителност на сървъра и др.). Можете да зададете време за изчакване за всички пощенски операции. Примерният код по-долу ви показва как да направите това, като използвате Време за изчакване свойство. Забележка: не трябва да задавате големи стойности, за да избегнете дълги изчаквания във вашето приложение.
Конфигуриране на таймаут за операция
using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
imapClient.Timeout = 60000; // 60 seconds
// some code...
}
Ограничаване на таймаута за поздрав
IMAP клиентът може да използва автоматичен режим за установяване на връзка. В този режим клиентът преминава през всички възможни параметри за връзка, докато се установи връзка. При правилна връзка IMAP сървърът изпраща поздравителен низ към клиента. Сървърите могат да използват имплицитно или експлицитно (START TLS) иницииране на SSL/TLS връзка. Ако режимът на връзка не съвпада (например сървърът очаква имплицитна SSL връзка, а клиентът се опитва да установи незащитена или експлицитна SSL връзка), сървърът няма да изпрати поздравителен низ и потребителят ще чака дълго, докато таймаутът достигне поздравителния низ, след което клиентът преминава към следващата опция за връзка. За избягване на този проблем е въведено свойството GreetingTimeout. Това свойство ви позволява да зададете таймаут за поздравителния низ и да намалите времето за автоматично установяване на връзка.
using (ImapClient client = new ImapClient("localhost", 993, "username", "password"))
{
client.GreetingTimeout = 4000;
client.SelectFolder(ImapFolderInfo.InBox);
}
Използване на криптографски протоколи с IMAP
Aspose.Email поддържа SSL (остаряло) и TLS криптографски протоколи за осигуряване на сигурност на комуникациите. Можете да активирате криптографско шифроване за защита на обмена на данни между вашето приложение и пощенските сървъри.
ЗАБЕЛЕЖКА: Трябва да задавате само тези версии на протокола, които се поддържат от .NET Framework. Ако някои версии на криптографския протокол не се поддържат от текущата ви версия на .NET Framework, те ще бъдат игнорирани и пропуснати. В този случай няма да се генерират изключения. Моля, използвайте SetSupportedEncryptionUnsafe метод, ако искате да зададете протоколите без проверки за съвместимост.
Примерът с код отдолу показва как да зададете TLS 1.3 за ImapClient инстанция на класа.
using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
imapClient.SupportedEncryption = EncryptionProtocols.Tls13;
// some code...
}
В случай че посоченият протокол за шифроване не се поддържа в текущата версия на .NET Framework, разликата в поведението между SetSupportedEncryptionUnsafe метод и SupportedEncryption следното свойство:
- Ако SupportedEncryption когато се използва свойството, имейл клиентът понижава протокола за шифроване до поддържано ниво.
- Ако SetSupportedEncryptionUnsafe когато се използва методът, имейл клиентът хвърля изключения.
Използване на IMAP IDLE команда
Aspose.Email API‑и ImapClient осигурява възможност за отваряне на връзка към сървъра и изчакване на пристигането на имейл съобщение. Това позволява избягване на постоянно проверяване (polling) на сървъра за входяща поща. Следният кодов фрагмент демонстрира как да използвате библиотеката Aspose.Email за наблюдаване на IMAP пощенска кутия за нови съобщения и изтривани съобщения и след това извършване на конкретни действия въз основа на тези събития:
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
// Connect and log in to IMAP
ImapClient client = new ImapClient("imap.domain.com", "username", "password");
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
ImapMonitoringEventArgs eventArgs = null;
client.StartMonitoring(delegate(object sender, ImapMonitoringEventArgs e)
{
eventArgs = e;
manualResetEvent.Set();
});
Thread.Sleep(2000);
SmtpClient smtpClient = new SmtpClient("exchange.aspose.com", "username", "password");
smtpClient.Send(new MailMessage("from@aspose.com", "to@aspose.com", "EMAILNET-34875 - " + Guid.NewGuid(), "EMAILNET-34875 Support for IMAP idle command"));
manualResetEvent.WaitOne(10000);
manualResetEvent.Reset();
Console.WriteLine(eventArgs.NewMessages.Length);
Console.WriteLine(eventArgs.DeletedMessages.Length);
client.StopMonitoring("Inbox");
smtpClient.Send(new MailMessage("from@aspose.com", "to@aspose.com", "EMAILNET-34875 - " + Guid.NewGuid(), "EMAILNET-34875 Support for IMAP idle command"));
manualResetEvent.WaitOne(5000);
Следният примерен код показва как се настройва асинхронно наблюдение за нови имейл съобщения:
var client = = new ImapClient("imap.domain.com", "username", "password");
//anySuccess is a flag to prevent infinite Client.ResumeMonitoring calls
var anySuccess = false;
await client.StartMonitoringAsync(OnNewMessagesCallback, OnErrorCallback);
void OnErrorCallback(object eventSender, ImapMonitoringErrorEventArgs errorEventArguments)
{
//The exception can be handled here
Logger.Debug.Write(
$"An error occured while folder monitoring: {errorEventArguments.FolderName}",
errorEventArguments.Error);
//IMAP folder monitoring is stopped on any error. Here is an example
//of resuming after that.
if (!anySuccess) return;
anySuccess = false;
//Make sure you use ResumeMonitoring instead of StartMonitoring here
//to prevent missing any emails between the error handling and resuming.
client.ResumeMonitoring(OnNewMessagesCallback, OnErrorCallback,
errorEventArguments.MonitoringState);
}
void OnNewMessagesCallback(object sender, ImapMonitoringEventArgs successEventArgs)
{
anySuccess = true;
//Use successEventArgs.NewMessages to handle new messages
//Use successEventArgs.DeletedMessages to handle deleted messages
}
Поддръжка за IMAP разширения
Aspose.Email API предоставя поддръжка за IMAP разширения. В момента API‑то поддържа следните IMAP разширения. Тези разширения не се поддържат от всички сървъри.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using (ImapClient client = new ImapClient("imap.gmail.com", 993, "username", "password"))
{
// Set SecurityOptions
client.SecurityOptions = SecurityOptions.Auto;
Console.WriteLine(client.IdSupported.ToString());
ImapIdentificationInfo serverIdentificationInfo1 = client.IntroduceClient();
ImapIdentificationInfo serverIdentificationInfo2 = client.IntroduceClient(ImapIdentificationInfo.DefaultValue);
// Display ImapIdentificationInfo properties
Console.WriteLine(serverIdentificationInfo1.ToString(), serverIdentificationInfo2);
Console.WriteLine(serverIdentificationInfo1.Name);
Console.WriteLine(serverIdentificationInfo1.Vendor);
Console.WriteLine(serverIdentificationInfo1.SupportUrl);
Console.WriteLine(serverIdentificationInfo1.Version);
}
Разширена команда LIST на IMAP4
Следният откъс от код показва как да използвате разширената команда list на IMAP4.
// For complete examples and data files, please go to https://github.com/aspose-email/Aspose.Email-for-.NET
using (ImapClient client = new ImapClient("imap.gmail.com", 993, "username", "password"))
{
ImapFolderInfoCollection folderInfoCol = client.ListFolders("*");
Console.WriteLine("Extended List Supported: " + client.ExtendedListSupported);
foreach (ImapFolderInfo folderInfo in folderInfoCol)
{
switch (folderInfo.Name)
{
case "[Gmail]/All Mail":
Console.WriteLine("Has Children: " + folderInfo.HasChildren);
break;
case "[Gmail]/Bin":
Console.WriteLine("Bin has children? " + folderInfo.HasChildren);
break;
case "[Gmail]/Drafts":
Console.WriteLine("Drafts has children? " + folderInfo.HasChildren);
break;
case "[Gmail]/Important":
Console.WriteLine("Important has Children? " + folderInfo.HasChildren);
break;
case "[Gmail]/Sent Mail":
Console.WriteLine("Sent Mail has Children? " + folderInfo.HasChildren);
break;
case "[Gmail]/Spam":
Console.WriteLine("Spam has Children? " + folderInfo.HasChildren);
break;
case "[Gmail]/Starred":
Console.WriteLine("Starred has Children? " + folderInfo.HasChildren);
break;
}
}
}