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

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

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

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

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

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

хочу отправить письмо на mail.ru а сервер не отвечает
код функции такой

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

Код:
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; 
    ///почему от 1 до 255, тогда уж до 256 если уж от нуля, 
    ///это ж не паскаль, в дельфе же нормальные строки
  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' + 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;

    { îòïðàâëÿåì òåêñò ñîîáùåíèÿ }
    senddata('Subject:' + subject + cl + cl + body + cl + '.');
    if not recvdata('250') then
      exit;

    { îòêëþ÷àåìñÿ îò ñåðâåðà }
    senddata('QUIT' + cl);

    result := true;
  finally
    { óáèâàåì ñîêåò }
    closesocket(sock);
  end;
end;
подскажите что не так
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Старый 28.12.2008, 18:29   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

эта тема больше подходит разделу "Работа с сетью в Delphi"
rpy3uH вне форума Ответить с цитированием
Старый 29.12.2008, 14:25   #3
joker
Форумчанин
 
Регистрация: 23.09.2007
Сообщений: 147
По умолчанию

2 Грузин:
ну как бы винсок как и WinApi везде одинаковый - не очень понимаю причем тут дельфи

добавил имя сервера при отправке приветствия

Код:
senddata('EHLO' + string(smtp) + cl);
при отправке с упоминанем отправителя например с яндекса при RCPT TO: получаю - not local sender over smpt(ну это потому что надо было адрес сервера яндекса указывать. При отправке с упоминанием отправителя с мейла на DATA требует авторизацию.
а как авторизоваться программно? я не в курсе
Я надеваю тапочки, ищу чем похмелиться, ах, если я сейчас умру, то на... я родился
joker вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кодировка писем NoName_emaNoN Работа с сетью в Delphi 46 10.02.2009 12:36
mailto для отправки писем PHP vs HTML delphin100 HTML и CSS 4 10.09.2008 06:27
Проблемы с кодировкой писем Черничный Win Api 7 16.06.2008 12:19
MS Excel и MS Outlook (2003) отсылка писем IceB Microsoft Office Excel 1 02.07.2007 13:32
Microsoft Office Outlook : отправка писем gaybiza Софт 1 18.11.2006 00:14