Hur man upprättar IMAP‑anslutningar i C#

Lista IMAP‑serverutökningar

Aspose.Email’s ImapClient låter dig hämta serverutökningar som en server stöder, såsom IDLE, UNSELECT, QUOTA etc. Detta hjälper till att identifiera tillgängligheten för en utökning innan klienten använder den specifika funktionen. GetCapabilities() metod returnerar de stödda tilläggstyperna som en strängarray. Följande kodavsnitt visar hur du hämtar tillägg.

Standard‑IMAP‑anslutning

Den ImapClient klassen låter applikationer hantera IMAP‑brevlådor med IMAP‑protokollet. ImapClient klassen används för att ansluta till IMAP‑mailservrar och hantera e‑post i IMAP‑mailmappar. För att ansluta till en IMAP‑server

  1. Skapa en instans av ImapClient klass.
  2. Ange värdnamn, användarnamn och lösenord i ImapClient‑konstruktor.

Observera att lösenordsrestriktioner måste uppfylla serverns krav. E‑postklienten lägger inte till lösenordsrestriktioner.

När ImapClient instansen initieras, nästa anrop till någon operation med denna instans kommer att ansluta till servern. Följande kodsnutt visar hur du ansluter till en IMAP‑server med stegen ovan.

// 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‑aktiverad IMAP‑anslutning

Ansluta med IMAP‑server beskrev hur man ansluter till en IMAP‑server i fyra enkla steg:

  1. Skapa en instans av ImapClient klass.
  2. Ange värdnamn, användarnamn och lösenord.
  3. Ange porten.
  4. Ange säkerhetsalternativen.

Processen för att ansluta till en SSL‑aktiverad IMAP‑server är liknande men kräver att du sätter några ytterligare egenskaper:

Följande kodsnutt visar hur man

  1. Ange användarnamn, lösenord och port.
  2. Ange säkerhetsalternativ.
// 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‑anslutningsinställning

Ansluta till server via proxy

Proxy‑servrar används ofta för att kommunicera med omvärlden. I sådana fall kan e‑postklienter inte kommunicera över Internet utan att ange proxyadressen. Aspose.Email stödjer versionerna 4, 4a och 5 av SOCKS‑proxy‑protokollet. Denna artikel ger ett fungerande exempel på hur man får åtkomst till brevlådan via en proxy‑mailserver. Så här får du åtkomst till brevlådan via en proxy‑server:

  1. Initiera SocksProxy med den nödvändiga informationen, dvs proxyadress, port och SOCKS‑version.
  2. Initiera ImapClient med värdadress, användarnamn, lösenord och eventuella andra inställningar.
  3. Ställ in klientens SocksProxy egenskap hos klienten till SocksProxy objekt skapat ovan.

Följande kodsnutt visar hur du hämtar brevlådan via en 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);
}

Ansluta till 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");
}

Anslutning i skrivskyddat läge

Den ImapClient klass tillhandahåller en ReadOnly egenskap som när den sätts till true indikerar att inga ändringar ska göras i brevlådans permanenta tillstånd. Följande kodexempel visar användningen av ImapClient.ReadOnly egenskap. Den hämtar antalet olästa meddelanden, hämtar sedan ett meddelande och hämtar åter antalet olästa meddelanden i skrivskyddat läge. Antalet olästa meddelanden förblir detsamma, vilket indikerar att brevlådans permanenta tillstånd inte ändrades.

// 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‑autentiseringsinställning

För säker autentisering och åtkomst till e‑postservern erbjuder Aspose.Email för .NET en CRAM‑MD5‑autentiseringsmetod. Följande kodsnutt visar hur den fungerar med ImapClient:

imapClient.AllowedAuthentication = ImapKnownAuthenticationType.CramMD5;

Ställa in timeout för IMAP‑operationer

Varje e‑postoperation tar tid beroende på många faktorer (nätverksfördröjningar, datastorlek, serverprestanda osv.). Du kan sätta en timeout för alla e‑postoperationer. Kodexemplet nedan visar hur du gör det med Timeout egenskap. Obs: du bör inte sätta stora värden för att undvika långa väntetider i din applikation.

Konfigurera operationstimeout

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

    // some code...
}

Begränsa hälsningstimeout

IMAP‑klienten kan använda automatiskt läge för att upprätta en anslutning. I detta läge går IMAP‑klienten igenom alla möjliga anslutningsparametrar tills anslutningen etableras. En IMAP‑server skickar en hälsningssträng till klienten vid korrekt anslutning. Servrar kan använda implicit eller explicit (START TLS) SSL/TLS‑initiering. Om anslutningsläget inte matchar (t.ex. servern väntar på en implicit SSL‑anslutning men klienten försöker upprätta en icke‑säker eller explicit SSL‑anslutning), skickar inte servern en hälsningssträng och användaren får vänta länge tills timeouten inträffar, och klienten går vidare till nästa anslutningsalternativ. För att undvika detta problem har egenskapen GreetingTimeout införts. Denna egenskap låter dig ange timeout för hälsningssträngen och minska tiden för automatisk anslutningsetablering.

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

Använda kryptografiska protokoll med IMAP

Aspose.Email stöder SSL (föråldrat) och TLS‑kryptografiska protokoll för att erbjuda kommunikationssäkerhet. Du kan aktivera kryptografisk kryptering för att skydda datautbytet mellan din applikation och e‑postservrar.

OBS! Du bör endast ange de versioner av protokollet som stöds av .NET Framework. Om vissa versioner av det kryptografiska protokollet inte stöds av din nuvarande version av .NET Framework ignoreras och hoppas över dem. I så fall genereras inga undantag. Använd SetSupportedEncryptionUnsafe metod om du vill ställa in protokollen utan några kompatibilitetskontroller.

Kodexemplet nedan visar hur du ställer in TLS 1.3 för ImapClient klassinstans.

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

    // some code...
}

Om ett angivet krypteringsprotokoll inte stöds i den nuvarande versionen av .NET Framework, är skillnaden i beteende mellan SetSupportedEncryptionUnsafe metod och SupportedEncryption egenskapen är följande:

Använda IMAP IDLE‑kommando

Aspoe.Email API:er ImapClient ger möjlighet att öppna en anslutning till servern och vänta på att ett e‑postmeddelande anländer. Detta gör att man undviker att pollera servern upprepade gånger för inkommande e‑post. Följande kodsnutt demonstrerar hur man använder Aspose.Email‑biblioteket för att övervaka en IMAP‑inkorg för nya och borttagna meddelanden, och sedan utföra specifika åtgärder baserat på dessa händelser:

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

Följande kodexempel visar hur man konfigurerar asynkron övervakning av nya e‑postmeddelanden:

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
}

Stöd för IMAP-tillägg

Aspose.Email API ger stöd för IMAP-tillägg. Följande IMAP-tillägg stöds för närvarande av API:et. Dessa IMAP-tillägg stöds inte av alla servrar.

// 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 utökade listkommando

Följande kodsnutt visar hur du använder IMAP4:s utökade listkommando.

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