我想做个电子邮件到达提示系统,请大家给点思路。

benjamin8064 2005-05-12 04:41:30
检查服务器上邮件的数量部分已经搞定了,但是我不知道怎样判断这些邮件中哪些是新邮件?请大家给点思路。

PS:我是用winsock控件实现检查服务器上邮件的数量的
...全文
161 点赞 收藏 15
写回复
15 条回复
nz 2005年05月17日
学习
回复 点赞
900126 2005年05月16日
都是这样做的,你做仔细点,速度和容量都不是问题。
回复 点赞
hsn1982 2005年05月16日
关于POP命令的资料,请参考:
http://mycat.name/rfc1725.txt
回复 点赞
benjamin8064 2005年05月14日
MSN、雅虎通、泡泡等一些聊天工具的邮件到达提示是怎么做的?有人知道吗?
回复 点赞
南山明月 2005年05月13日
mark
回复 点赞
hsn1982 2005年05月13日
除了贴转载还会干吗》。。。

to 楼主:每个邮件有一个唯一的unique-id,是有服务器定义的,发送命令UIDL可以查看到所有邮件的unique-id.
发送UIDL 1,得到第一个邮件的unique-id。
只要把取过的邮件unique-id记录下来,然后对比就可以达到检查新邮件的功能了
回复 点赞
benjamin8064 2005年05月13日
To xiaohuangtao(绿毛网虫):要钱的?有免费的吗?能不能给具体的地址?
回复 点赞
xiaohuangtao 2005年05月13日
http://www.smartmaildemo.com 上有代码下载。
回复 点赞
benjamin8064 2005年05月13日
这段程序是不是还少一部分?CMessage类未定义?
回复 点赞
TechnoFantasy 2005年05月13日
VB邮件检查程序

按下表所示设置各控件的属性。

控件 名称 描述
Textbox txtHost 用于输入邮件服务器的名称或地址
Textbox txtUserName 输入用户名
Textbox txtPassword 输入密码
Textbox txtBody 显示邮件内容
Listview lvMessages 显示邮件清单
Command Button cmdCheckMail 用于启动接收并显示邮件的子程序
Command Button cmdExit 退出程序

将名为txtBody的文本框的Multiline属性设为True,Scrollbars属性设为3-Both。选择ListView控件,打开其属性对话框,在“列首”标签页中插入四个列,文本分别为: "From", "Subject", "Date", "Size",然后将该控件的View属性设为3-lvwReport。

直观的界面显示你是如何使用本程序的。首先输入邮件服务器的名称或地址,然后是你的用户名和密码。最报按检查邮件按钮。接下来,我们就会看到在ListView中显示的邮件列表了。点选其中的一项,邮件的内容就会显示在下面的文本框中。

从程序的外观及VB由事件驱动的本质,我们可以猜出我们只需要处理两个事件:cmdCheckMail_Click和lvMessages_ItemClick.至于cmdExit中的事件我想就不必说了。先别急,让我们一步步来看看本程序的代码是怎样的。首先看看“检查邮件”按钮。当你按下这个按钮后,程序会首先检查文本框中的内容,然后调用Winsock的Connect方法连上远程服务器。下面是程序代码:

Private Sub cmdCheckMail_Click()

'检查除txtBody之外所有文本框的内容是否为空
For Each c In Controls
If TypeOf c Is TextBox And c.Name <> "txtBody" Then
If Len(c.Text) = 0 Then
MsgBox c.Name & " can't be empty", vbCritical
Exit Sub
End If
End If
Next
'改变当前进程状态的值
m_State = POP3_Connect
'关闭socket以防它已被另一个进程打开
Winsock1.Close
'重置 local port的值,Windows Socket会自动寻找一个新值
'这样做是为了防止出现 "地址正在被使用"的错误,
'这种情况通常出现在Winsock控件已被前一个进程所使用
Winsock1.LocalPort = 0
'POP3服务器通常用端口110来等待连接请求
'因此我们要让Winsock控件用这个端口连上服务器。
Winsock1.Connect txtHost, 110

End Sub

除了下面这个语句之外,其它都一目了然。

m_State = POP3_Connect

现在就让我来解释一下这个语句。当触发了cmdCheckMail_Click事件后,所运行的程序代码的目的是要连上远程邮件服务器。下面要进行的操作就转由在Winsock控件的DataArrival事件中的代码来控制了。

每次当Winsock收到数据时,都会触发DataArrival事件。根据已收到的数据和你所发出的命令,程序才知道应执行在该事件中的哪一部分代码,以真正完成数据的接收。

为了让程序记住你上次发出的命令,或者说当前进程的状态,我们使用了m_State变量。该变量存放你事先定义好的一个特殊的数据类型:POP3States的值。

Private Enum POP3States
POP3_Connect
POP3_USER
POP3_PASS
POP3_STAT
POP3_RETR
POP3_DELE
POP3_QUIT
End Enum

下面是Winsock的DataArrival事件中的代码。该代码的绝大部分是注释以向你解释程序所做的每一步。如果你觉得闷的话就跳过不看就是了。

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)

Dim strData As String

Static intMessages As Integer '要下载的消息数(也就是邮件数)
Static intCurrentMessage As Integer '已下载的消息数
Static strBuffer As String '正在下载的消息的缓冲

将收到的数据存放在strData变量中
Winsock1.GetData strData

If Left$(strData, 1) = "+" Or m_State = POP3_RETR Then
'如果来自服务器的回应的第一个字符为加号
'表明服务器已收到你发出的命令并等待下一个命令
'如果服务器返回的字符串的第一个字符为减号,那我们在这里就什么也做不了。
'操作被转到ELSE后面部分的代码。
'当处于数据接收状态时,来自服务器的字符串的第一个字符就可能不是加号或减号,所以要用到第二个条件
'm_State = POP3_RETR (正在接收消息的状态)
Select Case m_State
Case POP3_Connect
'
'重置消息数
intMessages = 0
'
'改变进程状态
m_State = POP3_USER
'
'向服务器发出带参数的USER命令
'参数是信箱名
'别忘了在命令的最后加上vbCrLf
Winsock1.SendData "USER " & txtUserName & vbCrLf
'这是本次事件的结束,下次开始跳过上一部分,而从下面开始执行
' Case POP3_USER部分
Case POP3_USER

'如果用户名检查通过就进行下一部分
'现在向服务器发送你的密码

'改变进程的状态
m_State = POP3_PASS
'
'向服务器发送PASS命令,以你的密码为参数
Winsock1.SendData "PASS " & txtPassword & vbCrLf
Case POP3_PASS
'
'如果服务器通过了你的身份验证,我们就可以向服务器发送STAT命令了
'作为对STAT的回应,服务器会传回你邮箱中的消息数及大小
'
'改变当前进程的状态
m_State = POP3_STAT
'
'现在发送STAT命令
Winsock1.SendData "STAT" & vbCrLf
Case POP3_STAT
'
'服务器对STAT的回应看上去象这样
'"+OK 0 0" (邮箱中没有邮件)或 "+OK 3 7564"
'(邮箱中有邮件).显然,我们必须找到来自服务器返回的字符串中的第一个数字

intMessages = CInt(Mid$(strData, 5, InStr(5, strData, " ") - 5))
If intMessages > 0 Then
'
'如果邮箱中有邮件
'改变进程的状态
m_State = POP3_RETR
'
intCurrentMessage = intCurrentMessage + 1
'
'现在准备向服务器发送RETR命令
'以便接收第一条消息
Winsock1.SendData "RETR 1" & vbCrLf
Else
'如果邮箱中没有邮件就断开同服务器的连接结束进程

m_State = POP3_QUIT
Winsock1.SendData "QUIT" & vbCrLf
MsgBox "You have not mail.", vbInformation
End If
Case POP3_RETR
'在接收邮件时执行下面执行下面的代码
'邮件可能会很大,并触发多次DataArrival事件
'接收到的数据被存放在 strBuffer变量中
strBuffer = strBuffer & strData
'
'用下面的语句判断消息的结束
'邮件是以小数点结尾的
If InStr(1, strBuffer, vbLf & "." & vbCrLf) Then
'
'邮件下载完毕
'
'删除由服务器返回的第一行字符串
strBuffer=Mid$(strBuffer, InStr(1, strBuffer, vbCrLf)+2)
'
'删除最后一个只有小数点的字符
strBuffer = Left$(strBuffer, Len(strBuffer) - 3)
'
'把消息存放在m_colMessages集合中
Set m_oMessage = New CMessage
m_oMessage.CreateFromText strBuffer
m_colMessages.Add m_oMessage, m_oMessage.MessageID
Set m_oMessage = Nothing
'
'清空缓冲,准备接收下一条邮件
strBuffer = ""
'
'将已收的邮件数同服务器目前的邮件数作比较
If intCurrentMessage = intMessages Then
'如果相等,表示已接收完所有的邮件
'所以发送一个QUIT命令给服务器
m_State = POP3_QUIT
Winsock1.SendData "QUIT" & vbCrLf
Else
'如果二者不等,表明还有邮件没有接收

intCurrentMessage = intCurrentMessage + 1
'
'改变当前进程的状态
m_State = POP3_RETR
'
'向服务器发出RETR命令接收下一个邮件
Winsock1.SendData "RETR " & CStr(intCurrentMessage) & vbCrLf
End If
End If
Case POP3_QUIT
'不管我们收到什么样的邮件,记得关闭同服务器的连接
Winsock1.Close
'现在调用 ListMessages子程序,以便在ListView中显示收到的邮件
Call ListMessages
End Select
Else
'下面的错误处理的代码
'只须关闭socket并将来自服务器的回应显示出来就行了。
'即使是那些高级的邮件接收程序所做也不外如此
Winsock1.Close
MsgBox "POP3 Error: " & strData, _
vbExclamation, "POP3 Error"
End If

End Sub

回复 点赞
benjamin8064 2005年05月13日
ding
回复 点赞
benjamin8064 2005年05月13日
To hsn1982(久违了,肥猫) :
你有类似UIDL这种邮件服务器相关的命令介绍吗?
回复 点赞
hsn1982 2005年05月13日
可以定时清理下服务器端邮件。
我觉得没有更合适的方法了。因为只有UIDL命令才能标识唯一
回复 点赞
benjamin8064 2005年05月13日
To hsn1982(久违了,肥猫) :
你的方法我试过了,应该是可行的,但是会不会效率比较低啊?
因为我过一段时间就要去服务器检查邮件的,如果邮件一多的话,那个记录unique-id的文件就会越来越大

To xiaohuangtao(绿毛网虫) :
谢谢,我看看
回复 点赞
xiaohuangtao 2005年05月13日
http://www.smartmaildemo.com 软件下载页面,完全免费!点击试用下载,就可以了。
回复 点赞
发动态
发帖子
网络编程
创建于2007-09-28

1145

社区成员

1.8w+

社区内容

VB 网络编程
社区公告
暂无公告