上次使用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函数很简单的实现,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
'读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文件的内容,并将参数内容填充到相应的参数框内。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
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为参数的敏感信息加密、解密,并且开始设计数据库结构。