用VB5.0 开 发 通 信 软 件 的 技 巧 河 北 省 科 学 院 数 学 研 究 所 
余 益 光 一 自 己 开 发 通 信 软 件 的 必 要 性: 
---- 随 着 计 算 机 应 用 领 域 的 不 断 扩 展, 计 算 机 之 间
的 远 程 通 信 用 得 越 来 越 广 泛. 进 行 计 算 机 通 信 需 要
调 制 解 调 器(modem), 电 话 线 及 通 信 软 件. 尽 管 市 面 上
有 许 多 商 品 通 信 软 件, 但 是 在 许 方 情 况 下 商 品 通 信
软 件 并 不 能 满 足 实 际 工 作 的 需 要. 这 是 因 为 通 用 的
通 信 软 件 虽 然 能 发 送 和 接 收 文 件, 但 有 些 时 侯 是 不
适 用 的. 例 如 我 们 在 开 发 一 个EDI( 电 子 数 据 交 换) 应
用 系 统 时, 就 需 要 把 接 收 到 的 某 个 单 证 直 接 地 自 动
地 放 到 一 个 数 据 库 中, 作 为 一 条 记 录。 这 种 情 况 下
采 用 通 用 的 通 信 软 件 就 不 行 了, 需 要 开 发 自 己 专 用
的 通 信 软 件。 ---- 过 去, 开 发 通 信 软 件 对 于 一 般 的 应 用 软 件 开 发
人 员 来 说 是 比 较 困 难 的。 而 现 在 这 件 事 已 经 变 得 容
易 多 了。 本 文 介 绍 如 何 利 用VB5.0 和MSCOMM 控 件 开 发 通
信 软 件。 ---- 要 想 自 己 开 发 通 信 软 件, 除 了 要 掌 握VB5.0 的 基
本 编 程 语 言 以 外, 还 需 知 道 一 些 微 机 通 信 的 基 本 原
理。 如 有 关 串 行 端 口 及 调 制 解 调 器 的 基 本 知 识, 调
制 解 调 器 的 使 用 手 册 及AT 命 令 集 等。 这 在 许 多 书 中
都 可 以 找 到。 本 文 不 再 叙 述。 二 有 关 预 备 知 识 ---- 在 PC 机 串 行 端 口 与 调 制 解 调 器 进 行 连 接 时, 有
十 几 根 线 进 行 信 号 传 输。 对 于 用MSCOMM 控 件 编 制 通 信
软 件 来 说, 只 需 了 解 以 下 五 根 线 的 代 号 及 作 用。 以
下 五 根 线 的 高 电 平/ 低 电 平 状 态 分 别 对 应 MScomm 控 件
的 相 应 属 性 的 True/False 值。 ---- (1) DTR 线:PC 发 往MODEM, 表 示 PC 机 是 否 已 准 备 好。---- (2) RTS 线:PC 发 往MODEM, 表 示 PC 机 是 否 允 许modem 发
回 数 据. 
---- (3) DSR 线: MODEM 发 往PC, 表 示MODEM 是 否 已 做 好 操 作
准 备 
---- (4) CTS 线: MODEM 发 往PC, 表 示 MODEM 是 否 允 许 发 送 数
据 
---- (5) CD 线: MODEM 发 往PC, 表 示 MOEDM 已 经 与 呼 叫 的 远
方 MODEM 处 于 连 结 状 态 三 MSCOMM 控 件 的 属 性 及 事 件 ---- VB5.0 所 带 的 通 信 控 件 MSCOMM 易 学 易 用。 它 只 有 约
30 个 属 性 和 事 件。 可 以 从VB5.0 的 联 机 帮 助 中 找 到 它
的 全 部 资 料。 本 文 简 述 它 的 主 要 属 性 及 事 件, 并 加
已 归 类 整 理。 以 下 用 MSCOMM1 表 示 在 窗 体 上 设 置 的 一
个 MSCOMM 控 件 的 名 称 ---- ( 一) 通 信 参 数 设 置 ---- (1) CommPort 属 性 
---- 语 法: MSCOMM1.CommPort [=Value] 
---- 作 用: 设 置 或 返 回 联 接 MODEM 的 串 口 的 编 号。 
---- 值: 用1,2, ... 表 示 串 口 COM1,COM2 .... ---- (2) Settings 属 性 
---- 语 法: MSCOMM1.Settings [=Value] 
---- 作 用: 设 置 或 返 回 通 信 参 数。 
---- 值: String 型。 例 入 用 "19200,N,8,1" 表 示 传 输 速 率 为
19200 bps, 没 有 奇 偶 校 验 位,8 位 数 据 位,1 位 停 止 位。 ---- (3) Handshaking 属 性 
---- 语 法: MSCOMM1.Handshaking [=Value] 
---- 作 用 与 值: 设 置 或 返 回 硬 件 握 手 协 议。 指 的 是PC
机MODEM 之 间 为 了 控 制 流 速 而 约 定 的 内 部 协 议。 ---- 0 没 有 握 手 协 议。 不 考 虑 流 量 控 制。 
---- 
---- 1 XON/XOFF。 即 在 数 据 流 中 嵌 如 控 制 苻 来 进 行 流
控。 
---- 2 RTS/CTS 。 既 由 信 号 线RTS/CTS 自 动 进 行 流 量 控 
制。 
---- 3 两 者 皆 可。 
---- 注: 实 践 中 我 们 发 现 选 用 2( 即RTS/CTS) 是 很 方 便 
的。 ---- ( 二) 打 开/ 关 闭 端 口 ---- (4) PortOpen 属 性 
---- 语 法: MSCOMM1.PortOpen [=Value] 
---- 作 用: 打 开 或 关 闭 端 口。 
---- 值: Boolean 型。 设 为 True/False 可 以 打 开/ 关 闭 端 
口。 ---- ( 三) 发 送 数 据 
---- (5) OutBufferSize 属 性 
---- 语 法: MSCOMM1.OutBufferSize [=Value] 
---- 作 用: 设 置 或 返 回 传 输 缓 冲 区 大 小。 
---- 值: Integer 型。 传 输 缓 冲 区 的 字 节 数。 例 如 可 选
1024 。 ---- (6) OutPut 属 性 
---- 语 法: MSCOMM1.OutPut [=Variant] 
---- 作 用: 向 传 输 缓 冲 区 写 数 据 流。 
---- 值: Variant 型 变 量。 
---- 注: 传 输 文 本 数 据 时, 应 将 String 型 数 据 放 入
Variant 变 量, 传 输 二 进 制 数 据( 即 按 字 节) 时, 应 将
Byte 型 数 组 数 据 放 入 Variant 变 量 ---- ( 四) 接 收 数 据 
---- (7) InBufferSize 属 性 
---- 语 法: MSCOMM1.InBufferSize [=Value] 
---- 
---- 
---- 作 用: 设 置 或 返 回 接 收 缓 冲 区 大 小。 
---- 值: Integer 型。 接 收 缓 冲 区 的 字 节 数。 例 如 可 选
1024 。 ---- (8) InputMode 属 性 
---- 语 法: MSCOMM1.InputMode [=Value] 
---- 作 用: 设 置 或 返 回 接 收 数 据 的 数 据 类 型。 
---- 值: 0 用Input 属 性 接 收 文 本 型 数 据。 
---- 1 用Input 属 性 接 收 二 进 制 数 据。 ---- (9) InBufferCount 属 性 
---- 语 法: MSCOMM1.InBufferCount [=Value] 
---- 作 用: 返 回 接 收 缓 冲 区 中 已 传 到 但 还 未 取 走 的
字 符 个 数。 
---- 值: Integer 型。 ---- (10) Input 属 性 
---- 语 法: MSCOMM1.Input [=Variant] 
---- 作 用: 将 接 收 缓 冲 区 中 收 到 的 数 据 读 入 变 量。 
---- 值: Variant 型 变 量。 
---- 注: 当InputMode 属 性 值 为 0( 文 本 模 式) 时, 变 量 中
含 String 型 数 据。 
---- 当InputMode 属 性 值 为 1( 二 进 制 模 式) 时, 变 量 中
含 Byte 型 数 组 数 据。 ---- ( 五) 状 态 控 制 
---- (11) DTREnabled 属 性 
---- (12) RTSEnabled 属 性 
---- (13) DSRHolding 属 性 
---- (14) CTSHolding 属 性 
---- (15) CDHolding 属 性 ---- 以 上 五 个 属 性 即 如 二 所 述, 均 取 值 TRUE/FALSE, 用
于 读 取 或 控 制 pc 机 与 modem 之 间 的 交 互 状 态。 需 运 用
好。 例 如, 应 在 读 取 到 DSRHolding 属 性 值 为TRUE 时 再 向
MODEM 发 出 命 令。 应 当 在 载 波 检 测 到 以 后(CDHolding 属
性 为 TRUE) 时 再 向MODEM 发 送 数 据。 ---- ( 六) 事 件 
---- MSCOMM 控 件 把 实 际 上 是 十 七 个 事 件 归 并 为 一 个
事 件 OnComm, 用 属 性 CommEvent 的 十 七 个 值 来 区 分 不 同
的 触 发 时 机。 主 要 有 以 下 几 个: ---- (1)CommEvent=1 时: 传 输 缓 冲 区 中 的 字 符 个 数 已
少 于 Sthreshold( 可 设 置 的 属 性 值) 个. 
---- (2)CommEvent=2 时: 接 收 缓 冲 区 中 收 到 hreshold( 可
设 置 的 属 性 值) 个 个 字 符. 利 用 此 事 件 可 编 写 接 收 数
据 的 过 程。 
---- (3)CommEvent=3 时: CTS 线 发 生 变 化 . 
---- (4)CommEvent=4 时: DSR 线 发 生 变 化 . 
---- (5)CommEvent=5 时: CD 线 发 生 变 化 . 
---- (6)CommEvent=6 时: 检 测 到 振 铃 信 号 . 
---- 另 外 十 个 情 况 是 可 能 发 生 的 各 种 通 信 错 误 时 触
发。 可 参 看 有 关 资 料. 四 通 信 软 件 参 数 设 置 ---- 在 自 己 编 写 的 通 信 软 件 中, 应 包 含 进 行 通 信 参
数 设 置 的 功 能。 主 要 就 是 可 以 设 置 端 口 号, 波 特 
率, 数 据 位, 停 止 位, 奇 偶 校 验 位 及 设 置 硬 件 握 手
协 议。 ---- 可 在 一 个 窗 体 上 用 下 拉 列 表 框, 选 择 钮 等 由 用
户 来 选 择。《 保 存》 时, 利 用VB5.0 的 Settings 函 数 将 这
些 参 数 存 储 在WINDOWS 95 的 系 统 注 册 表 中。 每 次 运 行
该 软 件 时, 先 用 GetSettings 函 数 调 出 这 些 参 数, 并 对
Commport,Settings,Handshaking 等 属 性 赋 值, 来 进 行 通 信 参
数 设 置。 五 打 开 通 信 端 口 ---- 在 编 写 的 通 信 软 件 的 主 窗 体 上, 可 以 安 排 一 个
打 开/ 关 闭 端 口 的 菜 单 项 或 图 形 按 钮。 在 打 开 端 口
时, 可 向 MODEM 发 出 命 令, 进 行 MODEM 参 数 设 置。 可 以
象 下 面 这 样 来 编 程: ---- '(1) 打 开/ 关 闭 端 口 MSComm1.PORTOPEN = Not MSComm1.PORTOPEN
'(2)向MODEM发出DTR(已准备好)信号-----
OpenFlag = MSComm1.PORTOPEN
If OpenFlag Then
MSComm1.DTREnable = True
Else
MSComm1.DTREnable = False
End If
'(3)打开时向MODEM发出一些命令来设置参数
'S0=n(n >=1)自动应答.n为响铃次数
'E0/E1关闭/打开命令字符回应
'Q0/Q1 modem返回/不返回结果码
'M0/M1关闭/打开MODEM扬声器.
If OpenFlag Then
L1:
If MSComm1.CTSHolding Then
Outstring = "AT S0=1 E1 Q0 M0 " + Chr(13)
MSComm1.Output = Outstring
GoTo LL
Else
GoTo L1
End If
End If
'-----
LL: ...---- 也 可 以 安 排 一 些 可 变 换 颜 色 的 指 示 灯 来 代 表 端
口 打 开 状 态,CD 线 状 态 等, 这 样 更 形 象 生 动。 六 拨 号 ---- 进 行 拨 号 需 向 MODEM 发 出 ATDT 命 令。 可 用 如 下 语
句: cc = "ATDT " + Trim(Text1.Text) + Chr(13)
MSComm1.Output = cc---- 其 中 TEXT1 是 窗 体 上 让 用 户 输 入 电 话 号 的 文 本 
框。 ---- 为 了 使 程 序 功 能 更 强 一 些, 可 以 增 加< 电 话 号 码
簿 管 理 >, 可 以 增 加, 修 改, 删 除, 查 询 电 话 号 码。 这
与 一 般 的 数 据 库 应 用 程 序 是 一 样 的。 七 发 送 文 件 ---- 拨 号 以 后, 程 序 要 循 环 等 待 并 随 时 判 定 是 否 接
通。 如 果 MODEM 向 PC 的 回 应 字 符 串 中 含 有 "Connect " 或
CDHolding 属 性 值 变 为 True ( 检 测 出 载 波), 则 表 示 已 与
远 方MODEM 连 机 了。 这 时 就 可 以 发 送 文 件 了。 ---- 发 送 文 件 开 始 以 前, 可 打 开 一 个 显 示 发 送 信 息
的 窗 口。 可 在 此 窗 口 上 显 示 要 发 送 的 文 件 名, 总 长
度, 已 发 送 长 度 等 信 息。 ---- 设 置 以 下 全 局 变 量, 存 放 标 志 字 符 串, 在 发 送
及 接 收 程 序 中 均 使 用。 S_FILENAME = "FILENAME" + Chr(5) + Chr(13) + Chr(10) 
S_FILELEN = "FILELEN " + Chr(5) + Chr(13) + Chr(10) 
S_FILESTAR = "FILESTAR" + Chr(5) + Chr(13) + Chr(10) (1)打开文件:
要想把一个文件的全部字节都传送,
需以二进制方式打开文件。可用如下语句
'得到下一个可用的文件号,放在整型变量 hSend
hSend = FreeFile
'打开文件
Open SENDFN For Binary Access Read As hSend
LF& = LOF(hSend) '文件长度为 LF&
其中变量 SENDFN中含有由用户选定的要传送的文件名。(2)发送文件名,文件长度,文件开始等信息字符串。
例如,我们设计成如下:
DIM VARC AS VARIANT
VARC = S_FILENAME
MSComm1.Output = VARC '发出 "FILENAME"提示字串
VARC = SENDFN + Chr(13) + Chr(10)
TXRJ.MSComm1.Output = VARC '发出文件名
VARC = S_FILELEN
MSComm1.Output = VARC '发出 "FILELEN"提示字串
VARC = Trim(Str(LF&)) + Chr(13) + Chr(10)
MSComm1.Output = VARC '发出文件宽度
VARC = S_FILESTAR
'发出 "FILESTART"提示字串,表示下面文件开始。
MSComm1.Output = VARC
然后程序倒计时,在发送信息窗口显示 8,7,6,5,4,3,2,1,0 .(3)发送文件内容用 GET语句从文件读字节,用 OUTPUT属性发送。
DIM SENDARR() AS BYTE '定义字节型数组
Sum = 0 '记录累计发送的字节数
BSIZE = MSComm1.OutBufferSize '每次发送的块大小 
ReDim SENDARR(1 To BSIZE)
'循环发送
Do While Sum < LF& 
If LF& - Loc(hSend) < BSIZE Then
BSIZE = LF& - Loc(hSend) 
ReDim SENDARR(1 To BSIZE)
End If
Get hSend, , SENDARR '从文件取字节放入字节数组
SENDVAR = SENDARR '转放到 Variant型变量
'当CTS线及CD线为高电平时才可发送,否则需等待。
T = Timer + 60
L:
If MSComm1.CTSHolding And MSComm1.CDHolding Then 
MSComm1.Output = SENDVAR '发送
Sum = Sum + BSIZE '累加计数
Label6.Caption = Str(Sum) '显示在发送窗口上
Else
If Timer < T Then
GoTo L '循环等待
Else
GoTo CLOSEFILE '等待时间超过 60秒则退出
End If
End If
'等待系统处理完
Do
RET = DoEvents()
Loop Until MSComm1.OutBufferCount = 0
Loop '循环语句结尾---- 文 件 发 送 完 毕 以 后, 关 闭 该 文 件。 并 关 闭 发 送 文
件 信 息 窗 口。 八 接 收 MODEM 回 送 的 信 息 及 接 收 文 件 ---- ( 一) 设 计 要 点: 我 们 是 如 下 进 行 设 计 的。 1.在 主 窗 口 上 设 一 个 多 行 显 示 的 文 本 框, 用 来 显
示 接 收 到 的 所 有 文 本 类 型 信 息。 
2.建 立< 收 件 箱 > 。 实 际 上 是 一 个 数 据 库 中 的 一 个
表. 包 含 收 件 日 期, 文 件 名, 文 件 长 度, 序 号 等
字 段。 
3.利 用 事 件 触 发 机 制 来 执 行 接 收 数 据 的 过 程。 即
编 写 mscomm1 控 件 的OnCOMM 事 件 的 处 理 程 序。 
4.按 以 下 方 法 来 改 变 输 入 模 式 属 性(InputMode) 的
值: 通 常 使InputMode 属 性 为 文 本 模 式。 当 发 现 接
收 到 的 字 符 串 中 有 "FILESTAR" + Chr(5) + Chr(13) +
Chr(10), 按 本 软 件 规 定 表 示 传 送 的 文 件 内 容 将 开
始, 则 将InputMode 属 性 改 为 二 进 制 模 式。 当 文 件
内 容 接 收 完( 由 接 收 的 字 节 数 判 断) 再 将
InputMode 属 性 改 为 文 本 模 式。 
5.利 用 本 软 件 设 计 的 标 志 字 符 串( 见 七) 来 控 制
进 程, 在 发 送 及 接 收 程 序 中 均 使 用。 ---- ( 二) MSCOMM1 控 件 的 OnCOMM 事 件 的 的 处 理 程 序 
Private Static Sub MSComm1_OnComm() 
Select Case MSComm1.CommEvent
Case comEvReceive 
'接收缓冲区收到Rthreshold个字符时触发
Dim VARC As Variant
Dim N As Long
Dim SJARR() As Byte
'
N = MSComm1.InBufferCount '接收缓冲区字符总数
If MSComm1.InputMode = 0 Then
'当输入模式为文本模式时,将收到的数据放到字符串变量。
MSComm1.InputLen = 0
VARC = Space(N)
VARC = MSComm1.Input 
Else
'当输入模式为二进制模式时,将收到的数据放到字节数组。
ReDim SJARR(1 To N)
VARC = ARR
MSComm1.InputLen = N
VARC = MSComm1.Input
End If
ShowDATA TextTerm, N, VARC 
'调接收数据处理过程Showdata
End Select
End Sub(三)接收数据处理过程 ShowDataPublic Static Sub ShowData(Term As Control, _
N As Long, DATA As Variant)
'参数:Term (主窗体上的文本框,用于显示接受数据)
' N 为本次接收到的字节数
' DATA (接收到的数据.Variant型 )
(变量定义部分:略)
'(一)非文件传输情形(接收的是字符串)
If not mscomm1.InputMode= 0 Then
GoTo L2
End If
'(1)把新接收的字符数据放到文本框TERM末尾
Term.SelStart = Len(Term.Text)
Term.SelLength = 0
Term.SelText = DATA 
'(2)未找到文件传输开始标志就结束此过程----
W_FILESTAR = InStr(1, Term.Text, S_FILESTAR, 0)
If W_FILESTAR = 0 Then
Exit Sub
End If
'(3)以下为找到文件传输开始标志的情况
'(3-1)找文件名及文件长度
W_FILENAME = InStr(1, Term.Text, S_FILENAME, 0)
W_FILELEN = InStr(1, Term.Text, S_FILELEN, 0)
FN = Mid(Term.Text, W_FILENAME + 11, (W_FILELEN 
- W_FILENAME - 13))
' (3-2)打开接收文件
hJS = FreeFile
JSFN = Pathc + "\SJFILE\S" + Trim(Str(NO)) + "_" + FN
Open JSFN For Binary Access Write As hJS
'(3-3)收件箱增加新记录 
W_FILENAME = InStr(1, Term.Text, S_FILENAME, 0)
W_FILELEN = InStr(1, Term.Text, S_FILELEN, 0)
FN = Mid(Term.Text, W_FILENAME + 11, (W_FILELEN - 1) -
(W_FILENAME + 11))
FL = Mid(Term.Text, W_FILELEN + 11, W_FILESTAR 
- (W_FILELEN + 10))
SENDLEN = Val(FL)
'应收总字节数SENDLEN
'以下SJRS是已打开的收件箱对应的记录集型变量
SJRS.AddNew '增加一新记录
SJRS!SJRQ = Now '写入收件日期
SJRS!SJFILE = FN '写入收件的文件名
SJRS!SJLEN = Val(FL) '写入收件的长度
SJRS!FILENO = NO '写入收件的序号
'(3-4)显示文件接收窗口
JSLEN = 0
TXINPUT.Show
'(3-5)改变输入模式属性 InputMode为二进制模式
TXRJ.MSComm1.InputMode = comInputModeBinary
'(7)等待几秒,显示 8 7 6 5 4 3 2 1 0
Exit Sub
'(二)文件传输状态处理------------
L2:
ReDim JSARR(0 To N - 1)
JSARR = DATA '将字节流放入字节型数组
'将字节型数组中的数据写入已打开的接收文件
Put hJS, , JSARR
JSLEN=JSLEN+N '本次已累计收到的字节数
'已收字节数与文件总长相比较
If JSLEN < SENDLEN Then
Exit Sub
End If
'转此为文件传输已结束------
'关闭接收文件
Close hJS
'提交收件箱表的新增记录
SJRS.Update
'修改文本显示
W_FILENAME = InStr(1, Term.Text, S_FILENAME, 0)
Term.SelStart = W_FILENAME - 1
Term.SelLength = Len(Term.Text)
Term.SelText = ""
FL = "文件" + FN + "接收结束" + Chr(13) + Chr(10)
Term.Text = Term.Text & FL
'关闭收件窗口
Unload TXINPUT
'改变 InputMode属性为文本模式
TXRJ.MSComm1.InputMode = 0 
Exit Sub
End Sub
~~~~~~~~~~~~---- 以 上 以 发 送 和 接 收 文 件 为 例 介 绍 了 我 们 是 如 何
使 用VB5.0 及MSCOMM 控 件 来 开 发 自 己 的 的 通 信 软 件 的。
掌 握 了 以 上 基 本 技 术, 就 可 以 稍 加 改 变 来 开 发 自 己
的 各 种 专 用 通 信 软 件。 例 如 发 送 数 据 库 的 一 条 记 
录, 并 使 接 收 方 把 接 收 到 的 数 据 也 放 在 数 据 库 中。
也 可 以 进 行 数 据 加 密/ 解 密 传 输 等。 总 之, 学 习 怎 样
使 用VB5.0 及MSCOMM 控 件 来 开 发 自 己 的 的 通 信 软 件 是 十
分 有 用 的。 

解决方案 »

  1.   

    用Winsock控件发信Email   使用控件有:Winsock控件,CommandButton 控件,TextBox 控件 
    编程步骤如下: 
    1.声明变量 
    2.把如下代码加到Command1的Command1_Click事件: 
    Private Sub Command1_Click() 
    Winsock1.LocalPort = 0 '设置本地使用的端口 
    Winsock1.Protocol = sckTCPProtocol '设置Winsock控件使用的协议,TCP或UDP。 
    Winsock1.RemoteHost="smtp.21cn.com" '设置发送Email的服务器 
    Winsock1.RemotePort = 25 '设置要连接的远程端口号 
    Winsock1.Connect '返回与远程计算机的连接。 
    End Sub 
    这里要注意的是:Winsock1.RemotePort的值,80为HTTP,21为FTP,25为SMTP。 3.把如下代码加到Winsock1的Connect事件: 
    Private Sub Winsock1_Connect() ''当一个 Connect 操作完成时发生 
    first = "mail from:" + Chr(32) + "[email protected]" + vbCrLf '发信人地址 
    Second = "rcpt to:" + Chr(32) + "[email protected]" + vbCrLf '收信人地址 
    DateNow = Format(Date, "Ddd") & ", " & Format(Date, "dd Mmm YYYY") & " " & Format(Time, "hh:mm:ss") & "" & " -0600" 
    Third = "Date:" + Chr(32) + DateNow + vbCrLf '开始发信时间 
    Fourth = "From:" + Chr(32) + "VB 小园" + vbCrLf '发信人姓名 
    Fifth = "To:" + Chr(32) + "Jimven"+ vbCrLf '收信人姓名 
    Sixth = "Subject:" + Chr(32) +"VB 小园更新通知" + vbCrLf '发信的主题 
    Seventh = "VB 小园已经更新" + vbCrLf '发信的内容 
    Ninth = "X-Mailer: EBT Reporter v 2.x" + vbCrLf 
    Eighth = Fourth + Third + Ninth + Fifth + Sixth 
    Winsock1.SendData ("HELO www.21cn.com" + vbCrLf) '开始发送 
    Winsock1.SendData (first) 
    Winsock1.SendData (Second) 
    Winsock1.SendData ("data" + vbCrLf) 
    Winsock1.SendData (Eighth + vbCrLf) 
    Winsock1.SendData (Seventh + vbCrLf) 
    Winsock1.SendData ("." + vbCrLf) 
    Winsock1.SendData ("quit" + vbCrLf) 
    End Sub 4.把如下代码加到Winsock1的DataAmival事件: 
    Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long) '接受数据时产生 
    On Error Resume Next '在错误处理程序结束后,恢复原有的运行 
    Dim webData As String 
    Winsock1.GetData webData, vbString '取得发信后的反馈信息,可以检查是否错误 
    Text1.Text = Text1.Text + webData 
    'Debug.Print Text1.Text 
    End Sub 
      

  2.   

    我来说吧,这个程序我做过,你要克服的:
    1、winsock通行的使用,没啥好说的,自己看书
    2、smtp协议的格式,自己查查,以前的贴子有,验证不要缺了,一般的没提(建议,你要是编网络的东东,下点rfc看看)
    3、base64码的编码和解码,用户和密码是base64码加密的,附件也是base64加密的自己编出来的,比outlook要快好几倍呢~~
      

  3.   

    给你一段代码,原理就是用WINSOCK控件来进行连接,根据POP3和SMTP协议来进行接收和发送邮件,至于怎么运用,就看你什么样的需要了,不过,这个程序代码是我以前做的一个邮件炸弹的部分,现在不用了,希望大家做好用途。:)With Winsock1
    '从客户端接收邮件
      .Connect
      .GetData strdata
      If Left$(strdata, 1) = "+" Or m_stat = pop3_retr Then
      
         Select Case m_state
            Case pop3_connect
              intmessages = 0
              m_state = pop3_user
              .SendData "user" + txtusername + vbCrLf
            Case pop3_user
              m_state = pop3_pass
              .SendData "pass" + txtpassword + vbCrLf
            Case pop3_pass
              m_state = pop3_stat
              .SendData "stat" + vbCrLf
            Case pop3_stat
              intmessages = CInt(Mid$(strdata, 5, InStr(5, strdata, " ") - 5))
              If intmessages > 0 Then
                 m_state = pop3_retr
                 intcurrentmessage = intcurrentmessage + 1
                 .SendData "retr 1" + vbCrLf
                Else
                 m_state = pop3_quit
                 .SendData "quit" + vbCrLf
              End If
            Case pop3_retr
         End Select          
    '向客户端发送信件With Winsock1
      .Connect
      .SendData "helo" + " " + .LocalHostName + vbCrLf
      .SendData "mail from:" + " " + strfrommail + vbCrLf
      .SendData "rcpt to:" + " " + strtomail + vbclf
      .SendData "data" + vbCrLf
      .SendData mdata + vbCrLf
      .SendData strcontent + vbCrLf
      .SendData "." + vbCrLf
      .SendData "quit"
      .Close
    End With
      

  4.   

    补充说明:选用的SMTP服务器必须没有SMTP验证,否则不可以用,比如263的SMTP服务器就不可以,BXEMAIL的就可以。
    还有上面的代码没有错误处理,可以根据自己的需要来捕捉错误进行处理。
      

  5.   

    错错错,全都缺 AUTH LOGIN
    97年之前的协议
      

  6.   

    to duqiang2050:不管什么时候的协议,可是就是好使,实践是检验真理的唯一标准,一个可行的东西自然有可行之处。编程序需要搞的那么追求时髦吗?
      

  7.   

    实践是检验真理的唯一标准,是呀,没有AUTH LOGIN的邮箱现在不到1%,sohu/sina/236/163只要能说出名来的全都需要AUTH LOGIN,你的邮件炸弹现在恐怕没用了
      

  8.   

    呵呵,告诉你了BXEMAIL可以啊。什么东西都要变通的!