Пытаюсь отправить почту. Вроде все делаю правильно, но не работает.
| Код | 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 сервера, так что это не проблема Кто чем сможет поможите плз... |