Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2009, 10:46   #1
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию отправка письма

Вот код отправки письма при отправке логина кодированного base64
(письмо отправляется на mail.ru) smtp-сервер долго ниче не отвечает
(прога ждет) потом присылает в ответе "421 ... SMTP command timeout - closing connection", причем WSAGetLastError возвращает ноль, то есть ошибок при отправке и доставке не было. В чем может быть дело?

Код:
program mailled;

uses
  windows,
  winsock2;

type
 TaPInAddr = Array [0..10] of PInAddr;
 PaPInAddr = ^TaPInAddr;

const
Codes64 = 
'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/';

var Host: PHostEnt; pptr: PaPInAddr; WSAData: TWSAData;

function Encode64(S: string): string;
var i,a,x,b: integer;
begin
  result := '';
  a := 0;
  b := 0;
  for i := 1 to Length(s) do
    begin
      x := Ord(s[i]);
      b := b * 256 + x;
      a := a + 8;
      while a >= 6 do
        begin
          a := a - 6;
          x := b div (1 shl a);
          b := b mod (1 shl a);
          result := result + Codes64[x + 1];
        end;
    end;
  if a > 0 then
    begin
      x := b shl (6 - a);
      result := result + Codes64[x + 1];
    end;
end;

function mail(smtp: PChar; port: integer; from, dest, subject,body: string): bool;
const
 cl = #13#10;
var
  Host: TSockAddrIn;
  Sock: TSocket;
  res: Integer;
  { отправляем данные через сокет }
    procedure senddata(str: string);
    var i: integer;
    begin
      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
      res := recv(Sock, buff, SizeOf(buff), 0);
      Result := (Res = SOCKET_ERROR) or (Copy(buff, 1, 3) = accept);
    end;

begin
  try
    result := false;
    { инициализация сокета }
    Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    if Sock = INVALID_SOCKET then exit;
    { устанавливаем хост и порт сервера }
    res := inet_addr(smtp);
    if res <= 0 then
      exit;
    Host.sin_family := AF_INET;
    Host.sin_port := htons(port);
    Host.sin_addr.S_addr := res;
    { подключаемся к серверу }
    if connect(Sock, @Host, SizeOf(Host)) > 0 then exit;
    { приветствие сервера }
    if not recvdata('220') then exit;
    { EHLO }
    senddata('EHLO' + string(smtp) + cl);
    if not recvdata('250') then exit;
    { AUTH LOGIN }
    senddata('AUTH LOGIN' {+ string(smtp)} + cl);
    if not recvdata('334') then exit;
    { LOGIN }
    senddata(encode64('<login>'));
    if not recvdata('334') then exit;
    ///вот здесь получаю 421 и типа таймаут от сервера}
    { PASSWORD }
    senddata(encode64('<password>'));
    if not recvdata('235') 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;
    { отправляем текст сообщения }
    senddata('Subject:' + subject + cl + cl + body + cl + '.');
    if not recvdata('250') then exit;
    { отключаемся от сервера }
    senddata('QUIT' + cl);
    result := true;
  finally
    { убиваем сокет }
    closesocket(sock);
  end;
end;

begin
  if WSAStartUp(257, WSAData) <> 0 then exit;
  host := GetHostByName('smtp.mail.ru');
  if host = nil then
    begin
      WSACleanup;
      halt;
    end;
  pPtr := PaPInAddr(host^.h_addr_list);
  if pPtr <> nil then
  mail(inet_ntoa(pPtr^[0]^),25,'...@mail.ru','...@list.ru',
    'Automatic sending','Hello, I am the machine');
  WSACleanup;
end.
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился

Последний раз редактировалось joker; 14.02.2009 в 10:49.
joker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Форматирование письма OUTLOOK'а oTyler Microsoft Office Excel 0 28.07.2008 14:49
Отправка письма Ксеноцид PHP 1 07.05.2008 15:57
Отправка письма с помощью TidSmtp... Teen4jump Работа с сетью в Delphi 8 31.08.2007 01:12