Jak nawiązywać połączenia IMAP w C#
Wymienianie rozszerzeń serwera IMAP
Aspose.Email ImapClient pozwala pobrać rozszerzenia serwera, które serwer obsługuje, takie jak IDLE, UNSELECT, QUOTA itp. Pomaga to zidentyfikować dostępność rozszerzenia przed użyciem klienta dla danej funkcjonalności. GetCapabilities() metoda zwraca obsługiwane typy rozszerzeń w postaci tablicy stringów. Poniższy fragment kodu pokazuje, jak pobrać rozszerzenia.
Standardowe połączenie IMAP
Ten ImapClient klasa umożliwia aplikacjom zarządzanie skrzynkami IMAP przy użyciu protokołu IMAP. ImapClient klasa jest używana do łączenia się z serwerami poczty IMAP i zarządzania e‑mailami w folderach IMAP. Aby połączyć się z serwerem IMAP
- Utwórz instancję ImapClient klasa.
- Określ nazwę hosta, nazwę użytkownika i hasło w konstruktor ImapClient.
Uwaga, ograniczenia dotyczące hasła muszą spełniać wymagania serwera. Klient e‑mail nie nakłada dodatkowych ograniczeń na hasło.
Po ImapClient instancja jest inicjowana, kolejne wywołanie dowolnej operacji przy użyciu tej instancji połączy się z serwerem. Poniższy fragment kodu pokazuje, jak połączyć się z serwerem IMAP, stosując powyższe kroki.
// 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");
Połączenie IMAP z włączonym SSL
Łączenie z serwerem IMAP opisano, jak połączyć się z serwerem IMAP w czterech prostych krokach:
- Utwórz instancję ImapClient klasa.
- Podaj nazwę hosta, nazwę użytkownika i hasło.
- Określ port.
- Określ opcje zabezpieczeń.
Proces łączenia się z serwerem IMAP z włączonym SSL jest podobny, ale wymaga ustawienia kilku dodatkowych właściwości:
- Ustaw SecurityOptions do SSLImplicit.
Poniższy fragment kodu pokazuje, jak
- Ustaw nazwę użytkownika, hasło i port.
- Ustaw opcję bezpieczeństwa.
// 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;
Konfiguracja połączenia proxy
Łączenie z serwerem przez proxy
Serwery proxy są powszechnie używane do komunikacji ze światem zewnętrznym. W takich przypadkach klienci poczty nie mogą komunikować się z Internetem bez podania adresu proxy. Aspose.Email obsługuje wersje 4, 4a i 5 protokołu SOCKS proxy. Ten artykuł zawiera działający przykład dostępu do skrzynki pocztowej przy użyciu serwera proxy poczty. Aby uzyskać dostęp do skrzynki pocztowej przez serwer proxy:
- Inicjalizuj SocksProxy z wymaganymi informacjami, czyli adresem proxy, portem i wersją SOCKS.
- Inicjalizuj ImapClient z adresem hosta, nazwą użytkownika, hasłem i innymi ustawieniami.
- Ustaw właściwość klienta SocksProxy właściwość klienta do SocksProxy obiekt utworzony powyżej.
Poniższy fragment kodu pokazuje, jak pobrać skrzynkę pocztową za pośrednictwem serwera proxy.
// 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);
}
Łączenie się z serwerem przez proxy 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");
}
Połączenie w trybie tylko do odczytu
Ten ImapClient klasa zapewnia ReadOnly właściwość, która po ustawieniu na true, oznacza, że nie powinny być wprowadzane żadne zmiany w trwałym stanie skrzynki pocztowej. Poniższy przykład kodu demonstruje użycie ImapClient.ReadOnly właściwości. Pobiera liczbę nieprzeczytanych wiadomości, następnie pobiera jedną wiadomość i ponownie pobiera liczbę nieprzeczytanych wiadomości w trybie tylko do odczytu. Liczba nieprzeczytanych wiadomości pozostaje taka sama, co wskazuje, że trwały stan skrzynki pocztowej nie został zmieniony.
// 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");
}
Konfiguracja uwierzytelniania CRAM‑MD5
Dla bezpiecznej autoryzacji i dostępu do serwera e‑mail, Aspose.Email dla .NET oferuje metodę uwierzytelniania CRAM‑MD5. Poniższy fragment kodu pokaże, jak działa ona z ImapClient:
imapClient.AllowedAuthentication = ImapKnownAuthenticationType.CramMD5;
Ustawianie limitów czasu dla operacji IMAP
Każda operacja e‑mail zajmuje pewien czas w zależności od wielu czynników (opóźnienia sieciowe, rozmiar danych, wydajność serwera itp.). Możesz ustawić limit czasu dla wszystkich operacji e‑mail. Poniższy przykład kodu pokazuje, jak to zrobić przy użyciu Limit czasu właściwość. Uwaga: nie należy ustawiać dużych wartości, aby uniknąć długiego oczekiwania w aplikacji.
Skonfiguruj limit czasu operacji
using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
imapClient.Timeout = 60000; // 60 seconds
// some code...
}
Ogranicz limit czasu powitania
Klient IMAP może używać trybu automatycznego do nawiązywania połączenia. W tym trybie klient IMAP przechodzi przez wszystkie możliwe parametry połączenia, aż połączenie zostanie zestawione. Serwer IMAP w przypadku prawidłowego połączenia wysyła do klienta ciąg powitalny. Serwery mogą używać połączenia SSL/TLS implikowanego lub jawnego (START TLS). Jeśli tryb połączenia jest niezgodny (np. serwer oczekuje połączenia SSL implikowanego, a klient próbuje ustanowić połączenie niezaszyfrowane lub jawne SSL), serwer nie wyśle ciągu powitalnego, a użytkownik będzie czekał długo, aż upłynie limit czasu, po czym klient przejdzie do kolejnej opcji połączenia. Aby uniknąć tego problemu, wprowadzono właściwość GreetingTimeout. Pozwala ona ustawić limit czasu na otrzymanie ciągu powitalnego, skracając czas automatycznego nawiązywania połączenia.
using (ImapClient client = new ImapClient("localhost", 993, "username", "password"))
{
client.GreetingTimeout = 4000;
client.SelectFolder(ImapFolderInfo.InBox);
}
Użycie protokołów kryptograficznych z IMAP
Aspose.Email obsługuje protokoły kryptograficzne SSL (przestarzały) i TLS, aby zapewnić bezpieczeństwo komunikacji. Możesz włączyć szyfrowanie kryptograficzne, aby chronić wymianę danych pomiędzy Twoją aplikacją a serwerami poczty.
UWAGA: Należy ustawiać tylko te wersje protokołu, które są obsługiwane przez .NET Framework. Jeśli niektóre wersje protokołu kryptograficznego nie są obsługiwane przez Twoją bieżącą wersję .NET Framework, zostaną one zignorowane i pominięte. W takim przypadku wyjątki nie będą generowane. Proszę używać SetSupportedEncryptionUnsafe metodą, jeśli chcesz ustawić protokoły bez żadnych kontroli kompatybilności.
Poniższy przykład kodu pokazuje, jak ustawić TLS 1.3 dla ImapClient instancję klasy.
using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
imapClient.SupportedEncryption = EncryptionProtocols.Tls13;
// some code...
}
W przypadku, gdy określony protokół szyfrowania nie jest obsługiwany w bieżącej wersji .NET Framework, różnica w zachowaniu między SetSupportedEncryptionUnsafe metoda i SupportedEncryption właściwość jest następująca:
- Jeśli SupportedEncryption gdy właściwość jest używana, klient poczty obniża protokół szyfrowania do obsługiwanego poziomu.
- Jeśli SetSupportedEncryptionUnsafe gdy metoda jest używana, klient poczty zgłasza wyjątki.
Użycie polecenia IMAP IDLE
API Aspose.Email ImapClient umożliwia otwarcie połączenia z serwerem i oczekiwanie na przyjście wiadomości e‑mail. Dzięki temu unika się ciągłego odpytywania serwera o nowe wiadomości. Poniższy fragment kodu demonstruje, jak używać biblioteki Aspose.Email do monitorowania skrzynki odbiorczej IMAP pod kątem nowych i usuniętych wiadomości oraz wykonywania określonych działań w zależności od tych zdarzeń:
// 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);
Poniższy przykład kodu pokazuje, jak skonfigurować asynchroniczne monitorowanie nowych wiadomości e‑mail:
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
}
Obsługa rozszerzeń IMAP
API Aspose.Email zapewnia obsługę rozszerzeń IMAP. Obecnie API obsługuje następujące rozszerzenia IMAP. Nie wszystkie serwery obsługują te rozszerzenia 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);
}
Rozszerzone polecenie listy IMAP4
Poniższy fragment kodu pokazuje, jak używać rozszerzonego polecenia listy 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;
}
}
}