帮我看看这个winapi发邮件程序不能正常执行的原因(两个问题200分)(200分)

  • 主题发起人 主题发起人 wdl
  • 开始时间 开始时间
W

wdl

Unregistered / Unconfirmed
GUEST, unregistred user!
论坛里看到的一段程序,问题在注释中。
unit Unit1;
interface
uses
SysUtils,winsock,Forms, StdCtrls, Classes, Controls;
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
const
CRLF=#13#10;
{$R *.dfm}
function StartNet(host:string;port:integer):integer;
var
wsadata:twsadata;
fsocket:integer;
SockAddrIn:TSockAddrIn;
err:integer;
begin
//为网络连接作好准备(用winsock1.1以上版本)
WSAStartup($0101,WSAData);
//创建一个客户端套接字(Client Socket,用SOCK_STREAM,即TCP协义)
FSocket := socket(PF_INET, SOCK_STREAM,IPPROTO_IP);
//初始化网络数据
SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(host)); //问题1:host是smtp.21cn.com 而函数inet_addr返回的一直是-1,查看帮助
//The Windows Sockets inet_addr function converts a string containing an Internet Protocol dotted address into an in_addr
//测试了一下这个函数对ip地址是能返回一个longint值的,那就是说inet_addr这个函数在源程序中参数传递错了吧?
SockAddrIn.sin_family := PF_INET;
SockAddrIn.sin_port :=htons(port);
//客户端向smtp进行连接
repeat
err:=connect(FSocket,SockAddrIn, SizeOf(SockAddrIn)); //问题2:上面host给了ip地址以后这个connect仍然返回-1,怎么回事?

until err=0;
//
Result:=FSocket;
end;
//以下是网络关闭的过程
procedure StopNet(Fsocket:integer);
begin
//发信结束,关闭客户端套接字(Close Client Socket)
closesocket(FSocket);
//清除网络参数
WSACleanup;
end;
//下面是个发送数据包的过程
function SendData(FSocket:integer;SendStr:string):integer;
var
DataBuf:array[0..1024] of char;
begin
//读取网络数据
recv(FSocket,DataBuf,1024,0);
//将网络数据写入主窗口的标题中,提示用户正在发信过程中

//WriteCaption(handle,DataBuf);
//向网络发送数据
strcopy(DataBuf,pchar(SendStr));
send(FSocket,DataBuf,strlen(DataBuf),MSG_DONTROUTE);
Result:=0;
end;

//下面是个发信的过程
procedure TForm1.Button1Click(Sender: TObject);
var SendBody:string;
FSocket:integer;dest:string;
begin
FSocket:=StartNet('smtp.elong.com',25);
SendData(FSocket,'EHLO'+CRLF);
SendData(FSocket,'dXNlcg=='+CRLF);// 编码后的用户名:'user'
SendData(FSocket,'cGFzc3dvcmQ='+CRLF); // 编码后的:'password'
SendData(FSocket,'MAIL FROM:<user@elong.com>'+CRLF);
dest:='user@elong.com';
SendData(FSocket,'RCPT TO: <'+dest+'>'+CRLF);
SendData(FSocket,'DATA'+CRLF);
SendBody:='From:"bome 2001"<cnxxx_007@elong.com>'+CRLF
+'To:"bome 2001"<cnxxx_007@elong.com>'+CRLF
+'Subject:<cnxxx_007@elong.com>'+CRLF
+CRLF
+'Hello World.'+CRLF
+'.'+CRLF;
SendData(FSocket,SendBody);
//第六步:发结QUIT指令,表示发信过程结束
SendData(FSocket,'QUIT'+CRLF);
StopNet(Fsocket);
end;




end.

 
1.inet_addr(PChar(host));
此函数中host必须是IP地址,也就是'192.168.0.1'的形式。如果是'smtp.21cn.com '的形式
应先用GestHostByName()解析得IP地址才行。

2.问题出在1
 
但是1的地方已经填入正确IP地址了为什么connect还是连接不上那?
 
StartNet('202.104.32.230',25)
我试过了,没有问题。你看你能ping通smtp.21cn.com 吗?
 
oh,确实没问题,也不知道以前怎么搞的 :) 结束问题。
 
WSAStartup($0101,WSAData);
FSocket := socket(PF_INET, SOCK_STREAM,IPPROTO_IP);
SockAddrIn.sin_addr.s_addr:=inet_addr(PChar('202.104.32.230'));
//202.104.32.230 为 smtp.21cn.com的IP地址
SockAddrIn.sin_family := PF_INET;
SockAddrIn.sin_port :=htons(25);
err:=connect(FSocket,SockAddrIn, SizeOf(SockAddrIn));
showmessage(IntToStr(err));
{这里显示0表示连接成功}
closeSocket(FSocket);
以上代码我只是把你代码里的注释去掉了,连接没有问题。你看看你的防火墙是不是允许
连接了。如果防火墙阻止的情况下返回的是-1。
 
后退
顶部