现在的位置: 首页 > 综合 > 正文

使用vb.net编写一个邮件定时发送程序(一)

2012年02月28日 ⁄ 综合 ⁄ 共 2753字 ⁄ 字号 评论关闭

    上次使用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为参数的敏感信息加密、解密,并且开始设计数据库结构。

抱歉!评论已关闭.