Wie man IMAP‑Verbindungen in C# herstellt

Auflisten von IMAP‑Server‑Erweiterungen

von Aspose.Email ImapClient ermöglicht das Abrufen der Server‑Erweiterungen, die ein Server unterstützt, wie IDLE, UNSELECT, QUOTA usw. Dies hilft, die Verfügbarkeit einer Erweiterung zu erkennen, bevor der Client für diese Funktionalität verwendet wird. Die GetCapabilities() Methode gibt die unterstützten Erweiterungstypen als String‑Array zurück. Das folgende Codefragment zeigt, wie man Erweiterungen abruft.

Standard‑IMAP‑Verbindung

Die ImapClient Klasse ermöglicht Anwendungen, IMAP‑Postfächer über das IMAP‑Protokoll zu verwalten. Die ImapClient Klasse wird verwendet, um sich mit IMAP‑Mail‑Servern zu verbinden und E‑Mails in den IMAP‑Ordnern zu verwalten. Um sich mit einem IMAP‑Server zu verbinden

  1. Erstellen Sie eine Instanz von dem ImapClient Klasse.
  2. Hostname, Benutzernamen und Passwort angeben im ImapClient constructor.

Hinweis: Passwortrichtlinien müssen den Anforderungen des Servers entsprechen. Der E‑Mail‑Client fügt keine Passwortrichtlinien hinzu.

Sobald das ImapClient Instanz wird initialisiert, der nächste Aufruf einer Operation mit dieser Instanz stellt die Verbindung zum Server her. Das folgende Code‑Snippet zeigt, wie man mit den obigen Schritten eine Verbindung zu einem IMAP‑Server herstellt.

// 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‑aktivierte IMAP‑Verbindung

Verbindung mit IMAP‑Server beschrieb, wie man in vier einfachen Schritten eine Verbindung zu einem IMAP‑Server herstellt:

  1. Erstellen Sie eine Instanz von dem ImapClient Klasse.
  2. Hostname, Benutzernamen und Passwort angeben.
  3. Port angeben.
  4. Geben Sie die Sicherheitsoptionen an.

Der Vorgang zum Verbinden mit einem SSL‑aktivierten IMAP‑Server ist ähnlich, erfordert jedoch das Setzen einiger weiterer Eigenschaften:

Das folgende Code‑Snippet zeigt, wie man

  1. Legen Sie einen Benutzernamen, ein Passwort und einen Port fest.
  2. Sicherheitsoption festlegen.
// 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‑Verbindungs‑Setup

Verbindung zu einem Server über Proxy herstellen

Proxy‑Server werden häufig verwendet, um mit der Außenwelt zu kommunizieren. In solchen Fällen können E‑Mail‑Clients nicht über das Internet kommunizieren, ohne die Proxy‑Adresse anzugeben. Aspose.Email unterstützt die Versionen 4, 4a und 5 des SOCKS‑Proxy‑Protokolls. Dieser Artikel liefert ein funktionierendes Beispiel zum Zugriff auf das Postfach über einen Proxy‑Mail‑Server. So greifen Sie über einen Proxy‑Server auf das Postfach zu:

  1. Initialisieren SocksProxy mit den erforderlichen Angaben, also Proxy‑Adresse, Port und SOCKS‑Version.
  2. Initialisieren ImapClient mit Hostadresse, Benutzernamen, Passwort und weiteren Einstellungen.
  3. Setzen Sie die des Clients SocksProxy Eigenschaft des Clients zu SocksProxy Objekt, das oben erstellt wurde.

Das folgende Code‑Snippet zeigt, wie man ein Postfach über einen Proxy‑Server abruft.

// 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);
}

Verbindung zum Server über 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");
}

Verbindung im Nur‑Lese‑Modus

Die ImapClient Klasse stellt ein ReadOnly Eigenschaft, die, wenn sie auf true gesetzt wird, anzeigt, dass keine Änderungen am permanenten Zustand des Postfachs vorgenommen werden dürfen. Das folgende Codebeispiel demonstriert die Verwendung von ImapClient.ReadOnly Eigenschaft. Sie ermittelt die Anzahl ungelesener Nachrichten, holt dann eine Nachricht und ermittelt anschließend erneut die Anzahl ungelesener Nachrichten im Nur‑Lese‑Modus. Die Anzahl bleibt gleich, was zeigt, dass der permanente Zustand des Postfachs nicht verändert wurde.

// 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‑Authentifizierungs‑Setup

Für sichere Authentifizierung und Zugriff auf den E‑Mail‑Server bietet Aspose.Email für .NET eine CRAM‑MD5‑Authentifizierungsmethode. Das folgende Code‑Snippet zeigt, wie es mit dem ImapClient funktioniert:

imapClient.AllowedAuthentication = ImapKnownAuthenticationType.CramMD5;

Timeouts für IMAP‑Operationen festlegen

Jeder E‑Mail‑Vorgang benötigt je nach vielen Faktoren (Netzwerkverzögerungen, Datenmenge, Server‑Leistung usw.) gewisse Zeit. Sie können für alle E‑Mail‑Vorgänge einen Timeout festlegen. Das nachstehende Code‑Beispiel zeigt, wie Sie das mit dem Timeout Eigenschaft. Hinweis: Sie sollten keine großen Werte setzen, um lange Wartezeiten in Ihrer Anwendung zu vermeiden.

Betriebs‑Timeout konfigurieren

using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
    imapClient.Timeout = 60000; // 60 seconds

    // some code...
}

Begrüßungs‑Timeout einschränken

Der IMAP‑Client kann den automatischen Modus verwenden, um eine Verbindung herzustellen. In diesem Modus durchläuft der IMAP‑Client alle möglichen Verbindungsparameter, bis die Verbindung aufgebaut ist. Ein IMAP‑Server sendet bei einer korrekten Verbindung eine Begrüßungszeichenkette an den Client. Server können implizite oder explizite (START TLS) SSL/TLS‑Verbindungsinitialisierung verwenden. Wenn der Verbindungsmodus nicht übereinstimmt (z. B. wartet der Server auf eine implizite SSL‑Verbindung, der Client jedoch versucht, eine nicht gesicherte oder explizite SSL‑Verbindung herzustellen), sendet der Server keine Begrüßungszeichenkette und der Benutzer wartet lange, bis das Timeout die Begrüßungszeichenkette erreicht, woraufhin der Client zur nächsten Verbindungsoption wechselt. Um dieses Problem zu vermeiden, wurde die Eigenschaft GreetingTimeout eingeführt. Diese Eigenschaft ermöglicht es, das Timeout für die Begrüßungszeichenkette festzulegen und die Zeit für die automatische Verbindungsherstellung zu verkürzen.

using (ImapClient client = new ImapClient("localhost", 993, "username", "password"))
{
    client.GreetingTimeout = 4000;
    client.SelectFolder(ImapFolderInfo.InBox);
}

Verwendung kryptographischer Protokolle mit IMAP

Aspose.Email unterstützt die kryptografischen Protokolle SSL (veraltet) und TLS, um Kommunikationssicherheit zu bieten. Sie können die kryptografische Verschlüsselung aktivieren, um den Datenaustausch zwischen Ihrer Anwendung und den Mail‑Servern zu schützen.

HINWEIS: Sie sollten nur jene Versionen des Protokolls festlegen, die vom .NET‑Framework unterstützt werden. Wenn einige Versionen des kryptografischen Protokolls von Ihrer aktuellen .NET‑Framework‑Version nicht unterstützt werden, werden sie ignoriert und übersprungen. In diesem Fall werden keine Ausnahmen erzeugt. Bitte verwenden Sie SetSupportedEncryptionUnsafe Methode, wenn Sie die Protokolle ohne Kompatibilitätsprüfungen festlegen möchten.

Das untenstehende Codebeispiel zeigt, wie Sie TLS 1.3 für ImapClient Klasseninstanz.

using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
    imapClient.SupportedEncryption = EncryptionProtocols.Tls13;

    // some code...
}

Falls ein angegebenes Verschlüsselungsprotokoll in der aktuellen Version des .NET‑Frameworks nicht unterstützt wird, besteht der Unterschied im Verhalten zwischen SetSupportedEncryptionUnsafe Methode und SupportedEncryption Eigenschaft ist wie folgt:

  • Wenn SupportedEncryption Wird die Eigenschaft verwendet, reduziert der E‑Mail‑Client das Verschlüsselungsprotokoll auf ein unterstütztes Niveau.
  • Wenn SetSupportedEncryptionUnsafe Wird die Methode verwendet, wirft der E‑Mail‑Client Ausnahmen.

Verwendung des IMAP‑IDLE‑Befehls

Aspose.Email‑APIs ImapClient bietet die Möglichkeit, eine Verbindung zum Server zu öffnen und auf das Eintreffen einer E‑Mail‑Nachricht zu warten. Dadurch wird mehrfaches Abfragen des Servers nach eingehenden E‑Mails vermieden. Das folgende Code‑Snippet demonstriert, wie man die Aspose.Email‑Bibliothek verwendet, um einen IMAP‑Posteingang auf neue und gelöschte Nachrichten zu überwachen und basierend auf diesen Ereignissen spezifische Aktionen auszuführen:

// 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);

Das folgende Beispiel zeigt, wie man asynchrones Monitoring für neue E‑Mail‑Nachrichten einrichtet:

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
}

Unterstützung für IMAP‑Erweiterungen

Aspose.Email API bietet Unterstützung für IMAP‑Erweiterungen. Die folgenden IMAP‑Erweiterungen werden derzeit von der API unterstützt. Diese IMAP‑Erweiterungen werden nicht von allen Servern unterstützt.

// 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);
}

Erweiterter LIST‑Befehl von IMAP4

Das folgende Code‑Snippet zeigt, wie der erweiterte LIST‑Befehl von IMAP4 verwendet wird.

// 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;
        }
    }
}