国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

用.Net Framework設(shè)計(jì)檢查EMail程序

2019-11-17 04:39:47
字體:
供稿:網(wǎng)友
  摘要:Duncan Mackenzie 介紹如何構(gòu)建一種工具,使用 Microsoft .NET Framework 的 System.Net 命名空間來檢查 POP3 電子郵件帳戶中的未讀郵件。
  妻子帶給我的軟件設(shè)計(jì)靈感

  毫無目的的編碼就像不帶購物清單到商店購物一樣。當(dāng)然,您可能過得很愉快,而且買到了一些東西(某個(gè)人在將來的某一天會(huì)用到的東西)但卻不能解決今天的晚飯問題。這就是我撰寫這一專欄的初衷(當(dāng)然是為了編碼,而不是為了購物)。但后來我卻把編碼的事拋在腦后,寫了一些很酷的東西(您不得不照我的思路讀下去),因此當(dāng)最終期限越來越近時(shí),我還沒有任何東西可以發(fā)表。幸運(yùn)的是,當(dāng)我為我的妻子 Laura 設(shè)置一臺(tái)運(yùn)行 Microsoft? Windows? XP Home 的“新”計(jì)算機(jī)(其實(shí)是我的舊計(jì)算機(jī))后,我從中獲得了一些靈感。  迄今為止,我從未運(yùn)行過安裝了 XP Home 的計(jì)算機(jī)(我的計(jì)算機(jī)通常運(yùn)行的是連接到域中的 Windows xp PRo),因此 XP Home 的歡迎屏幕(請(qǐng)參見圖 1)給我留下了深刻的印象。Laura 也是一樣,她甚至還注重到一個(gè)我從未發(fā)現(xiàn)的功能:假如登錄后長時(shí)間不使用系統(tǒng),系統(tǒng)將切換回登錄屏幕(或者按 Windows 鍵 + L),這時(shí)屏幕將顯示未讀的電子郵件數(shù)目!這對(duì)她來說真是太妙了,因?yàn)樗梢栽诮?jīng)過計(jì)算機(jī)時(shí)快速掃一眼,看看是否有新的電子郵件,而不必輸入密碼。?。≡酒降瓱o奇的計(jì)算機(jī)或電子解決方案卻給我的妻子帶來這么大的幫助,這種感覺真是好極了!

圖 1:歡迎使用 Windows XP!  令人沮喪的是,屏幕上總是顯示同樣的內(nèi)容:7 封未讀電子郵件,即使 Laura 根本沒有任何未讀的電子郵件時(shí)也是如此。這種設(shè)置可太叫人失望了:本來,系統(tǒng)通知您有七封可能會(huì)讓您非常激動(dòng)的新郵件,登錄后卻發(fā)現(xiàn)沒有任何新郵件。原本欣喜的感覺一掃而光,我要盡快研究研究解決方案。  那七封未讀郵件原來在她的 hotmail 收件箱中,而登錄屏幕上顯示的值是通過具有明確名稱的 SHSetUnreadMailCount(英文)API 調(diào)用設(shè)置的。Laura 現(xiàn)在使用 hotmail 只是接收 MSN? Messenger(英文),因此知道她有多少封未讀的 hotmail 郵件并不是很有用。在這個(gè)現(xiàn)實(shí)面前,我腦子里的那個(gè)布滿 Microsoft 觀念的思維機(jī)器馬上飛速運(yùn)轉(zhuǎn)起來,而且我相信我的朋友們也會(huì)如此。忽然我有了靈感:我可以創(chuàng)建一個(gè)小應(yīng)用程序,使登錄屏幕顯示更有用的值?! ‖F(xiàn)在,我要澄清幾個(gè)細(xì)節(jié):Microsoft? Outlook? Express 也可以設(shè)置這個(gè)值,因此假如使用此應(yīng)用程序接收電子郵件,則可以設(shè)置值,但 Outlook 卻不行。我要構(gòu)建的應(yīng)用程序應(yīng)該能夠處理幾個(gè)操作:連接一組 POP3 服務(wù)器、獲取新郵件的數(shù)量并填充相應(yīng)的注冊(cè)表值。但是,在應(yīng)用程序的開發(fā)完成之后,我才意識(shí)到假如忽略 Outlook,一切努力都將付之東流,因?yàn)?Laura 的郵件客戶端就是 Outlook,所以我把 Outlook 作為一種附加功能添加到程序中?! 「鶕?jù)我的習(xí)慣,我將整個(gè)工作劃分成一系列可以獨(dú)立完成的任務(wù):   連接 POP3 服務(wù)器,并檢查當(dāng)前的郵件數(shù)量。
  答應(yīng)您使用主機(jī)和用戶 ID/密碼信息來配置一組 POP3 服務(wù)器。
  以可靠的方式保存服務(wù)器配置信息(包括用戶 ID/密碼)。

  編寫在后臺(tái)運(yùn)行的應(yīng)用程序,并使該應(yīng)用程序每 n 分鐘對(duì)已配置的每臺(tái)服務(wù)器進(jìn)行檢查。
  只要郵件數(shù)量發(fā)生改變,就更新 Windows XP 登錄屏幕設(shè)置。
  另外,為了更有意思一些,可以使用 Outlook 2000 或 XP 來執(zhí)行所有相同的任務(wù)。
  您可以獲得全部代碼,但我會(huì)按順序介紹各個(gè)項(xiàng)目并說明代碼是如何在各種情況下工作的。   連接 POP3 服務(wù)器

  我并非靠編寫套接字代碼謀生,因此作為 Microsoft 軟件的用戶,您應(yīng)對(duì)此感到興奮。假如我的目的就是完成這項(xiàng)工作,那么我會(huì)尋找其他人的 POP3 組件(盡管我必須要購買它)。這會(huì)更有效,也更簡(jiǎn)單。
但我的目的是向您展示一些 Microsoft? .NET 代碼,因此我認(rèn)為對(duì)您來說,觀看我圍繞 System.NET 命名空間和 POP3 spec(英文)編寫自己的組件會(huì)給您帶來樂趣和啟發(fā)。  第一件事是創(chuàng)建一個(gè)小應(yīng)用程序,用于在一個(gè) Button1_Click 例程中完成所有 POP3 工作,并以一種非常程序化的方式(所有代碼都在一個(gè)大的過程中)進(jìn)行工作,直到我讓它再次執(zhí)行任務(wù)。要在應(yīng)用程序中使用此代碼,還需要執(zhí)行一些整理工作。我將它重組為適當(dāng)?shù)念?,并提取一些有關(guān) POP3 命令和服務(wù)器信息的特定內(nèi)容,從而方便您在需要時(shí)進(jìn)行更改。我當(dāng)時(shí)自我感覺很好,想把這個(gè)過程稱為“refactoring(再分解)”階段,但是 Microsoft? Word 認(rèn)為這個(gè)詞拼錯(cuò)了,我也同意這個(gè)結(jié)論。   假如您從未使用過 .NET 中的套接字類,您也不必?fù)?dān)心,這些類非常簡(jiǎn)單直觀。我只用了幾分鐘就實(shí)現(xiàn)了連接并發(fā)送數(shù)據(jù)。我使用 System.Net.Sockets.TcpClient(英文)的一個(gè)實(shí)例來創(chuàng)建與 POP3 服務(wù)器的連接,在建立連接以后抓取 NetworkStream(英文)對(duì)象。Public Sub New(ByVal server As String, _
ByVal port As Integer, _
ByVal delay As Integer)
Try
m_Client = New TcpClient()
m_Client.Connect(server, port)
m_NS = m_Client.GetStream()
m_Delay = delay
Dim sResponse As String = GetResponse().Trim
If sResponse.Substring(0, 3) <> "+OK" Then
Throw New Exception("連接失敗")
End If
Catch se As SocketException
MsgBox(se.Message & vbCrLf & vbCrLf & se.ToString, _
MsgBoxStyle.Exclamation, "套接字異常!")
Throw New Exception("連接失敗", se)
Catch ex As Exception
MsgBox(ex.Message & vbCrLf & vbCrLf & ex.ToString, _
MsgBoxStyle.Exclamation, "異常!")
Throw New Exception("連接失敗", ex)
End Try
End Sub  創(chuàng)建開放式連接和數(shù)據(jù)流之后,接下來要做的就是發(fā)送和接收文本。我提取了 NetworkStream 代碼,以便讀取字節(jié)數(shù)組并將其寫入到幾個(gè)高級(jí)函數(shù)中:SendCommand 和 GetResponse。POP3 規(guī)范介紹了兩種類型的服務(wù)器響應(yīng),即單行和多行,因此我在兩個(gè)函數(shù)的參數(shù)列表中加入了 MultiLine 標(biāo)記。Private Overloads Function GetResponse() As String
Return GetResponse(False)
End FunctionPrivate Overloads Function GetResponse( _
ByVal multiLine As Boolean) As String
'GetResponse 的任務(wù)是等待
'服務(wù)器響應(yīng),以便以不同方式完成
'單行和多行響應(yīng)端,
'因此它們的結(jié)束條件
'也應(yīng)該稍有不同。
Dim sOutput As String = ""
Dim input As Integer
Dim str(4096) As Byte
Dim startTime As Date = Now
Dim endCondition As StringIf multiLine Then
endCondition = vbCrLf & vbCrLf & "."
Else
endCondition = vbCrLf
End IfDo
While m_NS.DataAvailable()
startTime = Now
input = m_NS.Read(str, 0, 4096)
sOutput &= ASCIIEncoding.ASCII.GetChars( _
str, 0, input)
End While
Loop Until sOutput.IndexOf(endCondition) >= 0 _
Or Now.SuBTract(startTime).TotalMilliseconds > Me.m_DelayIf sOutput.IndexOf(endCondition) < 0 Then

Return sOutput
Else
Return sOutput
End If
End Function'SendCommand 用于發(fā)送字符串
'并接收響應(yīng)
Public Overloads Function SendCommand( _
ByVal command As String) As String
Return SendCommand(command, False)
End FunctionPublic Overloads Function SendCommand( _
ByVal command As String, _
ByVal multiLine As Boolean) As String
Dim user As Byte()
user = ASCIIEncoding.ASCII.GetBytes(command)
m_NS.Write(user, 0, user.GetLength(0))
Return GetResponse(multiLine)
End Function  注重:我本可以在 NetworkStream 的頂部打開一對(duì)友好的流對(duì)象,例如 StreamReader(英文)和 StreamWriter(英文),但我還是堅(jiān)持使用字節(jié)數(shù)組。假如您要查看有關(guān)在 NetworkStream 中使用 StreamReader/StreamWriter 的示例,請(qǐng)參閱由 Andrew Duthiecheck 撰寫的這篇 MSDN Magazine 文章(英文)。

  成功發(fā)送和接收信息后,我需要使用更高級(jí)別的套接字代碼(就如同這些代碼是其他人編寫的,而我并不關(guān)心其工作原理一樣),因此我決定將該代碼提取到實(shí)用程序類中。然后,在主 POP3Server 類中,我實(shí)現(xiàn)了簡(jiǎn)單的 POP3 命令集,用于檢索郵件列表。我使用 USER 和 PASS 命令登錄到服務(wù)器,獲取郵件數(shù)量(使用 STAT),然后列出每個(gè)郵件的標(biāo)題(使用 TOP)。我從這些標(biāo)題中分析出三條重要信息:發(fā)件人、主題和郵件 ID。獲取郵件 ID 的目的是獲得每個(gè)郵件的唯一標(biāo)識(shí)符,借助這個(gè)標(biāo)識(shí)符,我的程序就能了解郵件何時(shí)是最新的。假如發(fā)現(xiàn)了新郵件,就會(huì)引發(fā)一個(gè)事件并傳遞主題和發(fā)件人信息。以下代碼片段顯示了郵件標(biāo)題的檢索,以及新電子郵件事件的觸發(fā)。假如將這些代碼放在完整的源代碼環(huán)境中查看,您的印象會(huì)更加深刻。Dim msg As POP3.Message
If msgCount > 0 Then
Dim i As Integer
For i = 1 To msgCount
'使用 TOP 命令
'獲取郵件的標(biāo)題
response = p3.SendCommand( _
String.Format(Me.TopCmd, i), True)
msg = ParseResponse(response)Dim msgIndex As Integer = 0
Dim found As Boolean = False
'檢查此郵件是否為新郵件
Do While msgIndex < Me.m_Messages.Count And Not found
If Me.m_Messages(msgIndex).ID = msg.ID Then
found = True
End If
msgIndex += 1
Loop
If Not found Then
Me.m_Messages.Add(msg)
'假如是新郵件,則引發(fā) NewEmail
'事件,傳遞發(fā)件人和主題
RaiseEvent NewEmail(CObj(Me), _
New NewEmailEventArgs( _
msg.From, msg.Subject, msg.ID))
End If
Next
End If  該事件由我的主應(yīng)用程序捕捉,現(xiàn)在我們來看一下中心應(yīng)用程序代碼。   編寫用于系統(tǒng)任務(wù)欄的應(yīng)用程序

  我決定通過系統(tǒng)任務(wù)欄的圖標(biāo)實(shí)現(xiàn)此應(yīng)用程序,因?yàn)檫@樣可以方便且相對(duì)自由地訪問應(yīng)用程序的選項(xiàng)和新郵件的通知。


圖 2:我創(chuàng)建了一個(gè)系統(tǒng)任務(wù)欄圖標(biāo),因?yàn)閳D標(biāo)多多益善。
  我在編程時(shí),把幾乎整個(gè)應(yīng)用程序都作為一個(gè) Microsoft? Visual Basic? 模塊(對(duì)于 C# 類型,這個(gè)模塊相當(dāng)于一個(gè)所有成員都為靜態(tài)的類),并且僅使用了一個(gè)選項(xiàng)對(duì)話框窗體。使用 Visual Basic 6.0 完成編碼是非常有趣的。我編寫的應(yīng)用程序使用了系統(tǒng)任務(wù)欄圖標(biāo)、計(jì)時(shí)器和上下文菜單,而不需要使用不可見的窗體。我確實(shí)不喜歡創(chuàng)建不可見的窗體,尤其是那些僅在啟動(dòng)的瞬見可以看到的窗體。因此,當(dāng)我發(fā)現(xiàn)并不需要不可見的窗體時(shí),我很興奮。在這個(gè)主模塊中,我創(chuàng)建了一個(gè) Hans Blomme's wonderful NotifyIconXP(英文)的實(shí)例、上下文菜單和一些菜單項(xiàng),以及一個(gè)計(jì)時(shí)器。然后,我為菜單項(xiàng)、計(jì)時(shí)器編寫了事件處理程序,甚至為通知圖標(biāo)的 BalloonClick 事件(盡管我并不用這個(gè)事件,但我認(rèn)為您可能需要它)也編寫了一個(gè)事件處理程序。'服務(wù)器列表
Dim servers As New POP3ServerCollection()'輪詢電子郵件服務(wù)器的計(jì)時(shí)器
Dim checkTimer As New Timer()'notifyIcon 提供給用程序的主要用戶界面
'通過它可以彈出氣泡式信息等。
Dim ni As HansBlomme.Windows.Forms.NotifyIcon'常規(guī)的應(yīng)用程序首選項(xiàng)

Dim appSettings As Settings'我將此窗體保留為模塊級(jí)
'變量,因此使用 ViewOptions 菜單可以避免
'一次打開多個(gè)實(shí)例
Dim myFrm As frmOptionsSub Main()
'從序列化的 xml 文件中
'加載服務(wù)器列表和設(shè)置信息
Reload()'遍歷所有加載的
'服務(wù)器,并為 NewE-mail 事件
'附加一個(gè)處理程序。
Dim srv As POP3Server
For Each srv In servers
AddHandler srv.NewE-mail, AddressOf NewE-mail
Next'appSettings 以秒為單位存儲(chǔ)間隔,
'計(jì)時(shí)器以毫秒為單位進(jìn)行工作,因此,為使它們協(xié)同工作,
'必須進(jìn)行一定的轉(zhuǎn)換。
checkTimer.Interval = appSettings.CheckInterval * 1000
checkTimer.Enabled = True'為計(jì)時(shí)器的 Tick 事件添加處理程序
AddHandler checkTimer.Tick, AddressOf CheckE-mail_Tick'創(chuàng)建新圖標(biāo),刪除 HansBlomme 部分,以使用
'標(biāo)準(zhǔn)的 NotifyIcon。此外,還需要對(duì)其他代碼
'進(jìn)行更改
ni = New HansBlomme.Windows.Forms.NotifyIcon()
ni.Icon = New Icon(GetType(Main), "mail.ico")
ni.Visible = True'當(dāng)用戶單擊由通知圖標(biāo)彈出的氣泡式信息時(shí),
'添加事件處理程序。標(biāo)準(zhǔn)的 NotifyIcon
'不提供此事件,因此假如不使用 HansBlomme 圖標(biāo),
'則需要?jiǎng)h除此行。
AddHandler ni.BalloonClick, AddressOf NotificationBalloonClicked'設(shè)置上下文菜單,包括事件處理程序
Dim ctxMenu As New ContextMenu()
ctxMenu.MenuItems.Add("查看選項(xiàng)", AddressOf ViewOptionsForm)
ctxMenu.MenuItems.Add("退出", AddressOf Endapplication
'并將其指定給 NotifyIcon,以便在右擊該圖標(biāo)時(shí),
'它可以彈出。
ni.ContextMenu = ctxMenu'運(yùn)行應(yīng)用程序,使用 Application.Run
'來創(chuàng)建新的消息循環(huán)
Application.Run()'當(dāng)退出應(yīng)用程序時(shí)
'隱藏通知圖標(biāo)并
ni.Visible = False'將服務(wù)器信息和設(shè)置保存到 xml 文件中
Persist()
End Sub
  保存設(shè)置

  我在 Main() 例程的開頭調(diào)用了 Reload(),在結(jié)尾調(diào)用了 Persist()。這兩個(gè)過程將我的設(shè)置和 POP3 服務(wù)器信息保存到磁盤(在 Persist 中),并在啟動(dòng)時(shí)又加載它們(在 Reload 中)。當(dāng)您要將對(duì)象(甚至是結(jié)構(gòu)復(fù)雜的對(duì)象)保存到磁盤時(shí),最好執(zhí)行序列化。這段代碼引用的 POP3ServerCollection 類是使用 GotDotNet(英文)中的 Collection Generator(英文)生成的,可以從可下載的源代碼中獲得。Public Sub Persist()
'使用序列化將 Settings 對(duì)象和
'POP3 服務(wù)器的集合保存到 XML 文件中
'請(qǐng)注重,與 Background Copying 一文不同,
'這些文件并未保存到孤立的存儲(chǔ)區(qū)中。
'雖然可以將它們保存在孤立的存儲(chǔ)區(qū)中,但我想
'這一次應(yīng)該有所變化。'指出 xml 文件的路徑,注重
'使用 IO.Path.Combine... 要比僅
'將它們連接起來好得多。
Dim serverSettingsPath As String _
= IO.Path.Combine( _
Application.LocalUserAppDataPath, _
"servers.xml")
Dim settingsPath As String _
= IO.Path.Combine( _
Application.LocalUserAppDataPath, _
"settings.xml")Dim myXMLSerializer As Xml.Serialization.XmlSerializer
Dim settingsFile As IO.StreamWriter'保存服務(wù)器列表
myXMLSerializer _
= New Xml.Serialization.XmlSerializer( _
GetType(POP3ServerCollection))
settingsFile _
= New IO.StreamWriter(serverSettingsPath)
myXMLSerializer.Serialize(settingsFile, servers)
settingsFile.Close()'保存 Settings 類
myXMLSerializer _
= New Xml.Serialization.XmlSerializer( _
GetType(Settings))
settingsFile = New IO.StreamWriter(settingsPath)
myXMLSerializer.Serialize( _
settingsFile, appSettings)
settingsFile.Close()

End SubPublic Sub Reload()
'與 Persist() 正好相反,此例程
'從類的 XML 文件中加載兩個(gè)類,或
'創(chuàng)建新的實(shí)例(假如 XML 文件不存在)
Dim serverSettingsPath As String _
= IO.Path.Combine( _
Application.LocalUserAppDataPath, "servers.xml")
Dim settingsPath As String _
= IO.Path.Combine( _
Application.LocalUserAppDataPath, "settings.xml")If IO.File.Exists(serverSettingsPath) Then
'加載服務(wù)器
Dim settingsFile As IO.StreamReader _
= New IO.StreamReader(serverSettingsPath)
Dim myXMLSerializer As _
New Xml.Serialization.XmlSerializer( _
GetType(POP3ServerCollection))
servers = DirectCast( _
myXMLSerializer.Deserialize(settingsFile), _
POP3ServerCollection)
settingsFile.Close()
Else
servers = New POP3ServerCollection()
End IfIf IO.File.Exists(settingsPath) Then
'加載設(shè)置
Dim settingsFile As IO.StreamReader _
= New IO.StreamReader(settingsPath)
Dim myXMLSerializer As _
New Xml.Serialization.XmlSerializer( _
GetType(Settings))
appSettings = DirectCast( _
myXMLSerializer.Deserialize(settingsFile), _
Settings)
settingsFile.Close()
Else
appSettings = New Settings()
End If
End Sub  存儲(chǔ)用戶ID/密碼

  正如您在 Persist/Reload 代碼中看到的,我將設(shè)置保存到本地應(yīng)用程序數(shù)據(jù)路徑中。這樣可以將信息作為 XML 文件保存到 /Documents and Settings/<userid>/Local Settings/Application Data/POP3/POP3/<version>/ 中。該區(qū)域應(yīng)該受到限制,使得只有您可以訪問。但是,這并不能阻止那些具有治理員訪問權(quán)限的用戶,所以我認(rèn)為最好對(duì)信息中的敏感部分再采取一些措施。為了提高安全性,在將用戶 ID 和密碼保存到磁盤之前,我使用 DPAPI(英文,受這個(gè)簡(jiǎn)單示例 [英文] 的啟發(fā))對(duì)它們進(jìn)行了加密。Function EncryptText(ByVal source As String) As String
'我使用 GotDotNet 中的 DPAPI 組件
'請(qǐng)查看鏈接的相關(guān)文章。
Dim dp As _
New Dpapi.DataProtector(Dpapi.Store.UserStore)
Dim sourceBytes As Byte() = _
System.Text.Encoding.Unicode.GetBytes(source)
Dim encryptedBytes As Byte()
encryptedBytes = dp.Encrypt(sourceBytes)
'我可以存儲(chǔ)二進(jìn)制值,但是由于使用
'XML 作為存儲(chǔ)機(jī)制,因此我更愿意使用
'字符串。ToBase64String 處理我的字符串
Return Convert.ToBase64String(encryptedBytes)
End FunctionFunction DecryptText(ByVal source As String) As String
'我使用 GotDotNet 中的 DPAPI 組件
'請(qǐng)查看鏈接的相關(guān)文章。
Dim dp As _
New Dpapi.DataProtector(Dpapi.Store.UserStore)
Dim sourceBytes As Byte() = _
Convert.FromBase64String(source)
Dim decryptedBytes As Byte()
decryptedBytes = dp.Decrypt(sourceBytes)
Return System.Text.Encoding.Unicode.GetString(decryptedBytes)
End Function  當(dāng)然,對(duì)這些字符串進(jìn)行加密之后,我必須做一些額外的工作,才能通過選項(xiàng)窗體查看和/或編輯這些值。
  通過選項(xiàng)對(duì)話框更改設(shè)置

  我得承認(rèn),在為自己編寫代碼時(shí),我通常習(xí)慣手動(dòng)更改代碼中的值,例如 .config 文件或數(shù)據(jù)庫中的值。這并不是一個(gè)好習(xí)慣,因?yàn)橛袝r(shí)候需要將代碼提供給其他人,然后必須解釋如何更改設(shè)置、處理項(xiàng)目符號(hào)和創(chuàng)建選項(xiàng)對(duì)話框。在這個(gè)示例中,我決定事先做好預(yù)備,因此我創(chuàng)建了一個(gè)小的對(duì)話框,在通知圖標(biāo)以外提供了“查看選項(xiàng)”菜單項(xiàng)。Sub ViewOptionsForm( _
ByVal sender As Object, _
ByVal e As EventArgs)
'彈出“選項(xiàng)”對(duì)話框
Try
'檢查對(duì)話框是否已啟動(dòng),
'假如已啟動(dòng),將焦點(diǎn)設(shè)置到對(duì)話框
If Not myFrm Is Nothing AndAlso myFrm.Visible Then
myFrm.Focus()

Else
'假如尚未啟動(dòng),則創(chuàng)建一個(gè)新的副本
myFrm = New frmOptions()'在窗體中導(dǎo)入數(shù)據(jù)
myFrm.servers = servers
myFrm.appSettings = appSettingsIf myFrm.ShowDialog() = DialogResult.OK Then
'我在窗體上“克隆”了 appSettings
'因此在窗體關(guān)閉時(shí),
'您需要彈出一個(gè)副本
appSettings = myFrm.appSettings
'嗨,您已經(jīng)更改了所有設(shè)置
'最好是保存它們!
'這樣,即使應(yīng)用程序以錯(cuò)誤的方式結(jié)束,
'您所做的更改仍會(huì)被保存。
Persist()
End If
myFrm.Dispose()
myFrm = Nothing
End If
Catch ex As System.Exception
Debug.WriteLine(ex.ToString)
Debug.WriteLine(ex.StackTrace)
End Try
End Sub  為了能夠編輯服務(wù)器集合,我將數(shù)據(jù)綁定到一組控件并提供了“新建”和“刪除”按鈕。這個(gè)小的導(dǎo)航控件是我為方便自己使用而編寫的,您可能也會(huì)用到。假如我不打算使用此控件,本來使用兩個(gè)按鈕來處理 CurrencyManager(英文)的 Position 屬性就可以了。

圖 3:可以使用“選項(xiàng)”對(duì)話框設(shè)置 POP3 服務(wù)器信息?! ∮捎诰拖裎以谇懊娴摹按鎯?chǔ)用戶 ID/密碼”一節(jié)提到的,已經(jīng)對(duì)用戶 ID 和密碼進(jìn)行了加密,因此需要做一些工作以便在數(shù)據(jù)綁定方案中利用這些值。我為 UserID 和 Password 綁定對(duì)象的 Parse(英文)和 Format(英文)事件添加了事件處理程序,以使這些值在顯示時(shí)自動(dòng)解密,在存儲(chǔ)到服務(wù)器集合之前自動(dòng)加密。'設(shè)置例程格式并對(duì)其進(jìn)行分析,以解密/加密值
Private Sub encryptedBinding_Format( _
ByVal sender As Object, _
ByVal e As System.Windows.Forms.ConvertEventArgs)
If e.Value <> String.Empty Then
e.Value = Main.DecryptText(CStr(e.Value))
End If
End SubPrivate Sub encryptedBinding_Parse( _
ByVal sender As Object, _
ByVal e As System.Windows.Forms.ConvertEventArgs)
If e.Value <> String.Empty Then
e.Value = Main.EncryptText(CStr(e.Value))
End If
End Sub  常規(guī)的設(shè)置并不是數(shù)據(jù)綁定的,我將它們從 Settings 類中彈出,然后根據(jù)需要推入新值。'未對(duì)常規(guī)設(shè)置進(jìn)行數(shù)據(jù)綁定
'我只是在控件之間手動(dòng)
'彈出/推入這些值。
Private Sub PopulateControls()
If m_appSettings.CheckInterval _
> Me.checkInterval.Maximum Then
m_appSettings.CheckInterval _
= Me.checkInterval.Maximum
ElseIf m_appSettings.CheckInterval _
< Me.checkInterval.Minimum Then
m_appSettings.CheckInterval _
= Me.checkInterval.Minimum
End If
Me.checkInterval.Value = _
Me.m_appSettings.CheckInterval
Me.checkOutlook.Checked = _
Me.m_appSettings.CheckOutlook
Me.displayPopups.Checked = _
Me.m_appSettings.DisplayNewMailPopup
End SubPrivate Sub PullControlValues()
Me.m_appSettings.CheckInterval = _
Me.checkInterval.Value
Me.m_appSettings.CheckOutlook = _
Me.checkOutlook.Checked
Me.m_appSettings.DisplayNewMailPopup = _
Me.displayPopups.Checked
End Sub  Outlook

  我差點(diǎn)忘記了這個(gè)應(yīng)用程序。我說過我要檢查 Outlook 的未讀郵件和 POP3 帳戶。我不想引用 Outlook 庫的原因有兩個(gè):   我不希望您使用 Outlook 來編譯或運(yùn)行此代碼。
  我不希望創(chuàng)建與 Outlook 特定版本相關(guān)的依靠關(guān)系。
  假如不使用對(duì) Outlook 的引用,則必須使用最新綁定,這意味著 Microsoft? IntelliSense? 和其他一  切都不能視為對(duì)象。但積極的一面是,結(jié)果代碼可以在 Microsoft? Office 2000、Office XP 和 Office 11 上運(yùn)行。Public Shared Function GetUnreadMessages() As Integer
Dim OutlookApp As Object
Try
OutlookApp = _
GetObject(, "Outlook.Application")

Catch
OutlookApp = Nothing
End Try
'取消注釋這段內(nèi)容,以便在
'需要時(shí)打開 Outlook
'If OutlookApp Is Nothing Then
' OutlookApp = _
' CreateObject("Outlook.Application")
'End IfIf Not OutlookApp Is Nothing Then
'6 為常數(shù)(對(duì)于收件箱)
'由 Outlook 庫提供
'沒有引用就沒有庫
'也沒有常數(shù)
Dim inbox As Object = _
OutlookApp.session.GetDefaultFolder(6)
Return inbox.UnReadItemCount()
Else
Return -1
End If
End Function  請(qǐng)注重,假如 Outlook 未打開,此代碼將無法工作。假如我使用 CreateObject(英文),此代碼就可以工作,但是我并不想讓這個(gè)小小的系統(tǒng)任務(wù)欄應(yīng)用程序強(qiáng)制 Outlook 每 n 秒就打開一次。假如該程序未打開,那么它將無法讀取 Outlook 收件箱中的未讀郵件數(shù)。假如無法與 Outlook 相連接,就必須保留未讀郵件的值,這一點(diǎn)很重要。將其設(shè)置為零將清除上一次的有效數(shù)字?! 【幋a問題

  在一些 Coding4Fun 專欄文章的結(jié)尾,我會(huì)提出幾個(gè)編碼問題,假如您對(duì)此感愛好,可以研究研究。在本文中,這個(gè)問題是創(chuàng)建與電子郵件有關(guān)的任何內(nèi)容,但不一定必須是 POP3。最好的選擇是托管代碼(Visual Basic .NET、C#、J# 或托管 C++),但是,具備 COM 接口的非托管組件也是不錯(cuò)的選擇。您可以將自己的成果張貼到 GotDotNet(英文),并給我發(fā)送電子郵件(地址是 duncanma@microsoft.com),并在其中說明您所做的工作以及為什么這樣做。您可以隨時(shí)給我發(fā)送電子郵件,但請(qǐng)您只發(fā)送指向代碼示例的鏈接,而不要發(fā)送示例本身(我先提前謝謝您)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 安化县| 镇雄县| 镇沅| 固原市| 五指山市| 新巴尔虎右旗| 衡阳县| 石柱| 昭苏县| 甘南县| 沈丘县| 太和县| 准格尔旗| 望城县| 依兰县| 当雄县| 宜城市| 浮山县| 南丹县| 兴隆县| 大同市| 襄城县| 两当县| 尚义县| 花莲市| 柳林县| 林甸县| 宜阳县| 客服| 正宁县| 乐都县| 山阴县| 梧州市| 蛟河市| 宜兰市| 垦利县| 德庆县| 乐亭县| 喀喇沁旗| 宣恩县| 湘潭县|