Jak navázat IMAP spojení v C#
Výpis rozšíření IMAP serveru
Aspose.Email ImapClient umožňuje získat rozšíření serveru, která server podporuje, jako IDLE, UNSELECT, QUOTA atd. To pomáhá identifikovat dostupnost rozšíření před použitím klienta pro danou funkci. The GetCapabilities() metoda vrací podporované typy rozšíření jako pole řetězců. Následující úryvek kódu ukazuje, jak získat rozšíření.
Standardní IMAP spojení
The ImapClient třída umožňuje aplikacím spravovat IMAP poštovní schránky pomocí protokolu IMAP. ImapClient třída se používá pro připojení k IMAP poštovním serverům a správu e‑mailů ve složkách IMAP. Pro připojení k IMAP serveru
- Vytvořte instanci ImapClient třída.
- Zadejte název hostitele, uživatelské jméno a heslo v ImapClient constructor.
Poznámka: omezení hesla musí splňovat požadavky serveru. E‑mailový klient nepřidává žádná omezení hesla.
Jakmile ImapClient instance je inicializována, další volání jakékoli operace s touto instancí se připojí k serveru. Následující úryvek kódu ukazuje, jak se připojit k IMAP serveru pomocí výše uvedených kroků.
// 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 spojení s povoleným SSL
Připojení k IMAP serveru popisuje, jak se připojit k IMAP serveru ve čtyřech jednoduchých krocích:
- Vytvořte instanci ImapClient třída.
- Zadejte název hostitele, uživatelské jméno a heslo.
- Zadejte port.
- Určete bezpečnostní možnosti.
Proces připojení k IMAP serveru s povoleným SSL je podobný, ale vyžaduje nastavení několika dalších vlastností:
- Nastavit SecurityOptions na SSLImplicit.
Následující úryvek kódu ukazuje, jak
- Nastavte uživatelské jméno, heslo a port.
- Nastavte volbu zabezpečení.
// 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;
Nastavení připojení přes proxy
Připojení k serveru přes proxy
Proxy servery se běžně používají pro komunikaci s vnějším světem. V takových případech poštovní klienti nemohou komunikovat přes internet bez zadání adresy proxy. Aspose.Email podporuje verze 4, 4a a 5 protokolu SOCKS proxy. Tento článek poskytuje funkční ukázku přístupu ke schránce pomocí proxy poštovního serveru. Pro přístup ke schránce přes proxy server:
- Inicializovat SocksProxy s požadovanými informacemi, tj. adresou proxy, portem a verzí SOCKS.
- Inicializovat ImapClient s adresou hostitele, uživatelským jménem, heslem a dalšími nastaveními.
- Nastavte klientovo SocksProxy vlastnost klienta na SocksProxy objekt vytvořený výše.
Následující úryvek kódu ukazuje, jak získat poštovní schránku přes proxy server.
// 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);
}
Připojení k serveru přes 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");
}
Připojení v režimu jen pro čtení
The ImapClient třída poskytuje ReadOnly vlastnost, která při nastavení na true znamená, že se nemají provádět žádné změny v trvalém stavu poštovní schránky. Následující ukázkový kód demonstruje použití ImapClient.ReadOnly vlastnost. Získá počet nepřečtených zpráv, poté načte jednu zprávu a znovu získá počet nepřečtených zpráv v režimu jen pro čtení. Počet nepřečtených zpráv zůstane stejný, což naznačuje, že trvalý stav poštovní schránky nebyl změněn.
// 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");
}
Nastavení autentizace CRAM-MD5
Pro bezpečnou autentizaci a přístup k e‑mailovému serveru nabízí Aspose.Email pro .NET metodu autentizace CRAM-MD5. Následující úryvek kódu vám ukáže, jak funguje s ImapClient:
imapClient.AllowedAuthentication = ImapKnownAuthenticationType.CramMD5;
Nastavování časových limitů pro IMAP operace
Každá operace s poštou trvá určitý čas v závislosti na mnoha faktorech (zpoždění sítě, velikost dat, výkonnost serveru atd.). Můžete nastavit časový limit pro všechny operace s poštou. Níže uvedený příklad kódu ukazuje, jak to provést pomocí Časový limit vlastnost. Poznámka: neměli byste nastavovat velké hodnoty, aby nedocházelo k dlouhému čekání ve vaší aplikaci.
Nastavit časový limit operace
using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
imapClient.Timeout = 60000; // 60 seconds
// some code...
}
Omezit časový limit uvítání
IMAP klient může použít automatický režim pro navázání spojení. V tomto režimu klient prochází všechny možné parametry spojení, dokud není spojení navázáno. IMAP server v případě správného spojení pošle klientovi uvítací řetězec. Servery mohou použít implicitní nebo explicitní (START TLS) zahájení SSL/TLS spojení. Pokud je režim spojení nesouladný (např. server čeká na implicitní SSL spojení, ale klient se pokouší navázat nešifrované nebo explicitní SSL spojení), server nepošle uvítací řetězec a uživatel bude čekat dlouho, až časový limit vyprší, a klient přejde na další možnost spojení. K vyhnutí se tomuto problému byla zavedena vlastnost GreetingTimeout. Tato vlastnost umožňuje nastavit časový limit pro uvítací řetězec a zkrátit dobu automatického navazování spojení.
using (ImapClient client = new ImapClient("localhost", 993, "username", "password"))
{
client.GreetingTimeout = 4000;
client.SelectFolder(ImapFolderInfo.InBox);
}
Použití kryptografických protokolů s IMAP
Aspose.Email podporuje kryptografické protokoly SSL (zastaralý) a TLS pro zajištění bezpečnosti komunikace. Můžete povolit kryptografické šifrování k ochraně výměny dat mezi vaší aplikací a poštovními servery.
POZNÁMKA: Měli byste nastavit pouze ty verze protokolu, které jsou podporovány .NET Framework. Pokud některé verze kryptografického protokolu nejsou podporovány vaší aktuální verzí .NET Framework, budou ignorovány a přeskočeny. V takovém případě nebudou generovány výjimky. Použijte prosím SetSupportedEncryptionUnsafe metodou, pokud chcete nastavit protokoly bez jakýchkoli kontrol kompatibility.
Níže uvedený příklad kódu ukazuje, jak nastavit TLS 1.3 pro ImapClient instance třídy.
using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
imapClient.SupportedEncryption = EncryptionProtocols.Tls13;
// some code...
}
V případě, že specifikovaný šifrovací protokol není podporován v aktuální verzi .NET Framework, rozdíl v chování mezi SetSupportedEncryptionUnsafe metoda a SupportedEncryption vlastnost je následující:
- Pokud SupportedEncryption pokud je použita vlastnost, e‑mailový klient sníží úroveň šifrovacího protokolu na podporovanou úroveň.
- Pokud SetSupportedEncryptionUnsafe když je metoda použita, e‑mailový klient vyvolá výjimky.
Použití příkazu IMAP IDLE
API Aspose.Email ImapClient poskytuje možnost otevřít spojení k serveru a čekat na příchod e‑mailové zprávy. To umožňuje vyhnout se opakovanému dotazování serveru na příchozí poštu. Následující úryvek kódu demonstruje, jak použít knihovnu Aspose.Email k monitorování IMAP schránky na nové a smazané zprávy a následně provést konkrétní akce na základě těchto událostí:
// 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);
Následující ukázkový kód ukazuje, jak nastavit asynchronní sledování nových e‑mailových zpráv:
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
}
Podpora rozšíření IMAP
API Aspose.Email poskytuje podporu rozšíření IMAP. Následující rozšíření IMAP jsou v současné době podporována API. Tato rozšíření IMAP nejsou podporována všemi servery.
// 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);
}
Rozšířený příkaz LIST v IMAP4
Následující úryvek kódu ukazuje, jak použít rozšířený příkaz LIST v 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;
}
}
}