Як встановити IMAP-з’єднання в C#
Перелік розширень IMAP‑сервера
Aspose.Email ImapClient дозволяє отримувати розширення сервера, які підтримуються, такі як IDLE, UNSELECT, QUOTA тощо. Це допомагає визначити доступність розширення перед використанням клієнта для цієї функції. GetCapabilities() метод повертає підтримувані типи розширень у вигляді масиву рядків. Нижчий фрагмент коду показує, як отримати розширення.
Стандартне IMAP‑з’єднання
The ImapClient клас дозволяє застосункам керувати IMAP‑скриньками, використовуючи протокол IMAP. ImapClient клас використовується для підключення до IMAP‑mail серверів та керування електронними листами у 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. У цій статті представлений робочий приклад доступу до скриньки через проксі‑mail сервер. Щоб отримати доступ до скриньки через проксі‑сервер:
- Ініціалізувати 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‑проксі
// 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");
}
З’єднання в режимі лише читання
The 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‑сервер надсилає клієнту вітальний рядок. Сервери можуть ініціювати SSL/TLS з’єднання неявно або явно (START 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
API Aspose.Email ImapClient надає можливість відкрити з’єднання з сервером і чекати надходження електронного листа. Це дозволяє уникнути постійного опитування сервера щодо нових листів. Нижче наведений фрагмент коду демонструє, як використати бібліотеку 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. Ці розширення 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;
}
}
}