Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Работа с почтой


Автор: Гость_Felt 7.11.2004, 16:16
Пытаюсь отправить почту. Вроде все делаю правильно, но не работает.
Код

function mail(smtp: string; port: integer; from, dest, subject,
 body: string): bool;
const
 cl = #13#10;
var
WSAData: TWSAData;
 Host: TSockAddrIn;
 Sock: TSocket;
 res: Integer;
 buff: array[1..255] of Char;

 { отправляем данные через сокет }
 procedure senddata(str: string);
 var
   i: integer;
 begin
   Form1.ComboBox1.Items.Add('Отправляем данные через сокет');
   for i := 1 to Length(str) do
     if send(Sock, str[i], 1, 0) = SOCKET_ERROR then
       exit;
 end;

 { получаем ответ от команды }
 function recvdata(accept: string): bool;
 var
   buff: array[1..255] of Char;
 begin
   Form1.ComboBox1.Items.Add('Получаем ответ от команды');
   res := recv(Sock, buff, SizeOf(buff), 0);
   Result := (Res = SOCKET_ERROR) or (Copy(buff, 1, 3) = accept);
 end;

begin
 try
   result := false;
   { инициализация сокета }
   Form1.ComboBox1.Items.Add('Инициализация сокета');
   WSAStartUp(257, WSAData);
   Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
   if Sock = INVALID_SOCKET then
     Exit;

   { устанавливаем хост и порт сервера }
   Form1.ComboBox1.Items.Add('Устанавливаем хост и порт сервера');
   res := inet_addr(PChar(smtp));
   if res <= 0 then
     exit;

   Host.sin_family := AF_INET;
   Host.sin_port := htons(port);
   Host.sin_addr.S_addr := res;

   { подключаемся к серверу }
   Form1.ComboBox1.Items.Add('Подключаемся к серверу');
   if connect(Sock, Host, SizeOf(Host)) > 0 then
     Exit;

   { приветствие сервера }
   Form1.ComboBox1.Items.Add('Приветствие сервера');
   if not recvdata('220') then
     Exit;

   { EHLO }
   senddata('EHLO' + cl);
   if not recvdata('250') then
     Exit;

   { MAIL FROM: }
   senddata('MAIL FROM:' + from + cl);
   if not recvdata('250') then
     Exit;

   { RCPT TO: }
   senddata('RCPT TO:' + dest + cl);
   if not recvdata('250') then
     Exit;

   { DATA }
   senddata('DATA' + cl);
   if not recvdata('354') then
     Exit;

   { отправляем текст сообщения }
   Form1.ComboBox1.Items.Add('Отправляем текст сообщения');
   senddata('Subject:' + subject + cl + cl + body + cl + '.');
   if not recvdata('250') then
     Exit;

   { отключаемся от сервера }
   Form1.ComboBox1.Items.Add('Отключаемся от сервера');
   senddata('QUIT' + cl);

   result := true;
 finally
   { убиваем сокет }
   Form1.ComboBox1.Items.Add('Убиваем сокет');
   closesocket(sock);
   WSACleanup;
 end;
end;

...

procedure TForm1.Button1Click(Sender: TObject);
begin
ComboBox1.Items.Clear;
if Mail(Edit1.Text, StrToInt(Edit2.Text), Edit3.Text, Edit4.Text, Edit5.Text, Memo1.Text) then
ShowMessage('Отправлено')
else
ShowMessage('Не отправлено');
end;


// В Edit1.Text smtp адрес 194.67.23.111
// В Edit2.Text порт 25
// Edit3.Text отправитель [email protected]
// Edit4.Text получатель [email protected]
// Edit5.Text тема письма Hello World
// Memo1.Text сам текст письма

Можно отправлять почту и с другого удобного smtp сервера, так что это не проблема
Кто чем сможет поможите плз...

Автор: Vit 8.11.2004, 21:41
SMTP переменная содержит IP адрес сервера?

Автор: Гость_Felt 9.11.2004, 04:47
Ну да, в виде 194.67.23.111

Автор: p0s0l 9.11.2004, 19:46
Цитата
  senddata('EHLO' + cl);

Тут надо не "EHLO", а "HELO" (привет! smile), причём, указывать имя отправителя:
Код
   senddata('HELO Felt' + cl);

Если так сделать, уходит до отсылки самого сообщения
Неправильно имхо само body отправляется...
Глянь сюда, поразбирайся:
http://weblogs.asp.net/dwanta/archive/2003/07/09/9883.aspx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)