Hoe IMAP‑verbindingen tot stand te brengen in C#
Lijst van IMAP‑serverextensies
Aspose.Email’s ImapClient stelt je in staat om de serverextensies op te halen die een server ondersteunt, zoals IDLE, UNSELECT, QUOTA, enz. Dit helpt bij het identificeren van de beschikbaarheid van een extensie voordat de client die functionaliteit gebruikt. De GetCapabilities() methode retourneert de ondersteunde extensietypen in de vorm van een stringarray. Het onderstaande codefragment laat zien hoe je extensies kunt ophalen.
Standaard IMAP‑verbinding
De ImapClient klasse stelt applicaties in staat IMAP‑mailboxes te beheren met het IMAP‑protocol. De ImapClient klasse wordt gebruikt om verbinding te maken met IMAP‑mailservers en e‑mails te beheren in IMAP‑mailmappen. Om verbinding te maken met een IMAP‑server
- Maak een instantie van de ImapClient klasse.
- Specificeer de hostnaam, gebruikersnaam en wachtwoord in de ImapClient‑constructor.
Opmerking: wachtwoordbeperkingen moeten voldoen aan de eisen van de server. De e‑mailclient voegt geen wachtwoordbeperkingen toe.
Zodra de ImapClient De instantie wordt geïnitialiseerd; de volgende oproep tot een bewerking met deze instantie zal verbinding maken met de server. Het onderstaande codefragment toont hoe u met de bovenstaande stappen verbinding maakt met een IMAP‑server.
// 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");
SSL‑ingeschakelde IMAP‑verbinding
Verbinden met IMAP‑server beschrijft hoe u in vier eenvoudige stappen verbinding maakt met een IMAP‑server:
- Maak een instantie van de ImapClient klasse.
- Specificeer de hostnaam, gebruikersnaam en wachtwoord.
- Specificeer de poort.
- Geef de beveiligingsopties op.
Het proces om verbinding te maken met een SSL‑ingeschakelde IMAP‑server is vergelijkbaar, maar vereist dat u nog enkele eigenschappen instelt:
- Instellen SecurityOptions naar SSLImplicit.
Het onderstaande codefragment toont hoe u
- Stel een gebruikersnaam, wachtwoord en poort in.
- Stel beveiligingsoptie in.
// 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;
Proxy‑verbinding instellen
Verbinden met server via proxy
Proxy‑servers worden vaak gebruikt om met de buitenwereld te communiceren. In zulke gevallen kunnen mailclients niet via internet communiceren zonder het proxy‑adres op te geven. Aspose.Email ondersteunt de SOCKS‑proxy‑protocolversies 4, 4a en 5. Dit artikel geeft een werkend voorbeeld voor het benaderen van een mailbox via een proxy‑mailserver. Om de mailbox via een proxy‑server te benaderen:
- Initialiseren SocksProxy met de vereiste informatie, namelijk proxy‑adres, poort en SOCKS‑versie.
- Initialiseren ImapClient met host‑adres, gebruikersnaam, wachtwoord en eventuele andere instellingen.
- Stel de client‑ SocksProxy eigenschap van de client naar de SocksProxy object hierboven aangemaakt.
Het onderstaande codefragment toont hoe u een mailbox via een proxy‑server kunt ophalen.
// 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);
}
Verbinden met Server via 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");
}
Alleen‑lezen‑modus verbinding
De ImapClient klasse biedt een ReadOnly eigenschap die, wanneer ingesteld op true, aangeeft dat er geen wijzigingen mogen worden aangebracht in de permanente staat van de mailbox. Het volgende codevoorbeeld demonstreert het gebruik van ImapClient.ReadOnly eigenschap. Deze haalt het aantal ongelezen berichten op, haalt vervolgens één bericht op en haalt daarna opnieuw het aantal ongelezen berichten op in alleen‑lezen modus. Het aantal ongelezen berichten blijft gelijk, wat aangeeft dat de permanente staat van de mailbox niet is veranderd.
// 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‑authenticatie‑instelling
Voor veilige authenticatie en toegang tot de e‑mailserver biedt Aspose.Email voor .NET een CRAM‑MD5‑authenticatiemethode. Het onderstaande code‑fragment toont hoe dit werkt met de ImapClient:
imapClient.AllowedAuthentication = ImapKnownAuthenticationType.CramMD5;
Instellen van time‑outs voor IMAP‑bewerkingen
Elke e‑mailbewerking kost tijd, afhankelijk van veel factoren (netwerkvertragingen, datagrootte, serverprestaties, enz.). U kunt een time‑out instellen voor alle e‑mailbewerkingen. Het code‑voorbeeld hieronder laat zien hoe u dat doet met behulp van de Time‑out eigenschap. Opmerking: u moet geen grote waarden instellen om lange wachttijden in uw applicatie te voorkomen.
Configureer bewerking‑timeout
using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
imapClient.Timeout = 60000; // 60 seconds
// some code...
}
Beperk begroeting‑timeout
De IMAP‑client kan de automatische modus gebruiken om een verbinding tot stand te brengen. In deze modus doorloopt de IMAP‑client alle mogelijke verbindingsparameters totdat de verbinding tot stand is gekomen. Een IMAP‑server stuurt bij een correcte verbinding een begroetingsreeks naar de client. Servers kunnen impliciete of expliciete (START TLS) SSL/TLS‑verbindingen initiëren. Als de verbindingsmodus niet overeenkomt (bijvoorbeeld de server wacht op een impliciete SSL‑verbinding terwijl de client een niet‑beveiligde of expliciete SSL‑verbinding probeert), stuurt de server geen begroetingsreeks en moet de gebruiker lang wachten totdat de timeout de begroetingsreeks bereikt, waarna de client naar de volgende verbindingsoptie gaat. Om dit probleem te vermijden, is de eigenschap GreetingTimeout geïntroduceerd. Deze eigenschap stelt je in staat de timeout voor de begroetingsreeks in te stellen en de tijd voor automatische verbindingstichting te verkorten.
using (ImapClient client = new ImapClient("localhost", 993, "username", "password"))
{
client.GreetingTimeout = 4000;
client.SelectFolder(ImapFolderInfo.InBox);
}
Gebruik cryptografische protocollen met IMAP
Aspose.Email ondersteunt SSL (verouderd) en TLS‑cryptografische protocollen om communicatieveiligheid te bieden. U kunt cryptografische encryptie inschakelen om de gegevensuitwisseling tussen uw applicatie en mailservers te beschermen.
OPMERKING: U dient alleen die versies van het protocol in te stellen die ondersteund worden door .NET Framework. Als sommige versies van het cryptografische protocol niet ondersteund worden door uw huidige versie van .NET Framework, worden ze genegeerd en overgeslagen. In dat geval worden er geen uitzonderingen gegenereerd. Gebruik alstublieft SetSupportedEncryptionUnsafe methode als u de protocollen wilt instellen zonder compatibiliteitscontroles.
Het onderstaande codevoorbeeld laat zien hoe je TLS 1.3 instelt voor ImapClient klasse‑instantie.
using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
imapClient.SupportedEncryption = EncryptionProtocols.Tls13;
// some code...
}
In het geval dat een opgegeven encryptieprotocol niet wordt ondersteund in de huidige versie van .NET Framework, is het verschil in gedrag tussen SetSupportedEncryptionUnsafe methode en SupportedEncryption eigenschap is het volgende:
- Als SupportedEncryption eigenschap wordt gebruikt, downgraden de e‑mailclient het versleutelingsprotocol naar een ondersteund niveau.
- Als SetSupportedEncryptionUnsafe methode wordt gebruikt, gooit de e‑mailclient uitzonderingen.
Gebruik IMAP IDLE‑opdracht
Aspose.Email API’s ImapClient biedt de mogelijkheid om een verbinding met de server te openen en te wachten op de aankomst van een e‑mailbericht. Dit voorkomt dat je de server voortdurend pollt voor inkomende e‑mail. Het onderstaande code‑fragment demonstreert hoe je de Aspose.Email‑bibliotheek gebruikt om een IMAP‑mailbox te monitoren op nieuwe en verwijderde berichten, en vervolgens specifieke acties uit te voeren op basis van deze gebeurtenissen:
// 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);
Het onderstaande codevoorbeeld laat zien hoe je asynchrone monitoring voor nieuwe e‑mailberichten instelt:
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
}
Ondersteuning voor IMAP‑extensies
Aspose.Email API biedt ondersteuning voor IMAP‑extensies. De volgende IMAP‑extensies worden momenteel door de API ondersteund. Deze IMAP‑extensies worden niet door alle servers ondersteund.
// 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);
}
IMAP4 Uitgebreid Lijst‑commando
De volgende code‑snippet toont hoe je het uitgebreide lijst‑commando van IMAP4 gebruikt.
// 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;
}
}
}