C#'ta IMAP Bağlantıları Kurma

IMAP Sunucu Uzantılarını Listeleme

Aspose.Email’in ImapClient size, IDLE, UNSELECT, QUOTA vb. gibi bir sunucunun desteklediği uzantıları almanızı sağlar. Bu, istemciyi o belirli işlevselliği kullanmadan önce bir uzantının mevcut olup olmadığını belirlemenize yardımcı olur. GetCapabilities() metot, desteklenen uzantı türlerini bir dizi string olarak döndürür. Aşağıdaki kod parçacığı, uzantıların nasıl alınacağını gösterir.

Standart IMAP Bağlantısı

Bu ImapClient sınıf, uygulamaların IMAP protokolünü kullanarak IMAP posta kutularını yönetmesine izin verir. ImapClient sınıf, IMAP posta sunucularına bağlanmak ve IMAP e-posta klasörlerindeki e-postaları yönetmek için kullanılır. Bir IMAP sunucusuna bağlanmak için

  1. Şunun bir örneğini oluştur ImapClient sınıf.
  2. Ana bilgisayar adını, kullanıcı adını ve şifreyi şunun içinde belirt ImapClient yapıcı.

Not: Şifre kısıtlamaları sunucunun gereksinimlerini karşılamalıdır. E-posta istemcisi şifre kısıtlamaları eklemez.

Bir kez ImapClient örnek başlatıldıktan sonra, bu örnekle yapılan bir sonraki işlem sunucuya bağlanır. Aşağıdaki kod parçacığı, yukarıdaki adımları kullanarak bir IMAP sunucusuna nasıl bağlanılacağını gösterir.

// 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 Etkinleştirilmiş IMAP Bağlantısı

IMAP Sunucusuna Bağlanma bir IMAP sunucusuna dört basit adımda nasıl bağlanılacağını açıkladı:

  1. Şunun bir örneğini oluştur ImapClient sınıf.
  2. Ana bilgisayar adını, kullanıcı adını ve şifreyi belirt.
  3. Portu belirt.
  4. Güvenlik Seçeneklerini Belirtin.

SSL etkin bir IMAP sunucusuna bağlanma süreci benzerdir, ancak birkaç ek özelliği ayarlamanız gerekir:

Aşağıdaki kod parçacığı, nasıl yapılacağını gösterir

  1. Kullanıcı adı, şifre ve port ayarla.
  2. Güvenlik seçeneğini ayarlayın.
// 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 Bağlantı Ayarı

Proxy Üzerinden Sunucuya Bağlanma

Proxy sunucular, dış dünya ile iletişimde yaygın olarak kullanılır. Bu durumlarda, e-posta istemcileri proxy adresi belirtilmeden internet üzerinden iletişim kuramaz. Aspose.Email, SOCKS proxy protokolünün 4, 4a ve 5. sürümlerini destekler. Bu makale, bir proxy posta sunucusu kullanarak posta kutusuna erişim örneği sunar. Proxy sunucu aracılığıyla posta kutusuna erişmek için:

  1. Başlat SocksProxy gerekli bilgilerle, yani proxy adresi, port ve SOCKS sürümüyle.
  2. Başlat ImapClient host adresi, kullanıcı adı, şifre ve diğer ayarlarla.
  3. İstemcinin … ayarlayın SocksProxy istemcinin özelliği SocksProxy yukarıda oluşturulan nesne.

Aşağıdaki kod parçacığı, bir proxy sunucusu aracılığıyla posta kutusunun nasıl alınacağını gösterir.

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

HTTP Proxy ile Sunucuya Bağlanma

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

Salt Okunur Mod Bağlantısı

Bu ImapClient sınıf bir … sağlar ReadOnly true olarak ayarlandığında, posta kutusunun kalıcı durumunda değişiklik yapılmaması gerektiğini belirten özelliktir. Aşağıdaki kod örneği, kullanımını gösterir ImapClient.ReadOnly özelliği. Okunmamış mesaj sayısını alır, ardından bir mesaj getirir ve tekrar okuma‑sadece modunda okunmamış mesaj sayısını alır. Okunmamış mesaj sayısı aynı kalır, bu da posta kutusunun kalıcı durumunun değişmediğini gösterir.

// 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 Kimlik Doğrulama Ayarı

Güvenli kimlik doğrulama ve e-posta sunucusuna erişim için Aspose.Email for .NET, bir CRAM-MD5 kimlik doğrulama yöntemi sunar. Aşağıdaki kod parçacığı, bunun ImapClient ile nasıl çalıştığını gösterecek:

imapClient.AllowedAuthentication = ImapKnownAuthenticationType.CramMD5;

IMAP İşlemleri için Zaman Aşımı Ayarları

Her e-posta işlemi, birçok faktöre (ağ gecikmeleri, veri boyutu, sunucu performansı vb.) bağlı olarak bir süre alır. Tüm e-posta işlemleri için bir zaman aşımı ayarlayabilirsiniz. Aşağıdaki kod örneği, bunu şu şekilde yapmanızı gösterir: Zaman Aşımı özellik. Not: uygulamanızda uzun beklemelerden kaçınmak için büyük değerler ayarlamamalısınız.

İşlem Zaman Aşımını Yapılandır

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

    // some code...
}

Karşılama Zaman Aşımını Sınırla

IMAP istemcisi, bir bağlantı kurmak için otomatik modu kullanabilir. Bu modda, IMAP istemcisi bağlantı kurulana kadar tüm olası bağlantı parametrelerini dener. Doğru bağlantı durumunda IMAP sunucusu istemciye bir karşılama dizesi gönderir. Sunucular, örtük veya açık (START TLS) SSL/TLS bağlantı başlatmasını kullanabilir. Bağlantı modu eşleşmezse (örneğin, sunucu örtük SSL bağlantısı beklerken istemci güvensiz veya açık SSL bağlantısı kurmaya çalışır), sunucu karşılama dizesi göndermez ve kullanıcı zaman aşımına kadar uzun süre bekler; ardından istemci bir sonraki bağlantı seçeneğine geçer. Bu sorunu önlemek için GreetingTimeout özelliği tanıtıldı. Bu özellik, karşılama dizesi için zaman aşımını ayarlamanızı ve otomatik bağlantı kurulum süresini azaltmanızı sağlar.

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

IMAP ile Kriptografik Protokolleri Kullanma

Aspose.Email, iletişim güvenliği sağlamak için SSL (eski) ve TLS şifreleme protokollerini destekler. Uygulamanız ile mail sunucuları arasındaki veri alışverişini korumak için kriptografik şifrelemeyi etkinleştirebilirsiniz.

NOT: Yalnızca .NET Framework tarafından desteklenen protokol sürümlerini ayarlamalısınız. Eğer bazı şifreleme protokolü sürümleri mevcut .NET Framework sürümünüz tarafından desteklenmiyorsa, yok sayılır ve atlanır. Bu durumda istisna oluşmaz. Lütfen kullanın SetSupportedEncryptionUnsafe yöntem, protokolleri uyumluluk kontrolleri olmadan ayarlamak isterseniz.

Aşağıdaki kod örneği, TLS 1.3’ü ayarlamayı gösterir ImapClient class instance.

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

    // some code...
}

Belirtilen şifreleme protokolü mevcut .NET Framework sürümünde desteklenmiyorsa, davranış farkı şu şekildedir: SetSupportedEncryptionUnsafe metodu ve SupportedEncryption özelliği şu şekildedir:

  • Eğer SupportedEncryption özelliği kullanıldığında, e-posta istemcisi şifreleme protokolünü desteklenen bir seviyeye düşürür.
  • Eğer SetSupportedEncryptionUnsafe yöntemi kullanıldığında, e-posta istemcisi istisna fırlatır.

IMAP IDLE Komutunu Kullanma

Aspose.Email API’leri ImapClient sunucuya bir bağlantı açma ve bir e-posta mesajının gelmesini bekleme yeteneği sağlar. Bu, gelen e-postalar için sunucuya tekrar tekrar sorgu (polling) yapılmasını önler. Aşağıdaki kod parçacığı, Aspose.Email kütüphanesini kullanarak bir IMAP e-posta gelen kutusunu yeni ve silinmiş mesajlar için izlemeyi ve bu olaylara göre belirli eylemler yapmayı gösterir:

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

Aşağıdaki kod örneği, yeni e-posta mesajlarını izlemek için asenkron izleme nasıl kurulur gösterir:

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
}

IMAP Uzantılarına Destek

Aspose.Email API, IMAP uzantılarına destek sağlar. Şu anda API tarafından desteklenen IMAP uzantıları şunlardır. Bu IMAP uzantıları tüm sunucular tarafından desteklenmez.

// 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 Genişletilmiş Liste Komutu

Aşağıdaki kod parçacığı, IMAP4 genişletilmiş liste komutunun nasıl kullanılacağını gösterir.

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