отправка писем на winsock

Тема в разделе "WASM.WIN32", создана пользователем seiko, 28 дек 2008.

  1. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    хочу отправить письмо на mail.ru а сервер не отвечает
    код функции такой

    WSAStartUp и CleanUp происходят в самой программе (там с помощью GetHostByName получаем ссылку на массив PInAddr, первый элемент которого преобразовываем inet_ntoa и результат в нижеописанную ф-ию)
    функция не моя, впадлу было долго разбираться с самим протоколом
    в smtp - нулевой ipшник из массива ip 'smtp.mail.ru', порт 25 или 2525,
    в from и dest - реально существующие мыла (ксати ведь можно же отправить письмо самому себе от самого себя)

    Код (Text):
    1. function mail(smtp: PChar; port: integer; from, dest, subject,
    2.   body: string): bool;
    3. const
    4.   cl = #13#10;
    5. var
    6.   Host: TSockAddrIn;
    7.   Sock: TSocket;
    8.   res: Integer;
    9.  
    10.   { îòïðàâëÿåì äàííûå ÷åðåç ñîêåò }
    11.   procedure senddata(str: string);
    12.   var
    13.     i: integer;
    14.   begin
    15.     for i := 1 to Length(str) do
    16.   ///зачем каждую букву отправлять отдельным пакетом, так положено?
    17.       if send(Sock, str[i], 1, 0) = SOCKET_ERROR then
    18.         exit;
    19.   end;
    20.  
    21.   { ïîëó÷àåì îòâåò îò êîìàíäû }
    22.   function recvdata(accept: string): bool;
    23.   var
    24.     buff: array[1..255] of Char;
    25.     ///почему от 1 до 255, тогда уж до 256 если уж от нуля,
    26.     ///это ж не паскаль, в дельфе же нормальные строки
    27.   begin
    28.     res := recv(Sock, buff, SizeOf(buff), 0);
    29.     Result := (Res = SOCKET_ERROR) or (Copy(buff, 1, 3) = accept);
    30.   end;
    31.  
    32. begin
    33.   try
    34.     result := false;
    35.     { èíèöèàëèçàöèÿ ñîêåòà }
    36.     Sock := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
    37.     if Sock = INVALID_SOCKET then
    38.       exit;
    39.  
    40.     { óñòàíàâëèâàåì õîñò è ïîðò ñåðâåðà }
    41.     res := inet_addr(smtp);
    42.     if res <= 0 then
    43.       exit;
    44.  
    45.     Host.sin_family := AF_INET;
    46.     Host.sin_port := htons(port);
    47.     Host.sin_addr.S_addr := res;
    48.  
    49.     { ïîäêëþ÷àåìñÿ ê ñåðâåðó }
    50.     if connect(Sock, @Host, SizeOf(Host)) > 0 then
    51.       exit;
    52.  
    53.     { ïðèâåòñòâèå ñåðâåðà }
    54.     if not recvdata('220') then
    55.       exit;
    56.  
    57.     { EHLO }
    58.     senddata('EHLO' + cl);
    59.     if not recvdata('250') then
    60.       exit; ////вот здесь и выходит
    61.  
    62.     { MAIL FROM: }
    63.     senddata('MAIL FROM:' + from + cl);
    64.     if not recvdata('250') then
    65.       exit;
    66.  
    67.     { RCPT TO: }
    68.     senddata('RCPT TO:' + dest + cl);
    69.     if not recvdata('250') then
    70.       exit;
    71.  
    72.     { DATA }
    73.     senddata('DATA' + cl);
    74.     if not recvdata('354') then
    75.       exit;
    76.  
    77.     { îòïðàâëÿåì òåêñò ñîîáùåíèÿ }
    78.     senddata('Subject:' + subject + cl + cl + body + cl + '.');
    79.     if not recvdata('250') then
    80.       exit;
    81.  
    82.     { îòêëþ÷àåìñÿ îò ñåðâåðà }
    83.     senddata('QUIT' + cl);
    84.  
    85.     result := true;
    86.   finally
    87.     { óáèâàåì ñîêåò }
    88.     closesocket(sock);
    89.   end;
    90. end;
    подскажите что не так
     
  2. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    seiko

    а почему EHLO, если нужно HELO?
     
  3. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    irrona
    есть в SMTP и EHLO, разницу не помню, знаю только, что EHLO более круто :)

    seiko
    Что сервер отвечает после EHLO?
    Учти, что без авторизации SMTP у тебя работать вряд ли будет...
     
  4. gh05t

    gh05t New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2008
    Сообщения:
    34
    seiko
    Ставишь бряки после каждой передачи/приема и смотришь, на какой команде SMTP-сервер перестает отвечать. А потом сниффер в руки и смотри, что ты не так отправляешь.
    Ну и авторизацию добавь.

    http://www.wasm.ru/article.php?article=1016002
     
  5. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    добавил имя сервера при отправке приветствия
    Код (Text):
    1. senddata('EHLO' + string(smtp) + cl);
    при отправке с упоминанем отправителя например с яндекса при RCPT TO: получаю - not local sender over smpt(ну это потому что надо было наверное сервер яндекса указывать). При отправке с упоминанием отправителя с мейла на DATA требует авторизацию.
    а как авторизоваться программно? я не в курсе
     
  6. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Тут придется поразбираться с протоколом SMTP

    PS и вобще, на кой хрен кому (кроме спамеров) еще нужен этот email ?
     
  7. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    вот тебе моя консольная программа, написанная на masm. разбирайся.
     
  8. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    че-то мне вин рар твердит что unexpected end of file (of archive) на acm модуле, версия винрара 3.7
     
  9. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    seiko
    здесь аттачи не докачиваются
     
  10. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    хереново. давай мыло. скину.
     
  11. _Oleg_

    _Oleg_ New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2008
    Сообщения:
    3
    senddata('EHLO' + string(smtp) + cl);

    где пробел после ХЕЛО? имя хоста не обязательно, пиши HELO asd\r\n
     
  12. seiko

    seiko New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    98
    ася - 463684255
     
  13. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    irrona А исходник вообще рабочий ? У меня он не заработал , это не то что камень в ваш огород , просто действительно у меня ни один исходник майлсендера не работает. Даже мой старый написанный мной , суперский был , почему более не отправляет почту ни на один почтовый сервак. Тема обсуждалась , типо вам не разрешено отправлять емайлы , я менял ип , менял компы ))) но без толку. Я поэтому и спрашиваю , он проверен ? Работает ?
     
  14. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    Вот, если Freeman не против :)
    http://frmn.org.ua/artc/smtp.html

    Хватит уже деградировать, возмите мля сниффер и посмотрите, что там у вас отправляется, что нет и почему...
     
  15. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    исходник ироны точно не работает , падете даже под олей , ошибок куча судя по сообщениям оли. Снифер не всегда помогает ...
     
  16. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    С параметрами не падает. Прошу прощения за ошибки в разборе параметров. Теперь должно работать.
     
  17. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    irrona проверено на майл ру ? ...
     
  18. ares

    ares New Member

    Публикаций:
    0
    Регистрация:
    22 ноя 2008
    Сообщения:
    20
    а потом открывая ящик с горой спама думаете про себя "ё##№ные спамеры" :)
     
  19. calidus

    calidus Member

    Публикаций:
    0
    Регистрация:
    27 дек 2005
    Сообщения:
    618
    =) я скорее мучаюсь что не могу вообще ни одно письма отправить ни с одного сервиса майл ру рамблер и другие. Сервисная служба отвечает какуюто фигню , такое чувство что там одни идиоты. Нахера тогда почта которая нихрена не работает ?

    вот что пишет у меня

    SimpleMail, version 1.0, Copyright (C) 2005 Roman Panyshev
    mailto: ironahot@idknet.com
    WWW: http://www.ironahot.idknet.com

    Connecting to server: smtp.mail.ru
    SMTP server was not found
     
  20. irrona

    irrona Member

    Публикаций:
    0
    Регистрация:
    26 май 2004
    Сообщения:
    178
    Адрес:
    Тирасполь
    calidus

    Инициатива наказуема, не так ли? :)) Первоначальный посыл был в том, чтобы показать пример отправки писем на порт 25 (SMTP по-умолчанию).

    Скорее всего письма не отправляются из-за требований сервером mail.ru авторизации. Я писал прогу для использования в интрасети организации, где установлен почтовый сервер (кажется CommuniGate Pro). Попробуй отправку с сервера, который не требует авторизации.