使用vb.net編寫一個郵件定時發送程式(一)

來源:互聯網
上載者:User

    上次使用jmail.net編寫了一個web版的郵件發送小程式,這個適合於需要即時發送郵件的場合,比如說擷取、找回密碼等。但在實際使用中,還有一種需求,就是需要發送定時郵件,比如我準備在系統裡加入一個“寄件提醒”功能,可以讓使用者將需要提醒的事物列入其中,到了指定的時間自動發送一封郵件,或者今天將當日過生日的同事列出來,以人力資源部的名義發送郵件祝賀等。

    SQL SERVER 2005已經有了一個比較好用的“資料庫郵件”功能,原來曾想用就使用資料庫郵件,然後使用定時任務來進行處理,但考慮到對資料庫的效能影響,而且在論壇上討論時,有網友認為資料庫的主業是存放資料的,不要把發送郵件這些也全部給它做,因此決定自己編寫一個小程式用於處理這些事物。

    雖然說這種小程式可能對大家來說很簡單,但本著一是練練手,二是分享給大家,以便今後有需要的或者初學vb.net的朋友做個參考,還是將編寫的步驟分享出來,如果大家認為有更好的處理方法的,也希望一併提出共同進步。

    開發環境:windows 2003/vs 2005/sql server 2005,使用的語言:vb.net 2005

    首先考慮的是功能,發實現定時發送郵件,就需要使用到定時功能,然後需要從資料庫讀取需發送的郵件,最後通過郵件發送功能將其發送出去。設計之初我就想將其做成一個通用的版本,所有項目都不固定,可以通過參數來設定,最少需要以下幾個內容:(1)資料庫伺服器的資訊,包括伺服器位址、使用者名稱、密碼及資料庫名稱,原來還想可以指定儲存郵件的資料表的名稱,後來想想這些也應該可以統一,就沒有指定了;(2)郵件伺服器的資訊,包括SMTP伺服器位址、連接埠號碼、使用者名稱、密碼、密碼驗證方式、寄件者地址、寄件者名稱等;(3)程式自身的功能,包括掃描的時間間隔,記錄檔的儲存路徑等。

 

    其次開始介面設計,說實話,我的編碼水平很低,但介面的設計水平更低,考慮到這個軟體是運行在伺服器上的,希望把介面設計的小一點,最後決定使用TabControl控制項,將需要的多個內容分散在不同的卡頁上,具體的內容大家就看吧。

  

    介面設計告一段落後,開始正式代碼設計。

    我首先考慮的是參數的儲存,現在比較常用的參數儲存方式有四種:ini檔案儲存、註冊表儲存、xml格式儲存和資料庫儲存。因為程式本身就很簡單,我就決定使用INI檔案儲存在程式目前的目錄的方式。INI檔案的讀寫,可以使用Windows API函數很簡單的實現,代碼如下:

 

    '讀ini API函數    Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Int32, ByVal lpFileName As String) As Int32    '寫ini API函數    Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Int32 '讀取ini檔案內容    Public Function GetINI(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As String        Dim Str As String = LSet(Str, 256)        GetPrivateProfileString(Section, AppName, lpDefault, Str, Len(Str), FileName)        Return Microsoft.VisualBasic.Left(Str, InStr(Str, Chr(0)) - 1)    End Function    '寫ini檔案操作    Public Function WriteINI(ByVal Section As String, ByVal AppName As String, ByVal lpDefault As String, ByVal FileName As String) As Long        WriteINI = WritePrivateProfileString(Section, AppName, lpDefault, FileName)    End Function

    需要注意的一點是,在vb.net中,定義API函數最後的資料類型應為int32,而在vb中,是long。

    使用的方法:在form裝載時讀取INI檔案的內容,並將參數內容填充到相應的參數框內。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load        Dim IniFile As String        'ini檔案名稱為 Sendmail.ini        IniFile = Application.StartupPath + "\Sendmail.ini"        If Not File.Exists(IniFile) Then            MsgBox("sendmail.ini檔案不存在,請確認" + vbCrLf + IniFile, MsgBoxStyle.OkOnly, "檔案沒有找到")            End        End If        Txt_DbServer.Text = GetINI("DataBase", "server", "", IniFile)        Txt_SmtpServer.Text = GetINI("SMTP", "server", "", IniFile)        Dim SaveLog  As Integer = GetINI("SendMail", "SaveLog", "", IniFile)        If (SaveLog = 1) Then            Chk_LogFile.Checked = True        ElseIf (SaveLog = 0) Then            Chk_LogFile.Checked = false        End If        '其他項目類似,就不一一列出了    End Sub

    今天就先寫到這裡吧,在接下的一篇裡,我準備寫一下如何使用Encrypter.DecryptDES為參數的敏感資訊加密、解密,並且開始設計資料庫結構。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.