איך לייצר חיבורים ל‑IMAP ב‑C#
רשימת הרחבות שרת IMAP
של Aspose.Email ImapClient מאפשר לך לקבל את הרחבות השרת שהשרת תומך בהן כגון IDLE, UNSELECT, QUOTA וכו’. זה מסייע בזיהוי זמינות הרחבה לפני השימוש בלקוח לפונקציונליות ספציפית זו. ה GetCapabilities() מתודה מחזירה את סוגי ההרחבות הנתמכות במערך מחרוזות. קטע הקוד הבא מראה כיצד לאחזר הרחבות.
חיבור IMAP סטנדרטי
ה ImapClient המחלקה מאפשרת ליישומים לנהל תיבות דואר IMAP באמצעות פרוטוקול IMAP. ה- ImapClient המחלקה משמשת להתחברות לשרתי דואר IMAP ולניהול אימיילים בתיקיות הדואר של IMAP. כדי להתחבר לשרת IMAP
- צור מופע של ImapClient מחלקה.
- ציין את שם המארח, שם המשתמש והסיסמה ב- ImapClient constructor.
הערה, מגבלות סיסמה חייבות לעמוד בדרישות השרת. לקוח האימייל אינו מוסיף מגבלות סיסמה.
לאחר שה ImapClient המותח מתחילה, הקריאה הבאה לכל פעולה באמצעות המותח תתחבר לשרת. הקטע הקוד הבא מראה כיצד להתחבר לשרת IMAP באמצעות השלבים שלמעלה.
// 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 עם SSL
התחברות עם שרת IMAP מתואר כיצד להתחבר לשרת IMAP בארבעה שלבים פשוטים:
- צור מופע של ImapClient מחלקה.
- ציין את שם המארח, שם המשתמש והסיסמה.
- ציין את הפורט.
- ציין את אפשרויות האבטחה.
תהליך ההתחברות לשרת IMAP עם SSL דומה אך דורש להגדיר כמה מאפיינים נוספים:
- הגדר SecurityOptions ל‑SSLImplicit.
הקטע הקוד הבא מראה כיצד
- הגדר שם משתמש, סיסמה ופורט.
- הגדר אפשרות אבטחה.
// 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;
הגדרת חיבור פרוקסי
התחברות לשרת דרך פרוקסי
שרתים פרוקסי משמשים בדרך כלל לתקשורת עם העולם החיצוני. במקרים כאלה, לקוחות דואר אינם יכולים לתקשר באינטרנט בלי לציין את כתובת הפרוקסי. Aspose.Email תומכת בגרסאות 4, 4a ו‑5 של פרוטוקול SOCKS. מאמר זה מספק דוגמה עובדת של גישה לתיבת דואר באמצעות שרת פרוקסי דואר. כדי לגשת לתיבת הדואר דרך שרת פרוקסי:
- אתחול מתווך Socks עם המידע הדרוש, כלומר כתובת הפרוקסי, פורט וגרסת SOCKS.
- אתחול ImapClient עם כתובת השרת, שם משתמש, סיסמה וכל הגדרה אחרת.
- הגדר את הלקוח מתווך Socks מאפיין של הלקוח ל- מתווך Socks אובייקט שנוצר למעלה.
הקטע הקוד הבא מראה כיצד לאחזר תיבת דואר דרך שרת פרוקסי.
// 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
// 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");
}
חיבור במצב קריאה בלבד
ה ImapClient מחלקה מספקת ReadOnly מאפיין שכאשר מוגדר ל‑true, מצביע שאין לבצע שינויים במצב הקבוע של תיבת הדואר. דוגמת הקוד הבאה מדגימה את השימוש ב- ImapClient.ReadOnly מאפיין. הוא מקבל את ספירת ההודעות שלא נקראו, משיג הודעה אחת ולאחר מכן מקבל שוב את ספירת ההודעות שלא נקראו במצב קריאה בלבד. ספירת ההודעות שלא נקראו נשארת אחת, מה שמעיד שהמצב הקבוע של תיבת הדואר לא השתנה.
// 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
לאימות מאובטח וגישה לשרת הדוא"ל, Aspose.Email for .NET מציע שיטת אימות CRAM-MD5. הקטע הקוד הבא יראה כיצד היא עובדת עם ImapClient:
imapClient.AllowedAuthentication = ImapKnownAuthenticationType.CramMD5;
קביעת זמן קצוב לפעולות IMAP
כל פעולת דואר לוקחת זמן מסוים בהתאם למגוון גורמים (עיכובי רשת, גודל הנתונים, ביצועי השרת, וכו’). ניתן להגדיר זמן קצוב לכל פעולות הדואר. דוגמת הקוד שלהלן מראה כיצד לבצע זאת באמצעות זמן קצוב מאפיין. הערה: אין להגדיר ערכים גדולים כדי למנוע המתנה ארוכה באפליקציה שלך.
הגדר זמן קצוב לפעולה
using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
imapClient.Timeout = 60000; // 60 seconds
// some code...
}
הגבל זמן קבלת הפנים
לקוח ה‑IMAP עשוי להשתמש במצב האוטומטי כדי להקים חיבור. במצב זה, לקוח ה‑IMAP משדרג דרך כל פרמטרי החיבור האפשריים עד להקמת החיבור. שרת IMAP במקרה של חיבור נכון שולח מחרוזת קבלת פנים (greeting) ללקוח. שרתים עשויים להשתמש באתחול חיבור SSL/TLS באופן מפורש (START TLS) או מעוות (implicit). אם מצב החיבור אינו תואם (למשל, השרת מצפה לחיבור SSL מפורש בעוד שהלקוח מנסה לקבוע חיבור בלתי מאובטח או מפורש), השרת לא ישגר מחרוזת קבלת פנים והמשתמש יחכה זמן רב עד לפקיעת הזמן (timeout) שבו צפויה המחרוזת, והלקוח יעבור לאופציית ההתחברות הבאה. כדי למנוע בעיה זו, נוספה תכונת GreetingTimeout. תכונה זו מאפשרת להגדיר זמן קצוב למחרוזת קבלת הפנים ולצמצם את זמן הקמת החיבור האוטומטי.
using (ImapClient client = new ImapClient("localhost", 993, "username", "password"))
{
client.GreetingTimeout = 4000;
client.SelectFolder(ImapFolderInfo.InBox);
}
שימוש בפרוטוקולי קריפטוגרפיה עם IMAP
Aspose.Email תומך בפרוטוקולים הקריפטוגרפיים SSL (מיושן) ו‑TLS כדי לספק אבטחת תקשורת. ניתן להפעיל הצפנה קריפטוגרפית כדי להגן על חילופי נתונים בין היישום שלך לשרתי הדוא"ל.
הערה: יש להגדיר רק את גרסאות הפרוטוקול הנתמכות על ידי .NET Framework. אם גרסאות מסוימות של פרוטוקול קריפטוגרפי אינן נתמכות בגרסה הנוכחית שלך של .NET Framework, הן יתעלמו וידולגו. במקרה זה, לא ייווצרו שגיאות. אנא השתמש ב‑ SetSupportedEncryptionUnsafe השיטה אם ברצונך להגדיר את הפרוטוקולים ללא בדיקות תאימות.
דוגמת הקוד שלהלן מראה כיצד להגדיר TLS 1.3 עבור ImapClient מופע של מחלקה.
using (ImapClient imapClient = new ImapClient("host", 993, "username", "password", SecurityOptions.SSLImplicit))
{
imapClient.SupportedEncryption = EncryptionProtocols.Tls13;
// some code...
}
במקרה שהפרוטוקול ההצפנה שהוגדר אינו נתמך בגרסה הנוכחית של .NET Framework, ההבדל בהתנהגות בין SetSupportedEncryptionUnsafe שיטה ו SupportedEncryption המאפיין הוא כדלקמן:
- אם SupportedEncryption כאשר המאפיין משמש, לקוח הדוא"ל מוריד את פרוטוקול ההצפנה לרמה נתמכת.
- אם SetSupportedEncryptionUnsafe כאשר השיטה משמשת, לקוח הדוא"ל זורק שגיאות.
שימוש בפקודת IMAP IDLE
API של Aspoe.Email ImapClient מספקת את היכולת לפתוח חיבור לשרת ולחכות להגעת הודעת דוא"ל. זה מאפשר להימנע משאילתות חוזרות לשרת על הודעות נכנסות. הקטע הקוד הבא מדגים כיצד להשתמש בספריית Aspose.Email לנטר תיבת דואר נכנסת של IMAP עבור הודעות חדשות והודעות שנמחקו, ולאחר מכן לבצע פעולות ספציפיות בהתבסס על האירועים הללו:
// 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);
דוגמת הקוד למטה מראה כיצד להגדיר ניטור אסינכרוני להודעות דוא"ל חדשות:
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
Aspose.Email API מספק תמיכה בהרחבות IMAP. ההרחבות הבאות של IMAP נתמכות על‑ידי ה‑API כעת. הרחבות אלו אינן נתמכות על‑ידי כל השרתים.
// 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
קטע הקוד הבא מראה כיצד להשתמש בפקודת הרשימה המורחבת של 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;
}
}
}