Новичок
Профиль
Группа: Участник
Сообщений: 8
Регистрация: 14.11.2010
Репутация: нет Всего: нет
|
Здравствуйте. Помогите решить проблему с отправкой точки в конце письма. Вроде все делаю правильно, но все равно приходит ошибка! Посмотрите может что не так?! Зарание благодарен! | Код | unit MailSend;
interface
uses windows, winsock, DIMime;
function SendMail( SmtpServer:string; FromAddr:string; ToAddr:string; MessageText:string): boolean;
implementation
function InttoStr(const Value: integer): string; var S: string[11]; begin Str(Value, S); Result := S; end;
function LookupName(name:string):TInAddr; var HostEnt:PHostEnt; InAddr:TInAddr; begin if name[4]='.' then InAddr.s_addr:=inet_addr(PChar(name)) else begin HostEnt:=gethostbyname(PChar(name)); FillChar(InAddr,SizeOf(InAddr),0); if HostEnt<>nil then begin with InAddr, HostEnt^ do begin S_un_b.s_b1:=h_addr^[0]; S_un_b.s_b2:=h_addr^[1]; S_un_b.s_b3:=h_addr^[2]; S_un_b.s_b4:=h_addr^[3]; end; end end; Result:=InAddr; end;
function RecvText(S:TSocket):string; const MAX_BUFF_SIZE=1024; var Recvbuff:array[0..MAX_BUFF_SIZE-1] of char; iRecv:integer; TempStr:string; begin Result:=''; ZeroMemory(@Recvbuff,SizeOf(RecvBuff)); iRecv:=recv(S,RecvBuff,MAX_BUFF_SIZE, 0); if iRecv=0 then exit else if iRecv=Socket_Error then exit else begin TempStr:=RecvBuff; Result:=Copy(TempStr,1,Pos(#13,TempStr)); end; end;
function SendText(S:TSocket;Text:string):boolean; const MAX_SEND_SIZE=1024; var SendBuff:array[0..MAX_SEND_SIZE] of char; iSend:integer; SendStr:string; begin Result:=false; SendStr:=Text+#13#10; if Length(SendStr)>MAX_SEND_SIZE then exit; CopyMemory(@SendBuff,PChar(SendStr),Length(SendStr )); iSend:=send(S,SendBuff,Length(SendStr),0); if iSend=SOCKET_ERROR then exit; Result:=true; end;
function SendMail( SmtpServer:string;FromAddr:string; ToAddr:string; MessageText:string): boolean;
var WData:WSADATA; sMailSocket{,sPOP3Socket}:TSocket; saServerMail:SockAddr_In; RecvMailText,SendMailText:string; LocalHost :ARRAY [0..63] OF CHAR; ts: String; Rnd :String; begin
MessageBox(0,'start email send ',nil,mb_ok); Result:=false; if WSAStartup(MAKEWORD(1,1),WData)<>0 then exit; sMailSocket:=socket(PF_INET,SOCK_STREAM,IPPROTO_IP ); if sMailSocket=INVALID_SOCKET then exit; saServerMail.sin_addr.s_addr:=htonl(INADDR_ANY); saServerMail.sin_family:=AF_INET; saServerMail.sin_port:=htons(25); saServerMail.sin_addr:=LookupName(SmtpServer); if connect(sMailSocket,saServerMail,SizeOf(saServerMail))=SOCKET_ERROR then exit;
//Randomize; // Rnd := '---'+IntToStr(Random(99999999))+'--'+IntToStr(Random(9999))+'-'; //generate boundary
//***********Connect***********// RecvMailText:=RecvText(sMailSocket); MessageBox(0,pchar('connect --- 220? '+RecvMailText),nil,mb_ok); if Pos('220',RecvMailText)=0 then begin CloseSocket(sMailSocket); exit; end;
//*********HELO*********// GetHostName(LocalHost,SizeOf(LocalHost)); SendMailText:='HELO Forum.ru '+LocalHost ; if not SendText(sMailSocket,SendMailText) then begin CloseSocket(sMailSocket); exit; end; RecvMailText:=RecvText(sMailSocket); MessageBox(0,pchar('HELO --- 250? '+RecvMailText),nil,mb_ok); if Pos('250',RecvMailText)=0 then begin CloseSocket(sMailSocket); exit; end;
//***********AUTH*************// begin SendMailText:='AUTH LOGIN '; if not SendText(sMailSocket,SendMailText) then begin CloseSocket(sMailSocket); exit; end; RecvMailText:=RecvText(sMailSocket); MessageBox(0,pchar('AUTH LOGIN --- 334? '+RecvMailText),nil,mb_ok);
//**************SEND LOGIN*************// ts:=MimeEncodeString('admin'); //login SendMailText:= ts; if not SendText(sMailSocket,SendMailText) then begin CloseSocket(sMailSocket); exit; end; RecvMailText:=RecvText(sMailSocket); MessageBox(0,pchar('LOGIN --- 334? '+RecvMailText),nil,mb_ok);
//************SEND PASS***************// ts:=MimeEncodeString('admin'); //pass SendMailText:= ts; if not SendText(sMailSocket,SendMailText) then begin CloseSocket(sMailSocket); exit; end; RecvMailText:=RecvText(sMailSocket); MessageBox(0,pchar('PASS --- 235? '+RecvMailText),nil,mb_ok); end;
//*****************MAIL FROM*************// SendMailText:='MAIL FROM:<[email protected]>'; //'+FromAddr+' if not SendText(sMailSocket,SendMailText) then begin CloseSocket(sMailSocket); exit; end; RecvMailText:=RecvText(sMailSocket); MessageBox(0,pchar('MAIL FROM --- 250? '+RecvMailText),nil,mb_ok); if Pos('250',RecvMailText)=0 then begin CloseSocket(sMailSocket); exit; end;
//*******************RCPT TO****************// SendMailText:='RCPT TO:<'+ToAddr+'>'; // '' if not SendText(sMailSocket,SendMailText) then begin CloseSocket(sMailSocket); exit; end; RecvMailText:=RecvText(sMailSocket); MessageBox(0,pchar('RCPT TO: --- 250? '+RecvMailText),nil,mb_ok); if Pos('250',RecvMailText)=0 then begin CloseSocket(sMailSocket); exit; end;
//*******************DATA****************// SendMailText:='DATA'; if not SendText(sMailSocket,SendMailText) then begin CloseSocket(sMailSocket); exit; end; RecvMailText:=RecvText(sMailSocket); MessageBox(0,pchar('DATA --- 354? '+RecvMailText),nil,mb_ok); if Pos('354',RecvMailText)=0 then begin CloseSocket(sMailSocket); exit; end;
SendMailText:= 'X-Mailer: StudMailer'#13#10+ 'From: [email protected]'#13#10+ //+mailFrom+ 'To: '+ToAddr+ #13#10+ // +mailTo+ 'Subject: test!'#13#10+ //+mailSubject+ 'MIME-Version: 1.0'#13#10+ 'Content-Type: text/plain; charset=windows-1251'#13#10#13#10+ MessageText; // body mail
SendText(sMailSocket,SendMailText); SendMailText:='.'; if not SendText(sMailSocket,SendMailText) then RecvMailText:=RecvText(sMailSocket); MessageBox(0,pchar('. --- 250? '+RecvMailText),nil,mb_ok); if Pos('250',RecvMailText)=0 then begin CloseSocket(sMailSocket); exit; end; SendMailText:='QUIT'#13#10 ; SendText(sMailSocket,SendMailText); Result:=true; WSACleanUp; end;
end.
|
Это сообщение отредактировал(а) c0der - 27.11.2010, 21:50
|