Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

API и сокет [D5]


Sour ©   (2002-08-19 12:19:00) 

Кто-нибудт знает как на API создать сокет, чтобы можно было конектиться на какой-то адрес на любой порт, а потом делать так:
Sok.Write("helo");
Здесь получить с сервака 250 и продолжать дальше....
Sok.Write("mail from:<user1@loh.tut>");
Здесь получить с сервака что все OK
Sok.Write("rcpt to:<sourpost@nvkz.net>");
Здесь получить с сервака что все OK
Sok.Write("data");
Здесь получить с сервака что все OK
Sok.Write("bla...bla...bla...");
Здесь получить с сервака что все OK
Sok.Write(".");
Здесь получить с сервака что все OK
Sok.Write("quit");
Здесь получить с сервака что все OK


ssv   (2002-08-22 09:34:00) [1]

> suka866

А можно ли это перелапатить под UDP, а потом еще и получить ответ,
Просто я здесь особо не въезжаю


madcap   (2002-08-22 02:48:00) [2]


> suka866

Большое СПАСИБО


suka866   (2002-08-21 20:13:00) [3]

Да, забыл сказать - ответы SMTP сервака не проверяются (но принимаются в recvBuf). Если хочешь допиши сам, но в принципе и так работает.


suka866   (2002-08-21 20:10:00) [4]

Письмо хочешь отправлять? Мне в свое время тоже ни одна сука не отвечала, пришлось самому разбираться. Вот тебе моя тестовая прога с тех времен


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, WinSock, ExtCtrls;

type
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Edit3: TEdit;
Label3: TLabel;
Memo1: TMemo;
Label4: TLabel;
Button1: TButton;
Edit4: TEdit;
Label5: TLabel;
Label6: TLabel;
Bevel1: TBevel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}
{$INCLUDE base64.inc}


var SMTPsock:integer;
base64string,Boundary:string;

function GenerateBoundary : string;
var
s: string;
i : integer;
begin
randomize;
s := "gMS4";
for i := 1 to 20 do
begin
s := s + chr( 97 + random( 25));
end;
result := s+"56H";
end;

procedure SendMes(mes:string);
var i:integer;
begin
for i:=1 to length(mes) do if send(SMTPsock,mes[i],1,0)=SOCKET_ERROR then exit;
end;

procedure sendmail;
var conr:integer;
SMTPaddr:sockaddr_in;
wsad:WSAData;
recvBuf: array[0..255] of char;
begin
if WSAStartup($0101, wsad) = 0 then
begin
SMTPsock:=socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if SMTPsock<>INVALID_SOCKET then
begin
SMTPaddr.sin_family := AF_INET;
SMTPaddr.sin_addr.S_addr := inet_addr(pchar(Form1.Edit3.Text));
SMTPaddr.sin_port := htons(25);
conr:=connect(SMTPsock,SMTPaddr,sizeof(SMTPaddr));
if conr=0 then
begin
recv(SMTPsock,recvBuf,sizeof(recvBuf),0);
SendMes("HELO tom.inbox.lv"+#13+#10);
recv(SMTPsock,recvBuf,sizeof(recvBuf),0);
SendMes("MAIL FROM: "+Form1.Edit1.Text+#13+#10);
recv(SMTPsock,recvBuf,sizeof(recvBuf),0);
SendMes("RCPT TO: "+Form1.Edit2.Text+#13+#10);
recv(SMTPsock,recvBuf,sizeof(recvBuf),0);
SendMes("DATA"+#13+#10);
recv(SMTPsock,recvBuf,sizeof(recvBuf),0);
SendMes("To: "+"qwe <"+Form1.Edit2.Text+">"+#13+#10);
SendMes("From: "+"asd <"+Form1.Edit1.Text+">"+#13+#10);
SendMes("Subject: "+Form1.Edit4.Text+#13+#10);

{SendMes(#13+#10+Form1.Memo1.Text+#13+#10+#13+#10);}
Boundary:=GenerateBoundary;
SendMes("Mime-Version: 1.0"+#13+#10);
SendMes("Content-Type: multipart/mixed; boundary=""+Boundary+"""+#13+#10);
SendMes(#13+#10+"--"+Boundary+#13+#10);
SendMes("Content-Type: text/plain; charset="us-ascii""+#13+#10);
SendMes(#13+#10+Form1.Memo1.Text+#13+#10+#13+#10);

SendMes(#13+#10+"--"+Boundary+#13+#10);
SendMes("Content-Type: text/html; charset="us-ascii""+#13+#10);
SendMes(#13+#10+" <font color=#FF0000>"+Form1.Memo1.Text+"</font>"+#13+#10+#13+#10);


SendMes("--"+Boundary+#13+#10);
SendMes("Content-Type: application/octet-stream; name="attach.txt""+#13+#10);
//SendMes("Content-Type: text/plain; name="attach.txt""+#13+#10);
SendMes("Content-Transfer-Encoding: base64"+#13+#10);
SendMes("Content-Disposition: attachment; filename="attach.txt""+#13+#10);
base64string:=Q_Base64Encode(Pointer(Form1.Memo1.Text),length(Form1.Memo1.Text));

SendMes(#13+#10+base64string+#13+#10);

SendMes("--"+Boundary+"--"+#13+#10);
SendMes(#13+#10+"."+#13+#10);
recv(SMTPsock,recvBuf,sizeof(recvBuf),0);
SendMes("QUIT"+#13+#10);
recv(SMTPsock,recvBuf,sizeof(recvBuf),0);
end;
closesocket(SMTPsock);
end;
WSACleanup();
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
sendmail;
end;

end.


Исходник кодирования Base64 не привожу, ибо про аттач не спрашивалось. Токмо закоменти строки, отсылающие аттач.


madcap   (2002-08-21 01:32:00) [5]

>Sour
Если у тебя получится скинь примерчик
madcap@web-com-ua.com


madcap   (2002-08-21 01:30:00) [6]

Мне тоже это надо было, но ответа я не получил
зато нашел пример на Си, но перевести на Delphi несмог
void SendMail(void)
{
SOCKET nSMTPServerSocket;
struct sockaddr_in smtp_address;
int nConnect;
int iLength;
int iMsg = 0;
int iEnd = 0;
BYTE sBuf[4096];

char *MailMessage[] =
{
"HELO axel.ru\r\n",
"MAIL FROM:\r\n", // адрес отправителя
"RCPT TO:\r\n", // адресок получателя
"DATA\r\n",
"Самое крутое сообщение!!!\r\n\r\n.\r\n", // тело сообщения
"QUIT\r\n",
NULL
};

nSMTPServerSocket = socket(PF_INET, SOCK_STREAM, 0);

if(nSMTPServerSocket != INVALID_SOCKET) {
smtp_address.sin_family = AF_INET;
// далее вносим в структуру IP-адрес сервера, через который пойдёт письмо
smtp_address.sin_addr.s_addr = inet_addr("212.96.192.1");
smtp_address.sin_port = htons(25);

nConnect = connect(nSMTPServerSocket, (PSOCKADDR)&smtp_address,
sizeof(smtp_address));

if(nConnect) {
}
else {
do {
iLength = recv(nSMTPServerSocket, (LPSTR)sBuf+iEnd, sizeof(sBuf)-iEnd, 0);
iEnd += iLength;
sBuf[iEnd] = "\0! ";
send(nSMTPServerSocket, (LPSTR)MailMessage[iMsg], strlen(MailMessage[iMsg]), 0);
iMsg++;
} while(MailMessage[iMsg]);
}

closesocket(nSMTPServerSocket);
}
}


VID   (2002-08-20 21:16:00) [7]

>Digitman: да, ладно, я ж пошутил.. настроение такое было :)


Digitman   (2002-08-20 10:49:00) [8]

>VID

1. "Хорошая сказка" начинается с scktcomp.pas
2. Если это в мой адрес, скажу лишь, что в твоих комментариях, сударь, я не нуждаюсь.


VID   (2002-08-20 09:55:00) [9]


> Digitman © (19.08.02 13:22)
> А как это делает TClientSocket на том же самом WinsockAPI,
> надо понимать, тебе недосуг разобраться ?


Да, да... распечатай листинг кода модуля winsock.pas и читай перед сном, как хорошую сказу ;)


Digitman   (2002-08-19 13:22:00) [10]

А как это делает TClientSocket на том же самом WinsockAPI, надо понимать, тебе недосуг разобраться ?


Sour   (2002-08-19 12:39:00) [11]

Мне все это дело надо реализовать БЕЗ VCL!!!!!!
Хочу на API...


Digitman   (2002-08-19 12:30:00) [12]

Чем не устраивает TClientSocket ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо