这篇贴子在ASM版放了四五天了,希望能在这里找到答案,关于smtp.

AntGhazi 2001-10-29 02:38:52
http://www.csdn.net/expert/topic/341/341480.shtm

使用socket发送邮件,前面正常,但当发送:0Dh,0Ah,".",0命令时,则收不到返回信息,无限等待下去,是否命令格式错误?。相同情况下,在C++中则没有问题,邮件发送也正常。各位兄弟可曾遇到此情况?

为方便测试,发送内容都直接定义,本机已经安装邮件服务器:
.386
.model flat,stdcall
option casemap:none

;包函inc文件
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\windows.INC
include \masm32\include\ws2_32.inc

;包函lib库文件
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\ws2_32.lib

.data ;出初化数据
wsd WSADATA <>
szServer db "127.0.0.1",0
strSuc db "正常退出",0
strErr db "异常退出",0
strMailFrom db "2@antghazi.com",0
strMailTo db "2@antghazi.com",0
strHeader db "hello",0
strBody db "OK",0

cmdHELO db "HELO",0DH,0AH,0
cmdFROM db "MAIL FROM:<","2@antghazi.com",">",0DH,0AH,0
cmdTO db "RCPT TO:<","2@antghazi.com",">",0DH,0AH,0
cmdDATA db "DATA",0DH,0AH,0
cmdEND db 0DH,0Ah,".",0DH,0AH,0
cmdQUIT db "QUIT",0DH,0AH,0

strRecv1 db 100 dup (","),0
.data?
cClent SOCKET ?
server sockaddr_in <>
strSend db ?
.code
start:
;出初化
invoke WSAStartup,202,offset wsd
.if eax!=0
jmp Exit_Main
.endif

;创建套接字
invoke socket,AF_INET,SOCK_STREAM,IPPROTO_TCP
.if eax==INVALID_SOCKET
jmp Exit_Main
.endif
mov cClent,eax

;设置所要连接的服务器
mov esi,offset server
assume esi:ptr sockaddr_in ;相当于C++中强制类型转换
mov [esi].sin_family,AF_INET
invoke htons,25
mov [esi].sin_port,ax
invoke inet_addr,addr szServer
.if eax==INADDR_NONE
jmp Exit_Main
.endif
mov [esi].sin_addr.S_un,eax

;开始与服务器建立连接
invoke connect,cClent,addr server,SIZEOF server
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;开始发邮件
;第一条命令,HELO
invoke send,cClent,addr cmdHELO,SIZEOF cmdHELO,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;第二条命令Mail From
invoke send,cClent,addr cmdFROM,SIZEOF cmdFROM,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;第三条命令Mail TO
invoke send,cClent,addr cmdTO,SIZEOF cmdTO,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;第四条命令DATA
invoke send,cClent,addr cmdDATA,SIZEOF cmdDATA,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;第五条命令 结束符"."
invoke send,cClent,addr cmdEND,SIZEOF cmdEND,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
invoke recv,cClent,addr strRecv1,SIZEOF strRecv1,0 ;此处接收不到返回信息,程序停在这里,不知原因。请大家帮忙
invoke MessageBox,NULL,addr strRecv1,addr strRecv1,MB_OK
;第六条命令 QUIT
invoke send,cClent,addr cmdQUIT,SIZEOF cmdQUIT,0
.if eax==SOCKET_ERROR
jmp Exit_Main
.endif
;邮件发送结束

invoke closesocket,cClent
invoke WSACleanup
invoke MessageBox,NULL,addr strSuc,addr strSuc,MB_OK
invoke ExitProcess,0
jmp Exit
Exit_Main:
invoke MessageBox,NULL,addr strErr,addr strErr,MB_OK
invoke ExitProcess,0
Exit:
end start
...全文
101 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
AntGhazi 2001-11-12
  • 打赏
  • 举报
回复
多谢各位兄弟,分儿献上,敬请笑纳!
AntGhazi 2001-10-30
  • 打赏
  • 举报
回复
up...............
AntGhazi 2001-10-30
  • 打赏
  • 举报
回复
.
binglex 2001-10-29
  • 打赏
  • 举报
回复
程序看不出什么,你用sniffer抓一下发送出去的数据包看看有什么问题,和用c++写的程序发出去的数据包有什么不同,应该可以解决
AntGhazi 2001-10-29
  • 打赏
  • 举报
回复
没有人知道?

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧